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