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