1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -pedantic -verify %s
2923d56d436f750bc1f29db50e641078725558a1bSebastian Redl
3923d56d436f750bc1f29db50e641078725558a1bSebastian Redl// Simple form
4923d56d436f750bc1f29db50e641078725558a1bSebastian Redlint ar1[10];
5923d56d436f750bc1f29db50e641078725558a1bSebastian Redl
6923d56d436f750bc1f29db50e641078725558a1bSebastian Redl// Element type cannot be:
7923d56d436f750bc1f29db50e641078725558a1bSebastian Redl// - (cv) void
858f9e13e87e57236fee4b914eea9be6f92a1c345Chris Lattnervolatile void ar2[10]; // expected-error {{incomplete element type 'volatile void'}}
9923d56d436f750bc1f29db50e641078725558a1bSebastian Redl// - a reference
10923d56d436f750bc1f29db50e641078725558a1bSebastian Redlint& ar3[10]; // expected-error {{array of references}}
11923d56d436f750bc1f29db50e641078725558a1bSebastian Redl// - a function type
12923d56d436f750bc1f29db50e641078725558a1bSebastian Redltypedef void Fn();
13923d56d436f750bc1f29db50e641078725558a1bSebastian RedlFn ar4[10]; // expected-error {{array of functions}}
14923d56d436f750bc1f29db50e641078725558a1bSebastian Redl// - an abstract class
15923d56d436f750bc1f29db50e641078725558a1bSebastian Redlstruct Abstract { virtual void fn() = 0; }; // expected-note {{pure virtual}}
16923d56d436f750bc1f29db50e641078725558a1bSebastian RedlAbstract ar5[10]; // expected-error {{abstract class}}
17923d56d436f750bc1f29db50e641078725558a1bSebastian Redl
18923d56d436f750bc1f29db50e641078725558a1bSebastian Redl// If we have a size, it must be greater than zero.
19b2b5cc0cf908d516a107d373db963f692449a8a8Chandler Carruthint ar6[-1]; // expected-error {{array with a negative size}}
20923d56d436f750bc1f29db50e641078725558a1bSebastian Redlint ar7[0u]; // expected-warning {{zero size arrays are an extension}}
21923d56d436f750bc1f29db50e641078725558a1bSebastian Redl
22923d56d436f750bc1f29db50e641078725558a1bSebastian Redl// An array with unknown bound is incomplete.
236e8247556807ecaaac470852222762db998a05b2Sebastian Redlint ar8[]; // expected-error {{needs an explicit size or an initializer}}
24923d56d436f750bc1f29db50e641078725558a1bSebastian Redl// So is an array with an incomplete element type.
25923d56d436f750bc1f29db50e641078725558a1bSebastian Redlstruct Incomplete; // expected-note {{forward declaration}}
26923d56d436f750bc1f29db50e641078725558a1bSebastian RedlIncomplete ar9[10]; // expected-error {{incomplete type}}
27923d56d436f750bc1f29db50e641078725558a1bSebastian Redl// Neither of which should be a problem in situations where no complete type
28923d56d436f750bc1f29db50e641078725558a1bSebastian Redl// is required. (PR5048)
29923d56d436f750bc1f29db50e641078725558a1bSebastian Redlvoid fun(int p1[], Incomplete p2[10]);
30923d56d436f750bc1f29db50e641078725558a1bSebastian Redlextern int ear1[];
31923d56d436f750bc1f29db50e641078725558a1bSebastian Redlextern Incomplete ear2[10];
32923d56d436f750bc1f29db50e641078725558a1bSebastian Redl
33923d56d436f750bc1f29db50e641078725558a1bSebastian Redl// cv migrates to element type
34923d56d436f750bc1f29db50e641078725558a1bSebastian Redltypedef const int cint;
35923d56d436f750bc1f29db50e641078725558a1bSebastian Redlextern cint car1[10];
36923d56d436f750bc1f29db50e641078725558a1bSebastian Redltypedef int intar[10];
37923d56d436f750bc1f29db50e641078725558a1bSebastian Redl// thus this is a valid redeclaration
38923d56d436f750bc1f29db50e641078725558a1bSebastian Redlextern const intar car1;
39923d56d436f750bc1f29db50e641078725558a1bSebastian Redl
40923d56d436f750bc1f29db50e641078725558a1bSebastian Redl// Check that instantiation works properly when the element type is a template.
41923d56d436f750bc1f29db50e641078725558a1bSebastian Redltemplate <typename T> struct S {
42923d56d436f750bc1f29db50e641078725558a1bSebastian Redl  typename T::type x; // expected-error {{has no members}}
43923d56d436f750bc1f29db50e641078725558a1bSebastian Redl};
44923d56d436f750bc1f29db50e641078725558a1bSebastian RedlS<int> ar10[10]; // expected-note {{requested here}}
45b2b5cc0cf908d516a107d373db963f692449a8a8Chandler Carruth
46b2b5cc0cf908d516a107d373db963f692449a8a8Chandler Carruth// Ensure that negative array size errors include the name of the declared
47b2b5cc0cf908d516a107d373db963f692449a8a8Chandler Carruth// array as this is often used to simulate static_assert with template
48b2b5cc0cf908d516a107d373db963f692449a8a8Chandler Carruth// instantiations, placing the 'error message' in the declarator name.
49b2b5cc0cf908d516a107d373db963f692449a8a8Chandler Carruthint
50b2b5cc0cf908d516a107d373db963f692449a8a8Chandler Carruthuser_error_message
51b2b5cc0cf908d516a107d373db963f692449a8a8Chandler Carruth[-1]; // expected-error {{user_error_message}}
52b2b5cc0cf908d516a107d373db963f692449a8a8Chandler Carruthtypedef int
53b2b5cc0cf908d516a107d373db963f692449a8a8Chandler Carruthanother_user_error_message
54b2b5cc0cf908d516a107d373db963f692449a8a8Chandler Carruth[-1]; // expected-error {{another_user_error_message}}
55