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