1 // RUN: %clang_cc1 -fsyntax-only -verify %s 2 3 // rdar: // 8125274 4 static int a16[]; // expected-warning {{tentative array definition assumed to have one element}} 5 f16(void)6void f16(void) { 7 extern int a16[]; 8 } 9 10 11 // PR10013: Scope of extern declarations extend past enclosing block 12 extern int PR10013_x; PR10013(void)13int PR10013(void) { 14 int *PR10013_x = 0; 15 { 16 extern int PR10013_x; 17 extern int PR10013_x; 18 } 19 20 return PR10013_x; // expected-warning{{incompatible pointer to integer conversion}} 21 } 22 23 static int test1_a[]; // expected-warning {{tentative array definition assumed to have one element}} 24 extern int test1_a[]; 25 26 // rdar://13535367 test2declarer()27void test2declarer() { extern int test2_array[100]; } 28 extern int test2_array[]; 29 int test2v = sizeof(test2_array); // expected-error {{invalid application of 'sizeof' to an incomplete type 'int []'}} 30 test3declarer()31void test3declarer() { 32 { extern int test3_array[100]; } 33 extern int test3_array[]; 34 int x = sizeof(test3_array); // expected-error {{invalid application of 'sizeof' to an incomplete type 'int []'}} 35 } 36 test4()37void test4() { 38 extern int test4_array[]; 39 { 40 extern int test4_array[100]; 41 int x = sizeof(test4_array); // fine 42 } 43 int x = sizeof(test4_array); // expected-error {{invalid application of 'sizeof' to an incomplete type 'int []'}} 44 } 45 46 // Test that invalid local extern declarations of library 47 // builtins behave reasonably. 48 extern void abort(void); // expected-note 2 {{previous declaration is here}} 49 extern float *calloc(); // expected-warning {{incompatible redeclaration of library function}} expected-note {{is a builtin}} expected-note 2 {{previous declaration is here}} test5a()50void test5a() { 51 int abort(); // expected-error {{conflicting types}} 52 float *malloc(); // expected-warning {{incompatible redeclaration of library function}} expected-note 2 {{is a builtin}} 53 int *calloc(); // expected-error {{conflicting types}} 54 } test5b()55void test5b() { 56 int abort(); // expected-error {{conflicting types}} 57 float *malloc(); // expected-warning {{incompatible redeclaration of library function}} 58 int *calloc(); // expected-error {{conflicting types}} 59 } test5c()60void test5c() { 61 void (*_abort)(void) = &abort; 62 void *(*_malloc)() = &malloc; 63 float *(*_calloc)() = &calloc; 64 } 65 test6()66void test6() { 67 extern int test6_array1[100]; 68 extern int test6_array2[100]; 69 void test6_fn1(int*); 70 void test6_fn2(int*); 71 { 72 // Types are only merged from visible declarations. 73 char test6_array2; 74 char test6_fn2; 75 { 76 extern int test6_array1[]; 77 extern int test6_array2[]; 78 (void)sizeof(test6_array1); // ok 79 (void)sizeof(test6_array2); // expected-error {{incomplete type}} 80 81 void test6_fn1(); 82 void test6_fn2(); 83 test6_fn1(1.2); // expected-error {{passing 'double' to parameter of incompatible type 'int *'}} 84 // FIXME: This is valid, but we should warn on it. 85 test6_fn2(1.2); 86 } 87 } 88 } 89