struct-decl.c revision 6bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89
1// RUN: %clang_cc1 -fsyntax-only -verify %s
2// PR3459
3struct bar {
4  char n[1];
5};
6
7struct foo {
8  char name[(int)&((struct bar *)0)->n];
9  char name2[(int)&((struct bar *)0)->n - 1]; //expected-error{{'name2' declared as an array with a negative size}}
10};
11
12// PR3430
13struct s {
14  struct st {
15    int v;
16  } *ts;
17};
18
19struct st;
20
21int foo() {
22  struct st *f;
23  return f->v + f[0].v;
24}
25
26// PR3642, PR3671
27struct pppoe_tag {
28 short tag_type;
29 char tag_data[];
30};
31struct 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
38struct s0 {
39  char a;  // expected-note {{previous declaration is here}}
40  char a;  // expected-error {{duplicate member 'a'}}
41};
42
43struct s0 f0(void) {}
44
45// <rdar://problem/8177927> - This previously triggered an assertion failure.
46struct x0 {
47  unsigned int x1;
48};
49
50// rdar://problem/9150338
51static struct test1 { // expected-warning {{'static' ignored on this declaration}}
52  int x;
53};
54const struct test2 { // expected-warning {{'const' ignored on this declaration}}
55  int x;
56};
57inline struct test3 { // expected-error {{'inline' can only appear on functions}}
58  int x;
59};
60
61struct hiding_1 {};
62struct hiding_2 {};
63void test_hiding() {
64  struct hiding_1 *hiding_1();
65  extern struct hiding_2 *hiding_2;
66  struct hiding_1 *p = hiding_1();
67  struct hiding_2 *q = hiding_2;
68}
69
70struct PreserveAttributes {};
71typedef struct __attribute__((noreturn)) PreserveAttributes PreserveAttributes_t; // expected-warning {{'noreturn' attribute only applies to functions and methods}}
72