xref: /llvm-project/clang/test/Sema/struct-decl.c (revision 0f1c1be1968076d6f96f8a7bcc4a15cf195ecd97)
1 // RUN: %clang_cc1 -Wno-pointer-to-int-cast -fsyntax-only -verify %s
2 // PR3459
3 struct bar {
4   char n[1];
5 };
6 
7 struct foo {
8   char name[(int)&((struct bar *)0)->n]; // expected-warning {{folded to constant}}
9   char name2[(int)&((struct bar *)0)->n - 1]; // expected-error {{array size is negative}}
10 };
11 
12 // PR3430
13 struct s {
14   struct st {
15     int v;
16   } *ts;
17 };
18 
19 struct st;
20 
foo(void)21 int foo(void) {
22   struct st *f;
23   return f->v + f[0].v;
24 }
25 
26 // PR3642, PR3671
27 struct pppoe_tag {
28  short tag_type;
29  char tag_data[];
30 };
31 struct datatag {
32   struct pppoe_tag hdr; //expected-warning{{field 'hdr' with variable sized type 'struct pppoe_tag' not at the end of a struct or class is a GNU extension}}
33   char data;
34 };
35 
36 
37 // PR4092
38 struct s0 {
39   char a;  // expected-note {{previous declaration is here}}
40   char a;  // expected-error {{duplicate member 'a'}}
41 };
42 
f0(void)43 struct s0 f0(void) {}
44 
45 // This previously triggered an assertion failure.
46 struct x0 {
47   unsigned int x1;
48 };
49 
50 static struct test1 { // expected-warning {{'static' ignored on this declaration}}
51   int x;
52 };
53 const struct test2 { // expected-warning {{'const' ignored on this declaration}}
54   int x;
55 };
56 inline struct test3 { // expected-error {{'inline' can only appear on functions}}
57   int x;
58 };
59 
60 struct hiding_1 {};
61 struct hiding_2 {};
test_hiding(void)62 void test_hiding(void) {
63   struct hiding_1 *hiding_1(void);
64   extern struct hiding_2 *hiding_2;
65   struct hiding_1 *p = hiding_1();
66   struct hiding_2 *q = hiding_2;
67 }
68 
69 struct PreserveAttributes {};
70 typedef struct __attribute__((noreturn)) PreserveAttributes PreserveAttributes_t; // expected-warning {{'noreturn' attribute only applies to functions and methods}}
71 
72 // PR46255
73 struct FlexibleArrayMem {
74   int a;
75   int b[];
76 };
77 
78 struct FollowedByNamed {
79   struct FlexibleArrayMem a; // expected-warning {{field 'a' with variable sized type 'struct FlexibleArrayMem' not at the end of a struct or class is a GNU extension}}
80   int i;
81 };
82 
83 struct FollowedByUnNamed {
84   struct FlexibleArrayMem a; // expected-warning {{field 'a' with variable sized type 'struct FlexibleArrayMem' not at the end of a struct or class is a GNU extension}}
85   struct {
86     int i;
87   };
88 };
89 
90 struct InAnonymous {
91   struct { // expected-warning-re {{field '' with variable sized type 'struct InAnonymous::(anonymous at {{.+}})' not at the end of a struct or class is a GNU extension}}
92 
93     struct FlexibleArrayMem a;
94   };
95   int i;
96 };
97 struct InAnonymousFollowedByAnon {
98   struct { // expected-warning-re {{field '' with variable sized type 'struct InAnonymousFollowedByAnon::(anonymous at {{.+}})' not at the end of a struct or class is a GNU extension}}
99 
100     struct FlexibleArrayMem a;
101   };
102   struct {
103     int i;
104   };
105 };
106 
107 // This is the behavior in C++ as well, so making sure we reproduce it here.
108 struct InAnonymousFollowedByEmpty {
109   struct FlexibleArrayMem a; // expected-warning {{field 'a' with variable sized type 'struct FlexibleArrayMem' not at the end of a struct or class is a GNU extension}}
110   struct {};
111 };
112