instantiate-member-class.cpp revision d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4d
1// RUN: clang-cc -fsyntax-only -verify %s 2 3template<typename T> 4class X { 5public: 6 struct C { T &foo(); }; 7 8 struct D { 9 struct E { T &bar(); }; 10 struct F; // expected-note{{member is declared here}} 11 }; 12}; 13 14X<int>::C *c1; 15X<float>::C *c2; 16 17X<int>::X *xi; 18X<float>::X *xf; 19 20void test_naming() { 21 c1 = c2; // expected-error{{incompatible type assigning 'X<float>::C *', expected 'X<int>::C *'}} 22 xi = xf; // expected-error{{incompatible type assigning}} 23 // FIXME: error above doesn't print the type X<int>::X cleanly! 24} 25 26void test_instantiation(X<double>::C *x, 27 X<float>::D::E *e, 28 X<float>::D::F *f) { 29 double &dr = x->foo(); 30 float &fr = e->bar(); 31 f->foo(); // expected-error{{implicit instantiation of undefined member 'struct X<float>::D::F'}} 32 33} 34