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 Smithvoid 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