| 1 | // RUN: %clang_cc1 -fsyntax-only -verify %s |
| 2 | |
| 3 | // PR5741 |
| 4 | namespace test0 { |
| 5 | struct A { |
| 6 | struct B { }; |
| 7 | struct C; |
| 8 | }; |
| 9 | |
| 10 | struct A::C : B { }; |
| 11 | } |
| 12 | |
| 13 | // Test that successive base specifiers don't screw with each other. |
| 14 | namespace test1 { |
| 15 | struct Opaque1 {}; |
| 16 | struct Opaque2 {}; |
| 17 | |
| 18 | struct A { |
| 19 | struct B { B(Opaque1); }; |
| 20 | }; |
| 21 | struct B { |
| 22 | B(Opaque2); |
| 23 | }; |
| 24 | |
| 25 | struct C : A, B { |
| 26 | // Apparently the base-or-member lookup is actually ambiguous |
| 27 | // without this qualification. |
| 28 | C() : A(), test1::B(Opaque2()) {} |
| 29 | }; |
| 30 | } |
| 31 | |
| 32 | // Test that we don't find the injected class name when parsing base |
| 33 | // specifiers. |
| 34 | namespace test2 { |
| 35 | template <class T> struct bar {}; |
| 36 | template <class T> struct foo : bar<foo> {}; // expected-error {{use of class template 'foo' requires template arguments}} expected-note {{template is declared here}} |
| 37 | } |
| 38 | |