nested-name-spec-locations.cpp [plain text]
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
* >::value;
};
UnresolvedUsingValueDeclTester<int> UnresolvedUsingValueDeclCheck;
template<typename T>
struct UnresolvedUsingTypenameDeclTester {
using outer::inner::X0<
typename add_reference<T>::type
* >::value;
};
UnresolvedUsingTypenameDeclTester<int> UnresolvedUsingTypenameDeclCheck;
template<typename T, typename U>
struct PseudoDestructorExprTester {
void f(T *t) {
t->T::template Inner<typename add_reference<U>::type
* >::Blarg::~Blarg();
}
};
struct HasInnerTemplate {
template<typename T>
struct Inner;
typedef HasInnerTemplate T;
};
void PseudoDestructorExprCheck(
PseudoDestructorExprTester<HasInnerTemplate, float> tester) {
tester.f(0); }
template<typename T>
struct DependentScopedDeclRefExpr {
void f() {
outer_alias::inner::X0<typename add_reference<T>::type
* >::value = 17;
}
};
void DependentScopedDeclRefExprCheck(DependentScopedDeclRefExpr<int> t) {
t.f(); }
template<typename T>
struct TypenameTypeTester {
typedef typename outer::inner::X0<
typename add_reference<T>::type
* >::type type;
};
TypenameTypeTester<int> TypenameTypeCheck;
template<typename T, typename U>
struct DependentTemplateSpecializationTypeTester {
typedef typename T::template apply<typename add_reference<U>::type
* >::type type;
};
struct HasApply {
template<typename T>
struct apply {
typedef T type;
};
};
DependentTemplateSpecializationTypeTester<HasApply, int> DTSTCheck;
template<typename T, typename U>
struct DependentTemplateSpecializationTypeTester2 {
typedef typename T::template apply<typename add_reference<U>::type
* > type;
};
DependentTemplateSpecializationTypeTester2<HasApply, int> DTSTCheck2;
template<typename T, typename U>
struct DependentTemplateSpecializationTypeTester3 :
T::template apply<typename add_reference<U>::type
* >
{};
DependentTemplateSpecializationTypeTester3<HasApply, int> DTSTCheck3;
template<typename T, typename U>
struct DependentTemplateSpecializationTypeTester4 {
typedef class T::template apply<typename add_reference<U>::type
* > type;
};
DependentTemplateSpecializationTypeTester4<HasApply, int> DTSTCheck4;
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
* >::
template X>
type;
};
DependentTemplateTemplateArgumentTester<HasApply, int> DTTACheck;
namespace PR9388 {
namespace std {
template<typename T> class vector {
};
}
template<typename T> static void foo(std::vector<T*> &V) {
__PRETTY_FUNCTION__; }
void bar(std::vector<int*> &Blocks) {
foo(Blocks); }
}