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)6 void 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)13 int 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()27 void 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()31 void 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()37 void 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()50 void 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()55 void 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()60 void test5c() {
61 void (*_abort)(void) = &abort;
62 void *(*_malloc)() = &malloc;
63 float *(*_calloc)() = &calloc;
64 }
65