brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.1 KiB · 8e7b6ed Raw
89 lines · c
1// RUN: %clang_cc1 -std=c11 -fsyntax-only -Wno-strict-prototypes -Wno-implicit-function-declaration -verify %s2// RUN: %clang_cc1 -std=c99 -pedantic -fsyntax-only -Wno-strict-prototypes -Wno-implicit-function-declaration -verify=expected,ext %s3 4void g(void);5 6void foo(int n) {7  (void) _Generic(0, // ext-warning {{'_Generic' is a C11 extension}}8      struct A: 0, // ext-warning {{incomplete type 'struct A' in a '_Generic' association is a C2y extension}}9      void(): 0,   // expected-error {{type 'void ()' in generic association not an object type}}10      int[n]: 0);  // expected-error {{type 'int[n]' in generic association is a variably modified type}}11 12  (void) _Generic(0, // ext-warning {{'_Generic' is a C11 extension}}13      void (*)():     0,  // expected-note {{compatible type 'void (*)()' specified here}}14      void (*)(void): 0); // expected-error {{type 'void (*)(void)' in generic association compatible with previously specified type 'void (*)()'}}15 16  (void) _Generic((void (*)()) 0, // expected-error {{controlling expression type 'void (*)()' compatible with 2 generic association types}} \17                                  // ext-warning {{'_Generic' is a C11 extension}}18      void (*)(int):  0,  // expected-note {{compatible type 'void (*)(int)' specified here}}19      void (*)(void): 0); // expected-note {{compatible type 'void (*)(void)' specified here}}20 21  (void) _Generic(0, // expected-error {{controlling expression type 'int' not compatible with any generic association type}} \22                     // ext-warning {{'_Generic' is a C11 extension}}23      char: 0, short: 0, long: 0);24 25  int a1[_Generic(0, int: 1, short: 2, float: 3, default: 4) == 1 ? 1 : -1]; // ext-warning {{'_Generic' is a C11 extension}}26  int a2[_Generic(0, default: 1, short: 2, float: 3, int: 4) == 4 ? 1 : -1]; // ext-warning {{'_Generic' is a C11 extension}}27  int a3[_Generic(0L, int: 1, short: 2, float: 3, default: 4) == 4 ? 1 : -1]; // ext-warning {{'_Generic' is a C11 extension}}28  int a4[_Generic(0L, default: 1, short: 2, float: 3, int: 4) == 1 ? 1 : -1]; // ext-warning {{'_Generic' is a C11 extension}}29  int a5[_Generic(0, int: 1, short: 2, float: 3) == 1 ? 1 : -1]; // ext-warning {{'_Generic' is a C11 extension}}30  int a6[_Generic(0, short: 1, float: 2, int: 3) == 3 ? 1 : -1]; // ext-warning {{'_Generic' is a C11 extension}}31 32  int a7[_Generic("test", char *: 1, default: 2) == 1 ? 1 : -1]; // ext-warning {{'_Generic' is a C11 extension}}33  int a8[_Generic(g, void (*)(void): 1, default: 2) == 1 ? 1 : -1]; // ext-warning {{'_Generic' is a C11 extension}}34 35  const int i = 12;36  int a9[_Generic(i, int: 1, default: 2) == 1 ? 1 : -1]; // ext-warning {{'_Generic' is a C11 extension}}37 38  // This is expected to not trigger any diagnostics because the controlling39  // expression is not evaluated.40  (void)_Generic(*(int *)0, int: 1); // ext-warning {{'_Generic' is a C11 extension}}41}42 43int __attribute__((overloadable)) test (int);44double __attribute__((overloadable)) test (double);45char testc(char);46 47void PR30201(void) {48  _Generic(4, char:testc, default:test)(4); // ext-warning {{'_Generic' is a C11 extension}}49}50 51void GH50227(void) {52  // Previously, the controlling expression for the outer _Generic makes it53  // result dependent, and testing whether that controlling expression has side54  // effects would cause a crash.55  _Generic( // ext-warning {{'_Generic' is a C11 extension}}56    n(57      _Generic(n++, int : 0) // expected-error {{cannot increment value of type 'int ()'}} ext-warning {{'_Generic' is a C11 extension}}58    ), int : 0);59}60 61struct Test {62  int i;63};64 65void unreachable_associations(const int i, const struct Test t) {66  _Static_assert( // ext-warning {{'_Static_assert' is a C11 extension}}67    _Generic(i, // ext-warning {{'_Generic' is a C11 extension}}68      const int : 1,    // expected-warning {{due to lvalue conversion of the controlling expression, association of type 'const int' will never be selected because it is qualified}}69      volatile int : 2, // expected-warning {{due to lvalue conversion of the controlling expression, association of type 'volatile int' will never be selected because it is qualified}}70      int[12] : 3,      // expected-warning {{due to lvalue conversion of the controlling expression, association of type 'int[12]' will never be selected because it is of array type}}71      int : 4,72      default : 573    ) == 4, "we had better pick int!");74  _Static_assert( // ext-warning {{'_Static_assert' is a C11 extension}}75    _Generic(t, // ext-warning {{'_Generic' is a C11 extension}}76      struct Test : 1,77      const struct Test : 2, // expected-warning {{due to lvalue conversion of the controlling expression, association of type 'const struct Test' will never be selected because it is qualified}}78      default : 379    ) == 1, "we had better pick struct Test, not const struct Test!"); // C-specific result80}81 82void GH55562(void) {83  // Ensure that you can still define a type within a generic selection84  // association (despite it not being particularly useful).85  (void)_Generic(1, struct S { int a; } : 0, default : 0); // ext-warning {{'_Generic' is a C11 extension}}86  struct S s = { 0 };87  int i = s.a;88}89