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