1 // RUN: %clang_cc1 -fsyntax-only -verify %s
3 // Core issue 150: Template template parameters and default arguments
5 template<typename T
, typename U
>
7 static const bool value
= false;
11 struct is_same
<T
, T
> {
12 static const bool value
= true;
16 template<class _T
, class Traits
> class IM
;
18 template <class T
, class Trt
,
19 template<class _T
, class Traits
= int> class IntervalMap
>
20 void foo(IntervalMap
<T
,Trt
>* m
) { typedef IntervalMap
<int> type
; }
22 void f(IM
<int, int>* m
) { foo(m
); }
26 template<template <typename T
, typename
= T
> class U
> struct A
28 template<int> U
<int> foo();
31 template <typename T
, typename
= T
>
41 namespace MultiReplace
{
43 template<typename T
, typename U
= T
*, typename V
= U
const> class TT
>
48 template<typename T
, typename
= int, typename
= float>
51 int check0
[is_same
<X
<int, Y
>::type
, Y
<int, int*, int* const> >::value
? 1 : -1];
54 namespace MultiReplacePartial
{
55 template<typename First
, typename Z
,
56 template<typename T
, typename U
= T
*, typename V
= U
const> class TT
>
62 template<typename T
, typename U
= T
*, typename V
= U
const> class TT
>
63 struct X
<int, Z
, TT
> {
67 template<typename T
, typename
= int, typename
= float>
70 int check0
[is_same
<X
<int, int, Y
>::type
, Y
<int, int*, int* const> >::value
? 1 : -1];
74 template<typename
> struct allocator
;
75 template<typename
> struct less
;
77 template<class T
, template<class> class Compare
, class Default
,
78 template<class> class Alloc
>
79 struct interval_set
{ };
81 template <class X
, template<class> class = less
> struct interval_type_default
{
86 template<class _T
, template<class> class Compare
= PR9016::less
,
87 class = typename interval_type_default
<_T
,Compare
>::type
,
88 template<class> class = allocator
> class IntervalSet
>
91 IntervalSet
<T
> IntervalSetT
;
95 template<class _T
, template<class> class Compare
= PR9016::less
,
96 class = typename interval_type_default
<_T
,Compare
>::type
,
97 template<class> class = allocator
> class IntervalSet
>
100 IntervalSet
<T
> IntervalSetT
;
104 ZZZ
<int, interval_set
> zzz
;
105 int40
<int, interval_set
>();