// RUN: %clang_cc1 -fsyntax-only -verify %s // Note: the formatting in this test case is intentionally funny, with // nested-name-specifiers stretched out vertically so that we can // match up diagnostics per-line and still verify that we're getting // good source-location information. namespace outer { namespace inner { template struct X0 { }; } } template struct add_reference { typedef T& type; }; namespace outer_alias = outer; template struct UnresolvedUsingValueDeclTester { using outer::inner::X0< typename add_reference::type * // expected-error{{declared as a pointer to a reference of type}} >::value; }; UnresolvedUsingValueDeclTester UnresolvedUsingValueDeclCheck; // expected-note{{in instantiation of template class}} template struct UnresolvedUsingTypenameDeclTester { using outer::inner::X0< typename add_reference::type * // expected-error{{declared as a pointer to a reference of type}} >::value; }; UnresolvedUsingTypenameDeclTester UnresolvedUsingTypenameDeclCheck; // expected-note{{in instantiation of template class}} template struct PseudoDestructorExprTester { void f(T *t) { t->T::template Inner::type * // expected-error{{as a pointer to a reference of type}} >::Blarg::~Blarg(); } }; struct HasInnerTemplate { template struct Inner; typedef HasInnerTemplate T; }; void PseudoDestructorExprCheck( PseudoDestructorExprTester tester) { tester.f(0); // expected-note{{in instantiation of member function}} } template struct DependentScopedDeclRefExpr { void f() { outer_alias::inner::X0::type * // expected-error{{as a pointer to a reference of type}} >::value = 17; } }; void DependentScopedDeclRefExprCheck(DependentScopedDeclRefExpr t) { t.f(); // expected-note{{in instantiation of member function}} } template struct TypenameTypeTester { typedef typename outer::inner::X0< typename add_reference::type * // expected-error{{declared as a pointer to a reference of type}} >::type type; }; TypenameTypeTester TypenameTypeCheck; // expected-note{{in instantiation of template class}} template struct DependentTemplateSpecializationTypeTester { typedef typename T::template apply::type * // expected-error{{declared as a pointer to a reference of type}} >::type type; }; struct HasApply { template struct apply { typedef T type; }; }; DependentTemplateSpecializationTypeTester DTSTCheck; // expected-note{{in instantiation of template class}} template struct DependentTemplateSpecializationTypeTester2 { typedef typename T::template apply::type * // expected-error{{declared as a pointer to a reference of type}} > type; }; DependentTemplateSpecializationTypeTester2 DTSTCheck2; // expected-note{{in instantiation of template class}} template struct DependentTemplateSpecializationTypeTester3 : T::template apply::type * // expected-error{{declared as a pointer to a reference of type}} > {}; DependentTemplateSpecializationTypeTester3 DTSTCheck3; // expected-note{{in instantiation of template class}} template struct DependentTemplateSpecializationTypeTester4 { typedef class T::template apply::type * // expected-error{{declared as a pointer to a reference of type}} > type; }; DependentTemplateSpecializationTypeTester4 DTSTCheck4; // expected-note{{in instantiation of template class}} template class TTP> struct AcceptedTemplateTemplateParameter { }; template struct DependentTemplateTemplateArgumentTester { typedef AcceptedTemplateTemplateParameter< T:: template apply< typename add_reference::type * // expected-error{{declared as a pointer to a reference of type}} >:: template X> type; }; DependentTemplateTemplateArgumentTester DTTACheck; // expected-note{{in instantiation of template class}} namespace PR9388 { namespace std { template class vector { }; } template static void foo(std::vector &V) { __PRETTY_FUNCTION__; // expected-warning{{expression result unused}} } void bar(std::vector &Blocks) { foo(Blocks); // expected-note{{in instantiation of}} } }