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