1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -verify -std=c++11 %s 2162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 3162e1c1b487352434552147967c3dd296ebee2f7Richard Smithnamespace RedeclAliasTypedef { 4162e1c1b487352434552147967c3dd296ebee2f7Richard Smith typedef int T; 5162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using T = int; 6162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using T = int; 7162e1c1b487352434552147967c3dd296ebee2f7Richard Smith typedef T T; 8162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using T = T; 9162e1c1b487352434552147967c3dd296ebee2f7Richard Smith typedef int T; 10162e1c1b487352434552147967c3dd296ebee2f7Richard Smith} 11162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 12162e1c1b487352434552147967c3dd296ebee2f7Richard Smithnamespace IllegalTypeIds { 13162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using A = void(int n = 0); // expected-error {{default arguments can only be specified for parameters in a function declaration}} 14162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using B = inline void(int n); // expected-error {{type name does not allow function specifier}} 15162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using C = virtual void(int n); // expected-error {{type name does not allow function specifier}} 16162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using D = explicit void(int n); // expected-error {{type name does not allow function specifier}} 17162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using E = void(int n) throw(); // expected-error {{exception specifications are not allowed in type aliases}} 18d37b360bf9f954af119c9805fdc79ab9d30e06c6Richard Smith using F = void(*)(int n) &&; // expected-error {{pointer to function type cannot have '&&' qualifier}} 19162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using G = __thread void(int n); // expected-error {{type name does not allow storage class to be specified}} 2069730c115c2d0fec2f20609d905d920a5a41b29bRichard Smith using H = constexpr int; // expected-error {{type name does not allow constexpr specifier}} 21162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 2269730c115c2d0fec2f20609d905d920a5a41b29bRichard Smith using Y = void(int n); // ok 2369730c115c2d0fec2f20609d905d920a5a41b29bRichard Smith using Z = void(int n) &&; // ok 24162e1c1b487352434552147967c3dd296ebee2f7Richard Smith} 25162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 26162e1c1b487352434552147967c3dd296ebee2f7Richard Smithnamespace IllegalSyntax { 27162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using ::T = void(int n); // expected-error {{name defined in alias declaration must be an identifier}} 28162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using operator int = void(int n); // expected-error {{name defined in alias declaration must be an identifier}} 29162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using typename U = void; // expected-error {{name defined in alias declaration must be an identifier}} 30162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using typename ::V = void(int n); // expected-error {{name defined in alias declaration must be an identifier}} 31162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using typename ::operator bool = void(int n); // expected-error {{name defined in alias declaration must be an identifier}} 32162e1c1b487352434552147967c3dd296ebee2f7Richard Smith} 33162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 34162e1c1b487352434552147967c3dd296ebee2f7Richard Smithnamespace VariableLengthArrays { 35162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using T = int[42]; // ok 36162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 37162e1c1b487352434552147967c3dd296ebee2f7Richard Smith int n = 32; 38162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using T = int[n]; // expected-error {{variable length array declaration not allowed at file scope}} 39162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 40162e1c1b487352434552147967c3dd296ebee2f7Richard Smith const int m = 42; 41162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using U = int[m]; // expected-note {{previous definition}} 42162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using U = int[42]; // ok 43162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using U = int; // expected-error {{type alias redefinition with different types ('int' vs 'int [42]')}} 44162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 45162e1c1b487352434552147967c3dd296ebee2f7Richard Smith void f() { 46162e1c1b487352434552147967c3dd296ebee2f7Richard Smith int n = 42; 47162e1c1b487352434552147967c3dd296ebee2f7Richard Smith goto foo; // expected-error {{goto into protected scope}} 48162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using T = int[n]; // expected-note {{bypasses initialization of VLA type alias}} 49162e1c1b487352434552147967c3dd296ebee2f7Richard Smith foo: ; 50162e1c1b487352434552147967c3dd296ebee2f7Richard Smith } 51162e1c1b487352434552147967c3dd296ebee2f7Richard Smith} 52162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 53162e1c1b487352434552147967c3dd296ebee2f7Richard Smithnamespace RedeclFunc { 54162e1c1b487352434552147967c3dd296ebee2f7Richard Smith int f(int, char**); 55162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using T = int; 56162e1c1b487352434552147967c3dd296ebee2f7Richard Smith T f(int, char **); // ok 57162e1c1b487352434552147967c3dd296ebee2f7Richard Smith} 58162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 59162e1c1b487352434552147967c3dd296ebee2f7Richard Smithnamespace LookupFilter { 60162e1c1b487352434552147967c3dd296ebee2f7Richard Smith namespace N { struct S; } 61162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using namespace N; 62162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using S = S*; // ok 63162e1c1b487352434552147967c3dd296ebee2f7Richard Smith} 64162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 65162e1c1b487352434552147967c3dd296ebee2f7Richard Smithnamespace InFunctions { 66162e1c1b487352434552147967c3dd296ebee2f7Richard Smith template<typename...T> void f0() { 67162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using U = T*; // expected-error {{declaration type contains unexpanded parameter pack 'T'}} 68162e1c1b487352434552147967c3dd296ebee2f7Richard Smith U u; 69162e1c1b487352434552147967c3dd296ebee2f7Richard Smith } 70162e1c1b487352434552147967c3dd296ebee2f7Richard Smith template void f0<int, char>(); 71162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 72162e1c1b487352434552147967c3dd296ebee2f7Richard Smith void f1() { 73162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using T = int; 74162e1c1b487352434552147967c3dd296ebee2f7Richard Smith } 75162e1c1b487352434552147967c3dd296ebee2f7Richard Smith void f2() { 76162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using T = int[-1]; // expected-error {{array size is negative}} 77162e1c1b487352434552147967c3dd296ebee2f7Richard Smith } 78162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 79162e1c1b487352434552147967c3dd296ebee2f7Richard Smith template<typename...T> void f3() { // expected-note {{template parameter is declared here}} 80162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using T = int; // expected-error {{declaration of 'T' shadows template parameter}} 81162e1c1b487352434552147967c3dd296ebee2f7Richard Smith } 82162e1c1b487352434552147967c3dd296ebee2f7Richard Smith} 83162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 84162e1c1b487352434552147967c3dd296ebee2f7Richard Smithnamespace ClassNameRedecl { 85162e1c1b487352434552147967c3dd296ebee2f7Richard Smith class C0 { 86162e1c1b487352434552147967c3dd296ebee2f7Richard Smith // FIXME: this diagnostic is pretty poor 87162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using C0 = int; // expected-error {{name defined in alias declaration must be an identifier}} 88162e1c1b487352434552147967c3dd296ebee2f7Richard Smith }; 89162e1c1b487352434552147967c3dd296ebee2f7Richard Smith class C1 { 90162e1c1b487352434552147967c3dd296ebee2f7Richard Smith // FIXME: this diagnostic is pretty poor 91162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using C1 = C1; // expected-error {{name defined in alias declaration must be an identifier}} 92162e1c1b487352434552147967c3dd296ebee2f7Richard Smith }; 93162e1c1b487352434552147967c3dd296ebee2f7Richard Smith class C2 { 94162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using C0 = C1; // ok 95162e1c1b487352434552147967c3dd296ebee2f7Richard Smith }; 96162e1c1b487352434552147967c3dd296ebee2f7Richard Smith template<typename...T> class C3 { 97162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using f = T; // expected-error {{declaration type contains unexpanded parameter pack 'T'}} 98162e1c1b487352434552147967c3dd296ebee2f7Richard Smith }; 99162e1c1b487352434552147967c3dd296ebee2f7Richard Smith template<typename T> class C4 { // expected-note {{template parameter is declared here}} 100162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using T = int; // expected-error {{declaration of 'T' shadows template parameter}} 101162e1c1b487352434552147967c3dd296ebee2f7Richard Smith }; 102162e1c1b487352434552147967c3dd296ebee2f7Richard Smith class C5 { 103162e1c1b487352434552147967c3dd296ebee2f7Richard Smith class c; // expected-note {{previous definition}} 104162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using c = int; // expected-error {{typedef redefinition with different types}} 105162e1c1b487352434552147967c3dd296ebee2f7Richard Smith class d; 106162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using d = d; // ok 107162e1c1b487352434552147967c3dd296ebee2f7Richard Smith }; 108162e1c1b487352434552147967c3dd296ebee2f7Richard Smith class C6 { 109162e1c1b487352434552147967c3dd296ebee2f7Richard Smith class c { using C6 = int; }; // ok 110162e1c1b487352434552147967c3dd296ebee2f7Richard Smith }; 111162e1c1b487352434552147967c3dd296ebee2f7Richard Smith} 112162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 113162e1c1b487352434552147967c3dd296ebee2f7Richard Smithclass CtorDtorName { 114162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using X = CtorDtorName; 115162e1c1b487352434552147967c3dd296ebee2f7Richard Smith X(); // expected-error {{expected member name}} 116162e1c1b487352434552147967c3dd296ebee2f7Richard Smith ~X(); // expected-error {{destructor cannot be declared using a type alias}} 117162e1c1b487352434552147967c3dd296ebee2f7Richard Smith}; 118162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 119162e1c1b487352434552147967c3dd296ebee2f7Richard Smithnamespace TagName { 120162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using S = struct { int n; }; 121162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using T = class { int n; }; 122162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using U = enum { a, b, c }; 123162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using V = struct V { int n; }; 124162e1c1b487352434552147967c3dd296ebee2f7Richard Smith} 125162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 126162e1c1b487352434552147967c3dd296ebee2f7Richard Smithnamespace CWG1044 { 127a971d2410fabb093954c4119d2287ac24208ea8dRichard Smith using T = T; // expected-error {{unknown type name 'T'}} 128162e1c1b487352434552147967c3dd296ebee2f7Richard Smith} 129162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 130162e1c1b487352434552147967c3dd296ebee2f7Richard Smithnamespace StdExample { 131162e1c1b487352434552147967c3dd296ebee2f7Richard Smith template<typename T, typename U> struct pair; 132162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 133162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using handler_t = void (*)(int); 134162e1c1b487352434552147967c3dd296ebee2f7Richard Smith extern handler_t ignore; 135162e1c1b487352434552147967c3dd296ebee2f7Richard Smith extern void (*ignore)(int); 136162e1c1b487352434552147967c3dd296ebee2f7Richard Smith // FIXME: we know we're parsing a type here; don't recover as if we were 137162e1c1b487352434552147967c3dd296ebee2f7Richard Smith // using operator*. 138162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using cell = pair<void*, cell*>; // expected-error {{use of undeclared identifier 'cell'}} \ 139162e1c1b487352434552147967c3dd296ebee2f7Richard Smith expected-error {{expected expression}} 140162e1c1b487352434552147967c3dd296ebee2f7Richard Smith} 141162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 142162e1c1b487352434552147967c3dd296ebee2f7Richard Smithnamespace Access { 143162e1c1b487352434552147967c3dd296ebee2f7Richard Smith class C0 { 144162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using U = int; // expected-note {{declared private here}} 145162e1c1b487352434552147967c3dd296ebee2f7Richard Smith }; 146162e1c1b487352434552147967c3dd296ebee2f7Richard Smith C0::U v; // expected-error {{'U' is a private member}} 147162e1c1b487352434552147967c3dd296ebee2f7Richard Smith class C1 { 148162e1c1b487352434552147967c3dd296ebee2f7Richard Smith public: 149162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using U = int; 150162e1c1b487352434552147967c3dd296ebee2f7Richard Smith }; 151162e1c1b487352434552147967c3dd296ebee2f7Richard Smith C1::U w; // ok 152162e1c1b487352434552147967c3dd296ebee2f7Richard Smith} 153162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 154162e1c1b487352434552147967c3dd296ebee2f7Richard Smithnamespace VoidArg { 155162e1c1b487352434552147967c3dd296ebee2f7Richard Smith using V = void; 156162e1c1b487352434552147967c3dd296ebee2f7Richard Smith V f(int); // ok 157162e1c1b487352434552147967c3dd296ebee2f7Richard Smith V g(V); // expected-error {{empty parameter list defined with a type alias of 'void' not allowed}} 158162e1c1b487352434552147967c3dd296ebee2f7Richard Smith} 159