Douglas Gregor | d475b8d | 2009-03-25 21:17:03 +0000 | [diff] [blame] | 1 | // RUN: clang-cc -fsyntax-only -verify %s |
| 2 | |
| 3 | template<typename T> |
| 4 | class X { |
| 5 | public: |
| 6 | struct C { T &foo(); }; |
| 7 | |
| 8 | struct D { |
Douglas Gregor | d048bb7 | 2009-03-25 21:23:52 +0000 | [diff] [blame^] | 9 | struct E { T &bar(); }; // expected-error{{cannot form a reference to 'void'}} |
Douglas Gregor | d475b8d | 2009-03-25 21:17:03 +0000 | [diff] [blame] | 10 | struct F; // expected-note{{member is declared here}} |
| 11 | }; |
| 12 | }; |
| 13 | |
| 14 | X<int>::C *c1; |
| 15 | X<float>::C *c2; |
| 16 | |
| 17 | X<int>::X *xi; |
| 18 | X<float>::X *xf; |
| 19 | |
| 20 | void 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 | |
| 26 | void 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 | } |
Douglas Gregor | d048bb7 | 2009-03-25 21:23:52 +0000 | [diff] [blame^] | 34 | |
| 35 | |
| 36 | X<void>::C *c3; // okay |
| 37 | X<void>::D::E *e1; // okay |
| 38 | X<void>::D::E e2; // expected-note{{in instantiation of member class 'struct X<void>::D::E' requested here}} |