// 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<typename T>
struct X0 {
};
}
}
template<typename T>
struct add_reference {
typedef T& type;
};
namespace outer_alias = outer;
template<typename T>
struct UnresolvedUsingValueDeclTester {
using outer::inner::X0<
typename add_reference<T>::type
* // expected-error{{declared as a pointer to a reference of type}}
>::value;
};
UnresolvedUsingValueDeclTester<int> UnresolvedUsingValueDeclCheck; // expected-note{{in instantiation of template class}}
template<typename T>
struct UnresolvedUsingTypenameDeclTester {
using outer::inner::X0<
typename add_reference<T>::type
* // expected-error{{declared as a pointer to a reference of type}}
>::value;
};
UnresolvedUsingTypenameDeclTester<int> UnresolvedUsingTypenameDeclCheck; // expected-note{{in instantiation of template class}}
template<typename T, typename U>
struct PseudoDestructorExprTester {
void f(T *t) {
t->T::template Inner<typename add_reference<U>::type
* // expected-error{{as a pointer to a reference of type}}
>::Blarg::~Blarg();
}
};
struct HasInnerTemplate {
template<typename T>
struct Inner;
typedef HasInnerTemplate T;
};
void PseudoDestructorExprCheck(
PseudoDestructorExprTester<HasInnerTemplate, float> tester) {
tester.f(0); // expected-note{{in instantiation of member function}}
}
template<typename T>
struct DependentScopedDeclRefExpr {
void f() {
outer_alias::inner::X0<typename add_reference<T>::type
* // expected-error{{as a pointer to a reference of type}}
>::value = 17;
}
};
void DependentScopedDeclRefExprCheck(DependentScopedDeclRefExpr<int> t) {
t.f(); // expected-note{{in instantiation of member function}}
}
template<typename T>
struct TypenameTypeTester {
typedef typename outer::inner::X0<
typename add_reference<T>::type
* // expected-error{{declared as a pointer to a reference of type}}
>::type type;
};
TypenameTypeTester<int> TypenameTypeCheck; // expected-note{{in instantiation of template class}}
template<typename T, typename U>
struct DependentTemplateSpecializationTypeTester {
typedef typename T::template apply<typename add_reference<U>::type
* // expected-error{{declared as a pointer to a reference of type}}
>::type type;
};
struct HasApply {
template<typename T>
struct apply {
typedef T type;
};
};
DependentTemplateSpecializationTypeTester<HasApply, int> DTSTCheck; // expected-note{{in instantiation of template class}}
template<typename T, typename U>
struct DependentTemplateSpecializationTypeTester2 {
typedef typename T::template apply<typename add_reference<U>::type
* // expected-error{{declared as a pointer to a reference of type}}
> type;
};
DependentTemplateSpecializationTypeTester2<HasApply, int> DTSTCheck2; // expected-note{{in instantiation of template class}}
template<typename T, typename U>
struct DependentTemplateSpecializationTypeTester3 :
T::template apply<typename add_reference<U>::type
* // expected-error{{declared as a pointer to a reference of type}}
>
{};
DependentTemplateSpecializationTypeTester3<HasApply, int> DTSTCheck3; // expected-note{{in instantiation of template class}}
template<typename T, typename U>
struct DependentTemplateSpecializationTypeTester4 {
typedef class T::template apply<typename add_reference<U>::type
* // expected-error{{declared as a pointer to a reference of type}}
> type;
};
DependentTemplateSpecializationTypeTester4<HasApply, int> DTSTCheck4; // expected-note{{in instantiation of template class}}
template<template<class T> class TTP>
struct AcceptedTemplateTemplateParameter {
};
template<typename T, typename U>
struct DependentTemplateTemplateArgumentTester {
typedef AcceptedTemplateTemplateParameter<
T::
template apply<
typename add_reference<U>::type
* // expected-error{{declared as a pointer to a reference of type}}
>::
template X>
type;
};
DependentTemplateTemplateArgumentTester<HasApply, int> DTTACheck; // expected-note{{in instantiation of template class}}
namespace PR9388 {
namespace std {
template<typename T> class vector {
};
}
template<typename T> static void foo(std::vector<T*> &V) {
__PRETTY_FUNCTION__; // expected-warning{{expression result unused}}
}
void bar(std::vector<int*> &Blocks) {
foo(Blocks); // expected-note{{in instantiation of}}
}
}