1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s 2*67e74705SXin Li // expected-no-diagnostics 3*67e74705SXin Li 4*67e74705SXin Li // Core issue 150: Template template parameters and default arguments 5*67e74705SXin Li 6*67e74705SXin Li template<typename T, typename U> 7*67e74705SXin Li struct is_same { 8*67e74705SXin Li static const bool value = false; 9*67e74705SXin Li }; 10*67e74705SXin Li 11*67e74705SXin Li template<typename T> 12*67e74705SXin Li struct is_same<T, T> { 13*67e74705SXin Li static const bool value = true; 14*67e74705SXin Li }; 15*67e74705SXin Li 16*67e74705SXin Li namespace PR9353 { 17*67e74705SXin Li template<class _T, class Traits> class IM; 18*67e74705SXin Li 19*67e74705SXin Li template <class T, class Trt, 20*67e74705SXin Li template<class _T, class Traits = int> class IntervalMap> foo(IntervalMap<T,Trt> * m)21*67e74705SXin Li void foo(IntervalMap<T,Trt>* m) { typedef IntervalMap<int> type; } 22*67e74705SXin Li f(IM<int,int> * m)23*67e74705SXin Li void f(IM<int, int>* m) { foo(m); } 24*67e74705SXin Li } 25*67e74705SXin Li 26*67e74705SXin Li namespace PR9400 { 27*67e74705SXin Li template<template <typename T, typename = T > class U> struct A 28*67e74705SXin Li { 29*67e74705SXin Li template<int> U<int> foo(); 30*67e74705SXin Li }; 31*67e74705SXin Li 32*67e74705SXin Li template <typename T, typename = T> 33*67e74705SXin Li struct s { 34*67e74705SXin Li }; 35*67e74705SXin Li f()36*67e74705SXin Li void f() { 37*67e74705SXin Li A<s> x; 38*67e74705SXin Li x.foo<2>(); 39*67e74705SXin Li } 40*67e74705SXin Li } 41*67e74705SXin Li 42*67e74705SXin Li namespace MultiReplace { 43*67e74705SXin Li template<typename Z, 44*67e74705SXin Li template<typename T, typename U = T *, typename V = U const> class TT> 45*67e74705SXin Li struct X { 46*67e74705SXin Li typedef TT<Z> type; 47*67e74705SXin Li }; 48*67e74705SXin Li 49*67e74705SXin Li template<typename T, typename = int, typename = float> 50*67e74705SXin Li struct Y { }; 51*67e74705SXin Li 52*67e74705SXin Li int check0[is_same<X<int, Y>::type, Y<int, int*, int* const> >::value? 1 : -1]; 53*67e74705SXin Li } 54*67e74705SXin Li 55*67e74705SXin Li namespace MultiReplacePartial { 56*67e74705SXin Li template<typename First, typename Z, 57*67e74705SXin Li template<typename T, typename U = T *, typename V = U const> class TT> 58*67e74705SXin Li struct X { 59*67e74705SXin Li typedef TT<Z> type; 60*67e74705SXin Li }; 61*67e74705SXin Li 62*67e74705SXin Li template<typename Z, 63*67e74705SXin Li template<typename T, typename U = T *, typename V = U const> class TT> 64*67e74705SXin Li struct X<int, Z, TT> { 65*67e74705SXin Li typedef TT<Z> type; 66*67e74705SXin Li }; 67*67e74705SXin Li 68*67e74705SXin Li template<typename T, typename = int, typename = float> 69*67e74705SXin Li struct Y { }; 70*67e74705SXin Li 71*67e74705SXin Li int check0[is_same<X<int, int, Y>::type, Y<int, int*, int* const> >::value? 1 : -1]; 72*67e74705SXin Li } 73*67e74705SXin Li 74*67e74705SXin Li namespace PR9016 { 75*67e74705SXin Li template<typename > struct allocator ; 76*67e74705SXin Li template<typename > struct less ; 77*67e74705SXin Li 78*67e74705SXin Li template<class T, template<class> class Compare, class Default, 79*67e74705SXin Li template<class> class Alloc> 80*67e74705SXin Li struct interval_set { }; 81*67e74705SXin Li 82*67e74705SXin Li template <class X, template<class> class = less> struct interval_type_default { 83*67e74705SXin Li typedef X type; 84*67e74705SXin Li }; 85*67e74705SXin Li 86*67e74705SXin Li template <class T, 87*67e74705SXin Li template<class _T, template<class> class Compare = PR9016::less, 88*67e74705SXin Li class = typename interval_type_default<_T,Compare>::type, 89*67e74705SXin Li template<class> class = allocator> class IntervalSet> 90*67e74705SXin Li struct ZZZ 91*67e74705SXin Li { 92*67e74705SXin Li IntervalSet<T> IntervalSetT; 93*67e74705SXin Li }; 94*67e74705SXin Li 95*67e74705SXin Li template <class T, 96*67e74705SXin Li template<class _T, template<class> class Compare = PR9016::less, 97*67e74705SXin Li class = typename interval_type_default<_T,Compare>::type, 98*67e74705SXin Li template<class> class = allocator> class IntervalSet> int40()99*67e74705SXin Li void int40() 100*67e74705SXin Li { 101*67e74705SXin Li IntervalSet<T> IntervalSetT; 102*67e74705SXin Li } 103*67e74705SXin Li test()104*67e74705SXin Li void test() { 105*67e74705SXin Li ZZZ<int, interval_set> zzz; 106*67e74705SXin Li int40<int, interval_set>(); 107*67e74705SXin Li } 108*67e74705SXin Li } 109