| // RUN: clang-cc -fsyntax-only -pedantic -verify %s |
| |
| // Simple form |
| int ar1[10]; |
| |
| // Element type cannot be: |
| // - (cv) void |
| volatile void ar2[10]; // expected-error {{incomplete element type 'void volatile'}} |
| // - a reference |
| int& ar3[10]; // expected-error {{array of references}} |
| // - a function type |
| typedef void Fn(); |
| Fn ar4[10]; // expected-error {{array of functions}} |
| // - an abstract class |
| struct Abstract { virtual void fn() = 0; }; // expected-note {{pure virtual}} |
| Abstract ar5[10]; // expected-error {{abstract class}} |
| |
| // If we have a size, it must be greater than zero. |
| int ar6[-1]; // expected-error {{array size is negative}} |
| int ar7[0u]; // expected-warning {{zero size arrays are an extension}} |
| |
| // An array with unknown bound is incomplete. |
| int ar8[]; // expected-error {{needs an explicit size or an initializer}} |
| // So is an array with an incomplete element type. |
| struct Incomplete; // expected-note {{forward declaration}} |
| Incomplete ar9[10]; // expected-error {{incomplete type}} |
| // Neither of which should be a problem in situations where no complete type |
| // is required. (PR5048) |
| void fun(int p1[], Incomplete p2[10]); |
| extern int ear1[]; |
| extern Incomplete ear2[10]; |
| |
| // cv migrates to element type |
| typedef const int cint; |
| extern cint car1[10]; |
| typedef int intar[10]; |
| // thus this is a valid redeclaration |
| extern const intar car1; |
| |
| // Check that instantiation works properly when the element type is a template. |
| template <typename T> struct S { |
| typename T::type x; // expected-error {{has no members}} |
| }; |
| S<int> ar10[10]; // expected-note {{requested here}} |