109f3462e0713cfbf21fce3b80d838db63f14c789Matt Beaumont-Gay// RUN: %clang_cc1 -fsyntax-only -verify %s 25149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor 35149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor// Note: the formatting in this test case is intentionally funny, with 45149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor// nested-name-specifiers stretched out vertically so that we can 55149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor// match up diagnostics per-line and still verify that we're getting 65149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor// good source-location information. 75149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor 85149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregornamespace outer { 95149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor namespace inner { 105149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor template<typename T> 115149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor struct X0 { 125149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor }; 135149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor } 145149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor} 155149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor 165149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregortemplate<typename T> 175149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregorstruct add_reference { 185149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor typedef T& type; 195149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor}; 205149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor 215149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregornamespace outer_alias = outer; 225149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor 235149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregortemplate<typename T> 245149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregorstruct UnresolvedUsingValueDeclTester { 255149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor using outer::inner::X0< 265149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor typename add_reference<T>::type 275149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor * // expected-error{{declared as a pointer to a reference of type}} 285149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor >::value; 295149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor}; 305149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor 315149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas GregorUnresolvedUsingValueDeclTester<int> UnresolvedUsingValueDeclCheck; // expected-note{{in instantiation of template class}} 325149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor 335149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregortemplate<typename T> 345149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregorstruct UnresolvedUsingTypenameDeclTester { 355149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor using outer::inner::X0< 365149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor typename add_reference<T>::type 375149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor * // expected-error{{declared as a pointer to a reference of type}} 385149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor >::value; 395149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor}; 405149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor 415149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas GregorUnresolvedUsingTypenameDeclTester<int> UnresolvedUsingTypenameDeclCheck; // expected-note{{in instantiation of template class}} 425149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor 43f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor 44f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregortemplate<typename T, typename U> 45f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregorstruct PseudoDestructorExprTester { 46f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor void f(T *t) { 47f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor t->T::template Inner<typename add_reference<U>::type 48f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor * // expected-error{{as a pointer to a reference of type}} 49f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor >::Blarg::~Blarg(); 50f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor } 51f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor}; 52f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor 53f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregorstruct HasInnerTemplate { 54f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor template<typename T> 55f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor struct Inner; 56f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor 57f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor typedef HasInnerTemplate T; 58f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor}; 59f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor 60f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregorvoid PseudoDestructorExprCheck( 61f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor PseudoDestructorExprTester<HasInnerTemplate, float> tester) { 62f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor tester.f(0); // expected-note{{in instantiation of member function}} 63f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor} 6400cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor 6500cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregortemplate<typename T> 6600cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregorstruct DependentScopedDeclRefExpr { 6700cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor void f() { 687c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor outer_alias::inner::X0<typename add_reference<T>::type 697c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor * // expected-error{{as a pointer to a reference of type}} 707c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor >::value = 17; 7100cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor } 7200cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor}; 737c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor 747c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregorvoid DependentScopedDeclRefExprCheck(DependentScopedDeclRefExpr<int> t) { 757c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor t.f(); // expected-note{{in instantiation of member function}} 767c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor} 772494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor 782494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor 792494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregortemplate<typename T> 802494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregorstruct TypenameTypeTester { 812494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor typedef typename outer::inner::X0< 822494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor typename add_reference<T>::type 832494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor * // expected-error{{declared as a pointer to a reference of type}} 842494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor >::type type; 852494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor}; 862494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor 872494dd024b392b8def58bf067cc94b51c214cf77Douglas GregorTypenameTypeTester<int> TypenameTypeCheck; // expected-note{{in instantiation of template class}} 8894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 8994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregortemplate<typename T, typename U> 9094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregorstruct DependentTemplateSpecializationTypeTester { 9194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor typedef typename T::template apply<typename add_reference<U>::type 9294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor * // expected-error{{declared as a pointer to a reference of type}} 9394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor >::type type; 9494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor}; 9594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 9694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregorstruct HasApply { 9794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor template<typename T> 9894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor struct apply { 9994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor typedef T type; 10094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor }; 10194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor}; 10294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 10394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas GregorDependentTemplateSpecializationTypeTester<HasApply, int> DTSTCheck; // expected-note{{in instantiation of template class}} 10494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 10594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregortemplate<typename T, typename U> 10694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregorstruct DependentTemplateSpecializationTypeTester2 { 10794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor typedef typename T::template apply<typename add_reference<U>::type 10894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor * // expected-error{{declared as a pointer to a reference of type}} 10994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor > type; 11094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor}; 11194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 11294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas GregorDependentTemplateSpecializationTypeTester2<HasApply, int> DTSTCheck2; // expected-note{{in instantiation of template class}} 113059101f922de6eb765601459925f4c8914420b23Douglas Gregor 114059101f922de6eb765601459925f4c8914420b23Douglas Gregortemplate<typename T, typename U> 115059101f922de6eb765601459925f4c8914420b23Douglas Gregorstruct DependentTemplateSpecializationTypeTester3 : 116059101f922de6eb765601459925f4c8914420b23Douglas Gregor T::template apply<typename add_reference<U>::type 117059101f922de6eb765601459925f4c8914420b23Douglas Gregor * // expected-error{{declared as a pointer to a reference of type}} 118059101f922de6eb765601459925f4c8914420b23Douglas Gregor > 119059101f922de6eb765601459925f4c8914420b23Douglas Gregor{}; 120059101f922de6eb765601459925f4c8914420b23Douglas Gregor 121059101f922de6eb765601459925f4c8914420b23Douglas GregorDependentTemplateSpecializationTypeTester3<HasApply, int> DTSTCheck3; // expected-note{{in instantiation of template class}} 122059101f922de6eb765601459925f4c8914420b23Douglas Gregor 123059101f922de6eb765601459925f4c8914420b23Douglas Gregortemplate<typename T, typename U> 124059101f922de6eb765601459925f4c8914420b23Douglas Gregorstruct DependentTemplateSpecializationTypeTester4 { 125059101f922de6eb765601459925f4c8914420b23Douglas Gregor typedef class T::template apply<typename add_reference<U>::type 126059101f922de6eb765601459925f4c8914420b23Douglas Gregor * // expected-error{{declared as a pointer to a reference of type}} 127059101f922de6eb765601459925f4c8914420b23Douglas Gregor > type; 128059101f922de6eb765601459925f4c8914420b23Douglas Gregor}; 129059101f922de6eb765601459925f4c8914420b23Douglas Gregor 130059101f922de6eb765601459925f4c8914420b23Douglas GregorDependentTemplateSpecializationTypeTester4<HasApply, int> DTSTCheck4; // expected-note{{in instantiation of template class}} 131b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor 132b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregortemplate<template<class T> class TTP> 133b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregorstruct AcceptedTemplateTemplateParameter { 134b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor}; 135b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor 136b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregortemplate<typename T, typename U> 137b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregorstruct DependentTemplateTemplateArgumentTester { 138b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor typedef AcceptedTemplateTemplateParameter< 139b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor T:: 140b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor template apply< 141b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor typename add_reference<U>::type 142b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor * // expected-error{{declared as a pointer to a reference of type}} 143b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor >:: 144b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor template X> 145b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor type; 146b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor}; 147b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor 148b6744efecba58792cce20d2d7b9ee39927c5422eDouglas GregorDependentTemplateTemplateArgumentTester<HasApply, int> DTTACheck; // expected-note{{in instantiation of template class}} 1490f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor 1500f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregornamespace PR9388 { 1510f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor namespace std { 1520f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor template<typename T> class vector { 1530f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor }; 1540f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor } 1550f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor template<typename T> static void foo(std::vector<T*> &V) { 1560f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor __PRETTY_FUNCTION__; // expected-warning{{expression result unused}} 1570f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor } 1580f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor void bar(std::vector<int*> &Blocks) { 1590f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor foo(Blocks); // expected-note{{in instantiation of}} 1600f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor } 1610f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor 1620f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor} 163