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