/* { dg-additional-options "-fno-analyzer-suppress-followups" } */

#include <stdio.h>

struct test {
        int one;
        int two;
};

void func2(const struct test *t)
{
        if (t->one == 0)
                printf("init func2\n");

        if (t->two == 0)  /* { dg-warning "uninitialized" } */
                printf("uninit func2\n");
}

void func1(struct test *t)
{
        t->one = 1;
        func2(t);
}

int func3(int num)
{
        if (num)
                return num;
        else
                return 0;
}

void func4(int *a, int max)
{
        int i;
        // skip the first
        for (i=1; i<max; i++)
                a[i] = 0;
}

void func5(const int *a, int max)
{
        /* a[0] is uninitialized, but the rest of the array is initialized.  */
        int i;
        for (i=0; i<max; i++) {
                if (a[i]) /* { dg-warning "uninitialized" "" { xfail *-*-* } } */
                        printf("func5: %d\n", i);
        }
}

int func6(const int *num)
{
        if (*num)  /* { dg-warning "uninitialized" } */
                return *num;  /* { dg-warning "uninitialized" } */
        else
                return 0;
}

int j;
int func7(void)
{
        return j;  /* { dg-bogus "uninitialized" } */
}

void func8(const int *a, int max)
{
        int i;
        for (i=0; i<max; i++) {
                if (a[i]) /* { dg-warning "uninitialized" } */
                        printf("func8: %d\n", i);
        }
}

enum {RED, AMBER, GREEN, BLACK};

int main(void)
{
        struct test t;  /* { dg-message "region created on stack here" } */
        int num;  /* { dg-message "region created on stack here" } */
        int arry[10];
        int arry_2[10];  /* { dg-message "region created on stack here" } */
        int go;  /* { dg-message "region created on stack here" } */
        int color = BLACK;

        func1(&t);
        func3(num);  /* { dg-warning "use of uninitialized value 'num'" } */
        func4(arry, 10);
        func5(arry, 10);
        func6(&num);

        printf("num: %d\n", num);  /* { dg-warning "use of uninitialized value 'num'" } */
        printf("func7: %d\n", func7());
        func8(arry_2, 10);

        switch (color) {
        case RED:
        case AMBER:
                go = 0;
                break;
        case GREEN:
                go = 1;
                break;
        }

        printf("go :%d\n", go); /* { dg-warning "use of uninitialized value 'go'" } */

        return 0;
}