1*09abecefSRichard Smith // RUN: %clang_cc1 -verify %s
2*09abecefSRichard Smith 
3*09abecefSRichard Smith // Some of the diagnostics produce 'did you mean?' suggestions. We don't care
4*09abecefSRichard Smith // which ones for the purpose of this test.
5*09abecefSRichard Smith // expected-note@* 0+{{here}}
6*09abecefSRichard Smith 
7*09abecefSRichard Smith struct A *f();
8*09abecefSRichard Smith using Test_A = A;
9*09abecefSRichard Smith 
10*09abecefSRichard Smith void f(struct B*);
11*09abecefSRichard Smith using Test_B = B;
12*09abecefSRichard Smith 
13*09abecefSRichard Smith struct C;
14*09abecefSRichard Smith using Test_C = C;
15*09abecefSRichard Smith 
16*09abecefSRichard Smith struct X {
17*09abecefSRichard Smith   struct D *f();
18*09abecefSRichard Smith   void f(struct E*);
19*09abecefSRichard Smith   struct F;
20*09abecefSRichard Smith   friend struct G;
21*09abecefSRichard Smith };
22*09abecefSRichard Smith using Test_D = D;
23*09abecefSRichard Smith using Test_XD = X::D; // expected-error {{no type named 'D' in 'X'}}
24*09abecefSRichard Smith using Test_E = E;
25*09abecefSRichard Smith using Test_XE = X::E; // expected-error {{no type named 'E' in 'X'}}
26*09abecefSRichard Smith using Test_F = F; // expected-error {{unknown type name 'F'}}
27*09abecefSRichard Smith using Test_XF = X::F;
28*09abecefSRichard Smith using Test_G = G; // expected-error {{unknown type name 'G'}}
29*09abecefSRichard Smith using Test_XG = X::G; // expected-error {{no type named 'G' in 'X'}}
30*09abecefSRichard Smith 
g()31*09abecefSRichard Smith void g() {
32*09abecefSRichard Smith   {
33*09abecefSRichard Smith     struct X {
34*09abecefSRichard Smith       struct H *f();
35*09abecefSRichard Smith       void f(struct I*);
36*09abecefSRichard Smith       struct J;
37*09abecefSRichard Smith       friend struct K;
38*09abecefSRichard Smith     };
39*09abecefSRichard Smith     using Test_H = H;
40*09abecefSRichard Smith     using Test_XH = X::H; // expected-error {{no type named}}
41*09abecefSRichard Smith     using Test_I = I;
42*09abecefSRichard Smith     using Test_XI = X::I; // expected-error {{no type named}}
43*09abecefSRichard Smith     using Test_J = J; // expected-error {{unknown type name}}
44*09abecefSRichard Smith     using Test_XJ = X::J;
45*09abecefSRichard Smith     using Test_K = K; // expected-error {{unknown type name}}
46*09abecefSRichard Smith     using Test_XK = X::K; // expected-error {{no type named}}
47*09abecefSRichard Smith   }
48*09abecefSRichard Smith   using Test_H = H; // expected-error {{unknown type name}}
49*09abecefSRichard Smith   using Test_I = I; // expected-error {{unknown type name}}
50*09abecefSRichard Smith   using Test_J = J; // expected-error {{unknown type name}}
51*09abecefSRichard Smith   using Test_K = K; // expected-error {{unknown type name}}
52*09abecefSRichard Smith }
53*09abecefSRichard Smith using Test_H = H; // expected-error {{unknown type name}}
54*09abecefSRichard Smith using Test_I = I; // expected-error {{unknown type name}}
55*09abecefSRichard Smith using Test_J = J; // expected-error {{unknown type name}}
56*09abecefSRichard Smith using Test_K = K; // expected-error {{unknown type name}}
57