| // RUN: %clang_cc1 -fsyntax-only -verify %s |
| // expected-no-diagnostics |
| |
| // 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 = PR9016::less, |
| class = typename interval_type_default<_T,Compare>::type, |
| template<class> class = allocator> class IntervalSet> |
| struct ZZZ |
| { |
| IntervalSet<T> IntervalSetT; |
| }; |
| |
| template <class T, |
| template<class _T, template<class> class Compare = PR9016::less, |
| class = typename interval_type_default<_T,Compare>::type, |
| template<class> class = allocator> class IntervalSet> |
| void int40() |
| { |
| IntervalSet<T> IntervalSetT; |
| } |
| |
| void test() { |
| ZZZ<int, interval_set> zzz; |
| int40<int, interval_set>(); |
| } |
| } |