diff options
author | dim <dim@FreeBSD.org> | 2011-05-02 19:39:53 +0000 |
---|---|---|
committer | dim <dim@FreeBSD.org> | 2011-05-02 19:39:53 +0000 |
commit | 110eaaceddcec790f7e6a5e3bf1261c9aa1e73ab (patch) | |
tree | 64a10f4c4154739d4a8191d7e1b52ce497f4ebd6 /test/SemaTemplate/issue150.cpp | |
parent | a0fb00f9837bd0d2e5948f16f6a6b82a7a628f51 (diff) | |
download | FreeBSD-src-110eaaceddcec790f7e6a5e3bf1261c9aa1e73ab.zip FreeBSD-src-110eaaceddcec790f7e6a5e3bf1261c9aa1e73ab.tar.gz |
Vendor import of clang trunk r130700:
http://llvm.org/svn/llvm-project/cfe/trunk@130700
Diffstat (limited to 'test/SemaTemplate/issue150.cpp')
-rw-r--r-- | test/SemaTemplate/issue150.cpp | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/test/SemaTemplate/issue150.cpp b/test/SemaTemplate/issue150.cpp new file mode 100644 index 0000000..af3b93c --- /dev/null +++ b/test/SemaTemplate/issue150.cpp @@ -0,0 +1,107 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +// 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>(); + } +} |