| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- // 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>();
- }
- }
|