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 
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;
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
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 
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 
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}}
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 }
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 }
60 void test5c() {
61   void (*_abort)(void) = &abort;
62   void *(*_malloc)() = &malloc;
63   float *(*_calloc)() = &calloc;
64 }
65 
66 void 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