add opensuse toolchain support, patch by Ismail Donmez!
[clang/stm8.git] / test / SemaTemplate / issue150.cpp
blobaf3b93c907c1418ff48fcf9bcc04b407c9b4276f
1 // RUN: %clang_cc1 -fsyntax-only -verify %s
3 // Core issue 150: Template template parameters and default arguments
5 template<typename T, typename U>
6 struct is_same {
7 static const bool value = false;
8 };
10 template<typename T>
11 struct is_same<T, T> {
12 static const bool value = true;
15 namespace PR9353 {
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); }
25 namespace PR9400 {
26 template<template <typename T, typename = T > class U> struct A
28 template<int> U<int> foo();
31 template <typename T, typename = T>
32 struct s {
35 void f() {
36 A<s> x;
37 x.foo<2>();
41 namespace MultiReplace {
42 template<typename Z,
43 template<typename T, typename U = T *, typename V = U const> class TT>
44 struct X {
45 typedef TT<Z> type;
48 template<typename T, typename = int, typename = float>
49 struct Y { };
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>
57 struct X {
58 typedef TT<Z> type;
61 template<typename Z,
62 template<typename T, typename U = T *, typename V = U const> class TT>
63 struct X<int, Z, TT> {
64 typedef TT<Z> type;
67 template<typename T, typename = int, typename = float>
68 struct Y { };
70 int check0[is_same<X<int, int, Y>::type, Y<int, int*, int* const> >::value? 1 : -1];
73 namespace PR9016 {
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 {
82 typedef X type;
85 template <class T,
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>
89 struct ZZZ
91 IntervalSet<T> IntervalSetT;
94 template <class T,
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>
98 void int40()
100 IntervalSet<T> IntervalSetT;
103 void test() {
104 ZZZ<int, interval_set> zzz;
105 int40<int, interval_set>();