Home | History | Annotate | Download | only in dcl.array
      1 // RUN: %clang_cc1 -fsyntax-only -pedantic -verify %s
      2 
      3 // Simple form
      4 int ar1[10];
      5 
      6 // Element type cannot be:
      7 // - (cv) void
      8 volatile void ar2[10]; // expected-error {{incomplete element type 'volatile void'}}
      9 // - a reference
     10 int& ar3[10]; // expected-error {{array of references}}
     11 // - a function type
     12 typedef void Fn();
     13 Fn ar4[10]; // expected-error {{array of functions}}
     14 // - an abstract class
     15 struct Abstract { virtual void fn() = 0; }; // expected-note {{pure virtual}}
     16 Abstract ar5[10]; // expected-error {{abstract class}}
     17 
     18 // If we have a size, it must be greater than zero.
     19 int ar6[-1]; // expected-error {{array with a negative size}}
     20 int ar7[0u]; // expected-warning {{zero size arrays are an extension}}
     21 
     22 // An array with unknown bound is incomplete.
     23 int ar8[]; // expected-error {{needs an explicit size or an initializer}}
     24 // So is an array with an incomplete element type.
     25 struct Incomplete; // expected-note {{forward declaration}}
     26 Incomplete ar9[10]; // expected-error {{incomplete type}}
     27 // Neither of which should be a problem in situations where no complete type
     28 // is required. (PR5048)
     29 void fun(int p1[], Incomplete p2[10]);
     30 extern int ear1[];
     31 extern Incomplete ear2[10];
     32 
     33 // cv migrates to element type
     34 typedef const int cint;
     35 extern cint car1[10];
     36 typedef int intar[10];
     37 // thus this is a valid redeclaration
     38 extern const intar car1;
     39 
     40 // Check that instantiation works properly when the element type is a template.
     41 template <typename T> struct S {
     42   typename T::type x; // expected-error {{has no members}}
     43 };
     44 S<int> ar10[10]; // expected-note {{requested here}}
     45 
     46 // Ensure that negative array size errors include the name of the declared
     47 // array as this is often used to simulate static_assert with template
     48 // instantiations, placing the 'error message' in the declarator name.
     49 int
     50 user_error_message
     51 [-1]; // expected-error {{user_error_message}}
     52 typedef int
     53 another_user_error_message
     54 [-1]; // expected-error {{another_user_error_message}}
     55