aboutsummaryrefslogtreecommitdiff
path: root/testcases/pass.c
blob: bf995acd1adc43552dfb5da6cc78c4ac30ffb011 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
int;
char;
struct {int x;};
/* useless declarations are ok */

int a(int a);
int a(int d);
/* duplicate function declarations are ok */

struct A {int x; int y;} b;

/* struct definitions in parameters is in a local scope
 * subsequent parameter can make use of previous defined struct */

int foo(struct A {int x;} a, struct A b) {
    /* function declaration in local scope is ok */
    int f(char *x);
    /* A is defined in parameters */
    struct A c;
    c.x = 43;
}

void bar() {
    /* struct definition is ok inside a function */
    struct A {int x;};
    struct A a;
    a.x = 1;
    {
        /* the following `A' is different from previous one */
        struct A {int y;};
        struct A b;
        b.y = 2;
    }
}

struct C c;
struct C {
    struct D {
        int x, y;
    } b;
    int c;
    struct D d;
};
struct D d; /* feasible here */

void nonsense() {
    char q;
    (void)q;
    return "yay";
}

int assign() {
    int *a;
    struct {int *x;} b;
    a = b.x;
}

void incomplete() {
    struct E {struct F *f;} e;
}

void delay() {
    struct G *g;
    struct G {int x; };
    g->x = 1;
}

void comma() {
    int a;
    int *b;
    (b++, a++) * 3;
}

int complex_pointer() {
    int (*g(int ***e[10]))();
}

int fp(int a, int b, int c) {
    int (*f)(int a, int b, int c);
    f = ****fp + 1;
    (****f)(1, 2, 3);
    f = &fp + 1;
}

int fc(int fc()) {
    fc(complex_pointer);
}

int incomp(struct I a);

void (*bsd_signal(int sig, void (*func)(int a)))(int b);

void array() {
    int a[(1 + 1 ==  2) * 2];
}

void local_decl() {
    int y = y;
    {
        int x = x;
        int a;
        int b = a = 2;
    }
}

struct Node n;
struct Node {int x, y;} n;
/* global forward declaration is ok */
int again;
int again;

int main() {
    n.x = 1;
    n.y = 2;
}