163 lines · c
1// RUN: %clang_cc1 -fsyntax-only -verify %s -DNONE -Wno-gnu2// RUN: %clang_cc1 -fsyntax-only -verify %s -DALL -Wgnu3// RUN: %clang_cc1 -fsyntax-only -verify %s -DALL -Wno-gnu \4// RUN: -Wgnu-alignof-expression -Wgnu-complex-integer -Wgnu-conditional-omitted-operand \5// RUN: -Wgnu-label-as-value -Wgnu-statement-expression \6// RUN: -Wgnu-compound-literal-initializer -Wgnu-flexible-array-initializer \7// RUN: -Wgnu-redeclared-enum -Wgnu-folding-constant -Wgnu-empty-struct \8// RUN: -Wgnu-union-cast -Wgnu-variable-sized-type-not-at-end9// RUN: %clang_cc1 -fsyntax-only -verify %s -DNONE -Wgnu \10// RUN: -Wno-gnu-alignof-expression -Wno-gnu-complex-integer -Wno-gnu-conditional-omitted-operand \11// RUN: -Wno-gnu-label-as-value -Wno-gnu-statement-expression \12// RUN: -Wno-gnu-compound-literal-initializer -Wno-gnu-flexible-array-initializer \13// RUN: -Wno-gnu-redeclared-enum -Wno-gnu-folding-constant -Wno-gnu-empty-struct \14// RUN: -Wno-gnu-union-cast -Wno-gnu-variable-sized-type-not-at-end15// Additional disabled tests:16// %clang_cc1 -fsyntax-only -verify %s -DALIGNOF -Wno-gnu -Wgnu-alignof-expression17// %clang_cc1 -fsyntax-only -verify %s -DCOMPLEXINT -Wno-gnu -Wgnu-complex-integer18// %clang_cc1 -fsyntax-only -verify %s -DOMITTEDOPERAND -Wno-gnu -Wgnu-conditional-omitted-operand19// %clang_cc1 -fsyntax-only -verify %s -DLABELVALUE -Wno-gnu -Wgnu-label-as-value20// %clang_cc1 -fsyntax-only -verify %s -DSTATEMENTEXP -Wno-gnu -Wgnu-statement-expression21// %clang_cc1 -fsyntax-only -verify %s -DSTATEMENTEXPMACRO -Wno-gnu -Wgnu-statement-expression-from-macro-expansion22// %clang_cc1 -fsyntax-only -verify %s -DCOMPOUNDLITERALINITIALIZER -Wno-gnu -Wgnu-compound-literal-initializer23// %clang_cc1 -fsyntax-only -verify %s -DFLEXIBLEARRAYINITIALIZER -Wno-gnu -Wgnu-flexible-array-initializer24// %clang_cc1 -fsyntax-only -verify %s -DREDECLAREDENUM -Wno-gnu -Wgnu-redeclared-enum25// %clang_cc1 -fsyntax-only -verify %s -DUNIONCAST -Wno-gnu -Wgnu-union-cast26// %clang_cc1 -fsyntax-only -verify %s -DVARIABLESIZEDTYPENOTATEND -Wno-gnu -Wgnu-variable-sized-type-not-at-end27// %clang_cc1 -fsyntax-only -verify %s -DFOLDINGCONSTANT -Wno-gnu -Wgnu-folding-constant28// %clang_cc1 -fsyntax-only -verify %s -DEMPTYSTRUCT -Wno-gnu -Wgnu-empty-struct29 30#if NONE31// expected-no-diagnostics32#endif33 34 35#if ALL || ALIGNOF36// expected-warning@+4 {{'_Alignof' applied to an expression is a GNU extension}}37#endif38 39char align;40_Static_assert(_Alignof(align) > 0, "align's alignment is wrong");41 42 43#if ALL || COMPLEXINT44// expected-warning@+3 {{complex integer types are a GNU extension}}45#endif46 47_Complex short int complexint;48 49 50#if ALL || OMITTEDOPERAND51// expected-warning@+3 {{use of GNU ?: conditional expression extension, omitting middle operand}}52#endif53 54static const char* omittedoperand = (const char*)0 ?: "Null";55 56 57#if ALL || LABELVALUE58// expected-warning@+6 {{use of GNU address-of-label extension}}59// expected-warning@+7 {{use of GNU indirect-goto extension}}60#endif61 62void labelvalue(void) {63 void *ptr;64 ptr = &&foo;65foo:66 goto *ptr;67}68 69 70#if ALL || STATEMENTEXP71// expected-warning@+5 {{use of GNU statement expression extension}}72#endif73 74void statementexp(void)75{76 int a = ({ 1; });77}78 79#if ALL || STATEMENTEXP || STATEMENTEXPMACRO80// expected-warning@+5 {{use of GNU statement expression extension from macro expansion}}81#endif82 83#define STMT_EXPR_MACRO(a) ({ (a); })84void statementexprmacro(void) {85 int a = STMT_EXPR_MACRO(1);86}87 88#if ALL || COMPOUNDLITERALINITIALIZER89// expected-warning@+4 {{initialization of an array of type 'int[5]' from a compound literal of type 'int[5]' is a GNU extension}}90#endif91 92typedef int int5[5];93int cli[5] = (int[]){1, 2, 3, 4, 5};94 95 96#if ALL || FLEXIBLEARRAYINITIALIZER97// expected-note@+6 {{initialized flexible array member 'y' is here}}98// expected-warning@+6 {{flexible array initialization is a GNU extension}}99#endif100 101struct fai {102 int x;103 int y[];104} fai = { 1, { 2, 3, 4 } };105 106 107#if ALL || FOLDINGCONSTANT108// expected-warning@+5 {{expression is not an integer constant expression; folding it to a constant is a GNU extension}}109// expected-warning@+7 {{variable length array folded to constant array as an extension}}110#endif111 112enum {113 fic = (int)(0.75 * 1000 * 1000)114};115static const int size = 100;116int data[size];117 118void foo(void) { int data[size]; } // OK, always a VLA119 120#if ALL || REDECLAREDENUM121// expected-note@+4 {{previous definition is here}}122// expected-warning@+8 {{redeclaration of already-defined enum 'RE' is a GNU extension}}123#endif124 125enum RE {126 Val1,127 Val2128};129 130enum RE;131 132 133#if ALL || UNIONCAST134// expected-warning@+4 {{cast to union type is a GNU extension}}135#endif136 137union uc { int i; unsigned : 3; };138union uc w = (union uc)2;139 140 141#if ALL || VARIABLESIZEDTYPENOTATEND142// expected-warning@+8 {{field 'hdr' with variable sized type 'struct vst' not at the end of a struct or class is a GNU extension}}143#endif144 145struct vst {146 short tag_type;147 char tag_data[];148};149struct vstnae {150 struct vst hdr;151 char data;152};153 154 155#if ALL || EMPTYSTRUCT156// expected-warning@+4 {{empty struct is a GNU extension}}157// expected-warning@+4 {{struct without named members is a GNU extension}}158#endif159 160const struct {} es;161struct {int:5;} swnm;162 163