xref: /aosp_15_r20/external/clang/test/SemaTemplate/issue150.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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