forked from OSchip/llvm-project
113 lines
2.9 KiB
C
113 lines
2.9 KiB
C
// RUN: %clang_cc1 -Wno-pointer-to-int-cast -fsyntax-only -verify %s
|
|
// PR3459
|
|
struct bar {
|
|
char n[1];
|
|
};
|
|
|
|
struct foo {
|
|
char name[(int)&((struct bar *)0)->n];
|
|
char name2[(int)&((struct bar *)0)->n - 1]; //expected-error{{'name2' declared as an array with a negative size}}
|
|
};
|
|
|
|
// PR3430
|
|
struct s {
|
|
struct st {
|
|
int v;
|
|
} *ts;
|
|
};
|
|
|
|
struct st;
|
|
|
|
int foo() {
|
|
struct st *f;
|
|
return f->v + f[0].v;
|
|
}
|
|
|
|
// PR3642, PR3671
|
|
struct pppoe_tag {
|
|
short tag_type;
|
|
char tag_data[];
|
|
};
|
|
struct datatag {
|
|
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}}
|
|
char data;
|
|
};
|
|
|
|
|
|
// PR4092
|
|
struct s0 {
|
|
char a; // expected-note {{previous declaration is here}}
|
|
char a; // expected-error {{duplicate member 'a'}}
|
|
};
|
|
|
|
struct s0 f0(void) {}
|
|
|
|
// <rdar://problem/8177927> - This previously triggered an assertion failure.
|
|
struct x0 {
|
|
unsigned int x1;
|
|
};
|
|
|
|
// rdar://problem/9150338
|
|
static struct test1 { // expected-warning {{'static' ignored on this declaration}}
|
|
int x;
|
|
};
|
|
const struct test2 { // expected-warning {{'const' ignored on this declaration}}
|
|
int x;
|
|
};
|
|
inline struct test3 { // expected-error {{'inline' can only appear on functions}}
|
|
int x;
|
|
};
|
|
|
|
struct hiding_1 {};
|
|
struct hiding_2 {};
|
|
void test_hiding() {
|
|
struct hiding_1 *hiding_1();
|
|
extern struct hiding_2 *hiding_2;
|
|
struct hiding_1 *p = hiding_1();
|
|
struct hiding_2 *q = hiding_2;
|
|
}
|
|
|
|
struct PreserveAttributes {};
|
|
typedef struct __attribute__((noreturn)) PreserveAttributes PreserveAttributes_t; // expected-warning {{'noreturn' attribute only applies to functions and methods}}
|
|
|
|
// PR46255
|
|
struct FlexibleArrayMem {
|
|
int a;
|
|
int b[];
|
|
};
|
|
|
|
struct FollowedByNamed {
|
|
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}}
|
|
int i;
|
|
};
|
|
|
|
struct FollowedByUnNamed {
|
|
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}}
|
|
struct {
|
|
int i;
|
|
};
|
|
};
|
|
|
|
struct InAnonymous {
|
|
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}}
|
|
|
|
struct FlexibleArrayMem a;
|
|
};
|
|
int i;
|
|
};
|
|
struct InAnonymousFollowedByAnon {
|
|
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}}
|
|
|
|
struct FlexibleArrayMem a;
|
|
};
|
|
struct {
|
|
int i;
|
|
};
|
|
};
|
|
|
|
// This is the behavior in C++ as well, so making sure we reproduce it here.
|
|
struct InAnonymousFollowedByEmpty {
|
|
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}}
|
|
struct {};
|
|
};
|