Merge with main truk.
[official-gcc.git] / gcc / testsuite / g++.dg / cpp0x / alias-decl-dr1286a.C
blob1780c9a47b79e254439b17511ba75b068510df34
1 // DR 1286
2 // { dg-do compile { target c++11 } }
4 template <class,class> struct same;
5 template <class T> struct same<T,T> {};
7 template <class,class> struct different {};
8 template <class T> struct different<T,T>;
10 template<typename T, typename U = T> struct A;
11 template<template <class...> class> struct X;
13 // equivalent to A
14 template<typename V, typename W>
15 using B = A<V, W>;
17 same<X<A>,X<B>> s1;
19 // not equivalent to A: not all parameters used
20 template<typename V, typename W>
21 using C = A<V>;
23 different<X<A>,X<C>> d1;
25 // not equivalent to A: different number of parameters
26 template<typename V>
27 using D = A<V>;
29 different<X<A>,X<D>> d2;
31 // not equivalent to A: template-arguments in wrong order
32 template<typename V, typename W>
33 using E = A<W, V>;
35 different<X<A>,X<E>> d3;
37 // equivalent to A: default arguments not considered
38 template<typename V, typename W = int>
39 using F = A<V, W>;
41 same<X<A>,X<F>> s2;
43 // equivalent to A and B
44 template<typename V, typename W>
45 using G = A<V, W>;
47 same<X<A>,X<G>> s3;
48 same<X<B>,X<G>> s3b;
50 // equivalent to E
51 template<typename V, typename W>
52 using H = E<V, W>;
54 same<X<E>,X<H>> s4;
56 // not equivalent to A: argument not identifier
57 template<typename V, typename W>
58 using I = A<V, typename W::type>;
60 different<X<A>,X<I>> d4;