1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 2ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl 3ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redlstatic_assert(__is_literal(int), "fail"); 43840281126e7d10552c55f6fd8b1ec9483898906Chandler Carruthstatic_assert(__is_literal_type(int), "fail"); // alternate spelling for GCC 5ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redlstatic_assert(__is_literal(void*), "fail"); 6ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redlenum E { E1 }; 7ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redlstatic_assert(__is_literal(E), "fail"); 8ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redlstatic_assert(__is_literal(decltype(E1)), "fail"); 9ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redltypedef int IAR[10]; 10ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redlstatic_assert(__is_literal(IAR), "fail"); 1125df423cfc6689cf21d51a66af84ea1e70d489dfChandler Carruthtypedef int Vector __attribute__((vector_size(16))); 1225df423cfc6689cf21d51a66af84ea1e70d489dfChandler Carruthtypedef int VectorExt __attribute__((ext_vector_type(4))); 1325df423cfc6689cf21d51a66af84ea1e70d489dfChandler Carruthstatic_assert(__is_literal(Vector), "fail"); 1425df423cfc6689cf21d51a66af84ea1e70d489dfChandler Carruthstatic_assert(__is_literal(VectorExt), "fail"); 159b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth 169b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth// C++0x [basic.types]p10: 179b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth// A type is a literal type if it is: 189b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth// [...] 199b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth// -- a class type that has all of the following properties: 209b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth// -- it has a trivial destructor 219b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth// -- every constructor call and full-expression in the 229b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth// brace-or-equal-initializers for non-static data members (if an) is 239b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth// a constant expression, 249b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth// -- it is an aggregate type or has at least one constexpr constructor 259b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth// or constructor template that is not a copy or move constructor, and 2686c3ae46250cdcc57778c27826060779a92f3815Richard Smith// [DR1452 adds class types with trivial default constructors to 2786c3ae46250cdcc57778c27826060779a92f3815Richard Smith// this list] 289b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth// -- it has all non-static data members and base classes of literal 299b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth// types 309b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruthstruct Empty {}; 319b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruthstruct LiteralType { 329b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth int x; 339b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth E e; 349b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth IAR arr; 359b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth Empty empty; 369b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth int method(); 379b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth}; 389b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruthstruct HasDtor { ~HasDtor(); }; 399b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth 409b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruthclass NonAggregate { int x; }; 4186c3ae46250cdcc57778c27826060779a92f3815Richard Smithstruct NonLiteral { NonLiteral(); }; 4286c3ae46250cdcc57778c27826060779a92f3815Richard Smithstruct HasNonLiteralBase : NonLiteral {}; 439b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruthstruct HasNonLiteralMember { HasDtor x; }; 449b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth 459b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruthstatic_assert(__is_literal(Empty), "fail"); 469b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruthstatic_assert(__is_literal(LiteralType), "fail"); 4786c3ae46250cdcc57778c27826060779a92f3815Richard Smithstatic_assert(__is_literal(NonAggregate), "fail"); 4886c3ae46250cdcc57778c27826060779a92f3815Richard Smithstatic_assert(!__is_literal(NonLiteral), "fail"); 499b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruthstatic_assert(!__is_literal(HasDtor), "fail"); 509b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruthstatic_assert(!__is_literal(HasNonLiteralBase), "fail"); 519b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruthstatic_assert(!__is_literal(HasNonLiteralMember), "fail"); 529b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth 5386c3ae46250cdcc57778c27826060779a92f3815Richard Smith// DR1361 removes the brace-or-equal-initializer bullet so that we can allow: 5486c3ae46250cdcc57778c27826060779a92f3815Richard Smithextern int f(); // expected-note {{here}} 559b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruthstruct HasNonConstExprMemInit { 5686c3ae46250cdcc57778c27826060779a92f3815Richard Smith int x = f(); // expected-note {{non-constexpr function}} 5786c3ae46250cdcc57778c27826060779a92f3815Richard Smith constexpr HasNonConstExprMemInit() {} // expected-error {{never produces a constant expression}} 5886c3ae46250cdcc57778c27826060779a92f3815Richard Smith constexpr HasNonConstExprMemInit(int y) : x(y) {} // ok 599b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth}; 6086c3ae46250cdcc57778c27826060779a92f3815Richard Smithstatic_assert(__is_literal(HasNonConstExprMemInit), "fail"); 619b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth 629b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruthclass HasConstExprCtor { 639b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth int x; 649b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruthpublic: 659b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth constexpr HasConstExprCtor(int x) : x(x) {} 669b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth}; 679b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruthtemplate <typename T> class HasConstExprCtorTemplate { 689b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth T x; 699b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruthpublic: 709b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth template <typename U> constexpr HasConstExprCtorTemplate(U y) : x(y) {} 719b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruth}; 7286c3ae46250cdcc57778c27826060779a92f3815Richard Smithtemplate <typename T> class HasConstExprCtorT { 7386c3ae46250cdcc57778c27826060779a92f3815Richard Smith constexpr HasConstExprCtorT(T) {} 7486c3ae46250cdcc57778c27826060779a92f3815Richard Smith}; 759b6347cd410be55425f7062d22fd6e4ecb4e1a58Chandler Carruthstatic_assert(__is_literal(HasConstExprCtor), "fail"); 7686c3ae46250cdcc57778c27826060779a92f3815Richard Smithstatic_assert(__is_literal(HasConstExprCtorTemplate<int>), "fail"); 7786c3ae46250cdcc57778c27826060779a92f3815Richard Smithstatic_assert(__is_literal(HasConstExprCtorT<NonLiteral>), "fail"); 78