Files
llvm-project/clang/test/SemaTemplate/issue150.cpp
Douglas Gregor 20bf98b5f8 When transforming a substituted template type parameter, try to
transform the type that replaces the template type parameter. In the
vast majority of cases, there's nothing to do, because most template
type parameters are replaced with something non-dependent that doesn't
need further transformation. However, when we're dealing with the
default template arguments of template template parameters, we might
end up replacing a template parameter (of the template template
parameter) with a template parameter of the enclosing template. 
 
This addresses part of PR9016, but not within function
templates. That's a separate issue.

llvm-svn: 127091
2011-03-05 17:19:27 +00:00

98 lines
2.3 KiB
C++

// RUN: %clang_cc1 -fsyntax-only -verify %s
// Core issue 150: Template template parameters and default arguments
template<typename T, typename U>
struct is_same {
static const bool value = false;
};
template<typename T>
struct is_same<T, T> {
static const bool value = true;
};
namespace PR9353 {
template<class _T, class Traits> class IM;
template <class T, class Trt,
template<class _T, class Traits = int> class IntervalMap>
void foo(IntervalMap<T,Trt>* m) { typedef IntervalMap<int> type; }
void f(IM<int, int>* m) { foo(m); }
}
namespace PR9400 {
template<template <typename T, typename = T > class U> struct A
{
template<int> U<int> foo();
};
template <typename T, typename = T>
struct s {
};
void f() {
A<s> x;
x.foo<2>();
}
}
namespace MultiReplace {
template<typename Z,
template<typename T, typename U = T *, typename V = U const> class TT>
struct X {
typedef TT<Z> type;
};
template<typename T, typename = int, typename = float>
struct Y { };
int check0[is_same<X<int, Y>::type, Y<int, int*, int* const> >::value? 1 : -1];
}
namespace MultiReplacePartial {
template<typename First, typename Z,
template<typename T, typename U = T *, typename V = U const> class TT>
struct X {
typedef TT<Z> type;
};
template<typename Z,
template<typename T, typename U = T *, typename V = U const> class TT>
struct X<int, Z, TT> {
typedef TT<Z> type;
};
template<typename T, typename = int, typename = float>
struct Y { };
int check0[is_same<X<int, int, Y>::type, Y<int, int*, int* const> >::value? 1 : -1];
}
namespace PR9016 {
template<typename > struct allocator ;
template<typename > struct less ;
template<class T, template<class> class Compare, class Default,
template<class> class Alloc>
struct interval_set { };
template <class X, template<class> class = less> struct interval_type_default {
typedef X type;
};
template <class T,
template<class _T, template<class> class Compare = less,
class = typename interval_type_default<_T,Compare>::type,
template<class> class = allocator> class IntervalSet>
struct ZZZ
{
IntervalSet<T> IntervalSetT;
};
void test() {
ZZZ<int, interval_set> zzz;
}
}