Home | History | Annotate | Download | only in Sema
      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