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 | |