diff options
Diffstat (limited to 'gcc/testsuite/g++.dg/cpp0x')
34 files changed, 519 insertions, 2 deletions
diff --git a/gcc/testsuite/g++.dg/cpp0x/Wunused-variable-1.C b/gcc/testsuite/g++.dg/cpp0x/Wunused-variable-1.C new file mode 100644 index 0000000000..39592b26a5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/Wunused-variable-1.C @@ -0,0 +1,37 @@ +// PR c++/71442 +// { dg-do compile { target c++11 } } +// { dg-options "-Wunused-variable" } + +struct C +{ + template<typename... Ts> + int operator()(Ts &&...) + { + return sizeof...(Ts); + } +}; + +int +foo () +{ + C {} (1, 1L, 1LL, 1.0); +} + +template<int N> +void +bar () +{ + char a; // { dg-warning "unused variable" } + short b; // { dg-warning "unused variable" } + int c; // { dg-warning "unused variable" } + long d; // { dg-warning "unused variable" } + long long e; // { dg-warning "unused variable" } + float f; // { dg-warning "unused variable" } + double g; // { dg-warning "unused variable" } +} + +void +baz () +{ + bar <0> (); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-55.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-55.C new file mode 100644 index 0000000000..135ff53290 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-55.C @@ -0,0 +1,23 @@ +// PR c++/71718 +// { dg-do compile { target c++11 } } + +template <typename T> +class A : T{}; + +template <typename T> +using sp = A<T>; + +struct Base {}; + +template <typename T, int num = 1> +const sp<T> +rec() // { dg-error "depth" } +{ + return rec<T, num - 1>(); +} + +static void f(void) { + rec<Base>(); +} + +// { dg-prune-output "compilation terminated" } diff --git a/gcc/testsuite/g++.dg/cpp0x/alignas7.C b/gcc/testsuite/g++.dg/cpp0x/alignas7.C new file mode 100644 index 0000000000..4ea1252685 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alignas7.C @@ -0,0 +1,13 @@ +// PR c++/71513 +// { dg-do compile { target c++11 } } + +template < int N, typename T > +struct A +{ + enum alignas (N) E : T; +}; + +#define SA(X) static_assert((X), #X) + +constexpr int al = alignof(double); +SA(alignof(A<al,char>::E) == al); diff --git a/gcc/testsuite/g++.dg/cpp0x/auto48.C b/gcc/testsuite/g++.dg/cpp0x/auto48.C new file mode 100644 index 0000000000..3e0b9ff601 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto48.C @@ -0,0 +1,8 @@ +// PR c++/70540 +// { dg-do compile { target c++11 } } + +void +foo () +{ + auto f = [&] { return f; }; // { dg-error "before deduction" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-71828.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-71828.C new file mode 100644 index 0000000000..b74cde965f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-71828.C @@ -0,0 +1,5 @@ +// PR c++/71828 +// { dg-do compile { target c++11 } } + +constexpr _Complex int a { 1, 2 }; +static_assert (& __imag a != &__real a, ""); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-array16.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-array16.C new file mode 100644 index 0000000000..af2e58d142 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-array16.C @@ -0,0 +1,23 @@ +// PR c++/71166 +// { dg-do compile { target c++11 } } + +struct Foo { int value; }; + +constexpr Foo MakeFoo() { return Foo{0}; } + +struct Bar { + Foo color = MakeFoo(); +}; + +struct BarContainer { + Bar array[1]; +}; + +Foo X () +{ + return MakeFoo (); +} + +void Foo() { + new BarContainer(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-array17.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-array17.C new file mode 100644 index 0000000000..c6afa507f0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-array17.C @@ -0,0 +1,61 @@ +// PR c++/71092 +// { dg-do compile { target c++11 } } + +template <typename _Default> struct A { using type = _Default; }; +template <typename _Default, template <typename> class> +using __detected_or = A<_Default>; +template <typename _Default, template <typename> class _Op> +using __detected_or_t = typename __detected_or<_Default, _Op>::type; +template <typename _Tp> struct B { typedef _Tp value_type; }; +struct C { + template <typename _Tp> using __pointer = typename _Tp::pointer; +}; +template <typename _Alloc> struct J : C { + using pointer = __detected_or_t<typename _Alloc::value_type *, __pointer>; +}; +template <typename _T1> void _Construct(_T1 *) { new _T1; } +struct D { + template <typename _ForwardIterator, typename _Size> + static _ForwardIterator __uninit_default_n(_ForwardIterator p1, _Size) { + _Construct(p1); + } +}; +template <typename _ForwardIterator, typename _Size> +void __uninitialized_default_n(_ForwardIterator p1, _Size) { + D::__uninit_default_n(p1, 0); +} +template <typename _ForwardIterator, typename _Size, typename _Tp> +void __uninitialized_default_n_a(_ForwardIterator p1, _Size, _Tp) { + __uninitialized_default_n(p1, 0); +} +template <typename> struct __shared_ptr { + constexpr __shared_ptr() : _M_ptr(), _M_refcount() {} + int _M_ptr; + int _M_refcount; +}; +template <typename _Alloc> struct F { + typedef _Alloc _Tp_alloc_type; + struct G { + typename J<_Tp_alloc_type>::pointer _M_start; + G(_Tp_alloc_type); + }; + F(int, _Alloc p2) : _M_impl(p2) {} + G _M_impl; +}; +template <typename _Tp, typename _Alloc = B<_Tp>> struct K : F<_Alloc> { + typedef _Alloc allocator_type; + K(int, allocator_type p2 = allocator_type()) : F<_Alloc>(0, p2) { + __uninitialized_default_n_a(this->_M_impl._M_start, 0, 0); + } +}; +struct H { + H(); + struct I { + __shared_ptr<int> trigger[1]; + }; + __shared_ptr<int> resetTrigger_; + K<I> states_; + __shared_ptr<int> triggerManager_; +}; +__shared_ptr<int> a; +H::H() : states_(0), triggerManager_(a) {} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-list1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-list1.C new file mode 100644 index 0000000000..f831a112cc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-list1.C @@ -0,0 +1,15 @@ +// PR c++/72457 +// { dg-do compile { target c++11 } } + +struct A { + int i; + constexpr A(): i(0) {} +}; + +struct B: A { }; + +struct C +{ + B b; + constexpr C() : b{} {} +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem6.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem6.C new file mode 100644 index 0000000000..ed18ab1a63 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem6.C @@ -0,0 +1,13 @@ +// PR c++/71896 +// { dg-do compile { target c++11 } } + +struct Foo { + int x; +}; + +constexpr bool compare(int Foo::*t) { return t == &Foo::x; } + +constexpr bool b = compare(&Foo::x); + +#define SA(X) static_assert ((X),#X) +SA(b); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-recursion2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-recursion2.C index 978b998afe..ce2280c856 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-recursion2.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-recursion2.C @@ -1,5 +1,6 @@ // PR c++/70344 // { dg-do compile { target c++11 } } +// { dg-options -O } struct Z { diff --git a/gcc/testsuite/g++.dg/cpp0x/conv-tmpl1.C b/gcc/testsuite/g++.dg/cpp0x/conv-tmpl1.C index 7f866daf4e..eb40dd66a5 100644 --- a/gcc/testsuite/g++.dg/cpp0x/conv-tmpl1.C +++ b/gcc/testsuite/g++.dg/cpp0x/conv-tmpl1.C @@ -1,3 +1,4 @@ +// Test for Core 2189. // { dg-do compile { target c++11 } } template <class T> diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype65.C b/gcc/testsuite/g++.dg/cpp0x/decltype65.C new file mode 100644 index 0000000000..6873488168 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype65.C @@ -0,0 +1,11 @@ +// PR c++/71511 +// { dg-do compile { target c++11 } } + +template < typename T > +class A +{ + static int i; +}; + +//okay: template < typename T > int A <T>::i = 100; +template < typename T > int decltype (A < T > ())::i = 100; // { dg-error "decltype" } diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype66.C b/gcc/testsuite/g++.dg/cpp0x/decltype66.C new file mode 100644 index 0000000000..76ff1e2e7b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype66.C @@ -0,0 +1,19 @@ +// PR c++/71350 +// { dg-do compile { target c++11 } } + +template<typename T, unsigned int N> +struct Array +{ + T data[N]; +}; + +template<typename T> +struct Foo +{ + int operator[](const Array<int, 2>& i) const { return 0; } + auto bar() -> decltype((*this)[{1,2}] * 0) { + return *this; // { dg-error "cannot convert" } + } +}; + +template struct Foo<int>; diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor20.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor20.C new file mode 100644 index 0000000000..f33056df49 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor20.C @@ -0,0 +1,16 @@ +// PR c++/70972 +// { dg-do compile { target c++11 } } + +struct moveonly { + moveonly(moveonly&&) = default; + moveonly() = default; +}; + +struct A { + A(moveonly) {} +}; +struct B : A { + using A::A; +}; + +B b(moveonly{}); diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor21.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor21.C new file mode 100644 index 0000000000..64655068a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor21.C @@ -0,0 +1,19 @@ +// PR c++/70972 +// { dg-do run { target c++11 } } + +struct abort_on_copy{ + abort_on_copy(abort_on_copy&&) = default; + abort_on_copy(const abort_on_copy&) { __builtin_abort(); } + abort_on_copy() = default; +}; + +struct A { + A(abort_on_copy) {} +}; +struct B : A { + using A::A; +}; + +int main() { + B b(abort_on_copy{}); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-base2.C b/gcc/testsuite/g++.dg/cpp0x/initlist-base2.C new file mode 100644 index 0000000000..68ccad908c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist-base2.C @@ -0,0 +1,21 @@ +// PR c++/55922 +// { dg-do run { target c++11 } } + +bool called = false; + +struct Base { + Base() { if (called) throw 1; called = true; } +}; + +struct B1 : virtual Base { + B1() { } +}; + +struct C : B1, virtual Base { + C() : B1{} + { } +}; + +int main() { + C c; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-base3.C b/gcc/testsuite/g++.dg/cpp0x/initlist-base3.C new file mode 100644 index 0000000000..9febac304e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist-base3.C @@ -0,0 +1,17 @@ +// PR c++/71774 +// { dg-do compile { target c++11 } } + +class Meow +{ + protected: + Meow() =default; + virtual void f() {} +}; + +class Purr : public Meow +{ + public: + Purr() + : Meow{} + {} +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-template1.C b/gcc/testsuite/g++.dg/cpp0x/initlist-template1.C new file mode 100644 index 0000000000..a24e205d71 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist-template1.C @@ -0,0 +1,15 @@ +// PR c++/70824 +// { dg-do compile { target c++11 } } + +#include <initializer_list> + +constexpr +int +max(std::initializer_list<int> __l) +{ return *__l.begin(); } + +template <class Src> +void +a() { + const int v = max({1}); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv11.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv11.C new file mode 100644 index 0000000000..4b8d6487f5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv11.C @@ -0,0 +1,10 @@ +// PR c++/71105 +// { dg-do compile { target c++11 } } + +void foo() +{ + int i; + static_cast<void(*)()>([i]{}); // { dg-error "invalid static_cast" } + static_cast<void(*)()>([=]{}); // { dg-error "invalid static_cast" } + static_cast<void(*)()>([&]{}); // { dg-error "invalid static_cast" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce3.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce3.C new file mode 100644 index 0000000000..68ac29c9ea --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce3.C @@ -0,0 +1,15 @@ +// PR c++/69223 +// { dg-do compile { target c++11 } } + +template <class T> struct A +{ + T x[20]; +}; + +int main() +{ + auto l = [](const A<int>& i){ return i; }; + A<int> a; + + l(a); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice16.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice16.C new file mode 100644 index 0000000000..f7dea7ca65 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice16.C @@ -0,0 +1,8 @@ +// PR c++/70781 +// { dg-do compile { target c++11 } } + +template < typename T > +void foo () +{ + T ([=] (S) { [=] {}; }); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr68724.C b/gcc/testsuite/g++.dg/cpp0x/pr68724.C new file mode 100644 index 0000000000..ff6d84dc3f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr68724.C @@ -0,0 +1,15 @@ +// PR 68724 ICE in unificiation +// { dg-do compile { target c++11 } } + +template <typename _Tp, _Tp> +struct integral_constant +{ +}; + +integral_constant<bool, true> inst; + +template <typename _Tp> +struct integral_constant<bool, __is_enum(_Tp)> // { dg-error "" } +{ +}; + diff --git a/gcc/testsuite/g++.dg/cpp0x/pr70869.C b/gcc/testsuite/g++.dg/cpp0x/pr70869.C new file mode 100644 index 0000000000..84c532b677 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr70869.C @@ -0,0 +1,25 @@ +// PR c++/70869 +// { dg-do run { target c++11 } } + +#include <initializer_list> + +struct A +{ + int f () { return 1; } + int g () { return 2; } + int h () { return 3; } +}; + +int +main () +{ + int cnt = 0; + for (const auto &m : { &A::f, &A::g, &A::h }) + { + A a; + if ((a.*m) () != ++cnt) + __builtin_abort (); + } + if (cnt != 3) + __builtin_abort (); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr71054.C b/gcc/testsuite/g++.dg/cpp0x/pr71054.C new file mode 100644 index 0000000000..518bafcbd2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr71054.C @@ -0,0 +1,21 @@ +// PR c++/71054 +// { dg-do compile { target c++11 } } + +#include <initializer_list> + +template <typename D, typename T = decltype (&D::U)> +struct S +{ + struct A + { + int a; + int b; + T p; + }; + S () { std::initializer_list<A> a{ {0, 0, &D::V} }; } +}; +struct R { + void V (int); + void U (int); +}; +S<R> b; diff --git a/gcc/testsuite/g++.dg/cpp0x/pr71739.C b/gcc/testsuite/g++.dg/cpp0x/pr71739.C new file mode 100644 index 0000000000..b31a580cd0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr71739.C @@ -0,0 +1,5 @@ +// PR c++/71739 +// { dg-do compile { target c++11 } } + +template <int N> struct alignas(N) A; +template <int N> struct alignas(N) A {}; diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for31.C b/gcc/testsuite/g++.dg/cpp0x/range-for31.C new file mode 100644 index 0000000000..13daf61923 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for31.C @@ -0,0 +1,9 @@ +// PR c++/71604 +// { dg-do compile { target c++11 } } + +void foo () +{ + int a[2] = { 1, 2 }; + for (struct S { S (int) {} } S : a) // { dg-error "types may not be defined" } + ; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for8.C b/gcc/testsuite/g++.dg/cpp0x/range-for8.C index a389f66f60..38fe4561eb 100644 --- a/gcc/testsuite/g++.dg/cpp0x/range-for8.C +++ b/gcc/testsuite/g++.dg/cpp0x/range-for8.C @@ -7,9 +7,9 @@ void test() { - for (struct S { } *x : { (S*)0, (S*)0 } ) + for (struct S { } *x : { (S*)0, (S*)0 } ) // { dg-error "types may not be defined" } ; - for (struct S { } x : { S(), S() } ) + for (struct S { } x : { S(), S() } ) // { dg-error "types may not be defined" } ; } diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-bitfield3.C b/gcc/testsuite/g++.dg/cpp0x/rv-bitfield3.C new file mode 100644 index 0000000000..6b7cfba0d3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-bitfield3.C @@ -0,0 +1,14 @@ +// PR c++/71576 +// { dg-do compile { target c++11 } } + +template < typename T > T && foo (); + +struct A +{ + int i:5; +}; + +void foo () +{ + int &&j = foo < A > ().i; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae57.C b/gcc/testsuite/g++.dg/cpp0x/sfinae57.C new file mode 100644 index 0000000000..975a330b9b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae57.C @@ -0,0 +1,16 @@ +// PR c++/71495 +// { dg-do compile { target c++11 } } + +struct A; +template <class T> void f(T); // { dg-bogus "initializing" } +template <class T> T&& declval(); +struct B +{ + template <class T, class U> static decltype(f<T>(declval<U>())) g(int); + template <class T, class U> void g(...); +} b; + +int main() +{ + b.g<A,A>(42); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-mangle1a.C b/gcc/testsuite/g++.dg/cpp0x/variadic-mangle1a.C new file mode 100644 index 0000000000..b230ffa656 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-mangle1a.C @@ -0,0 +1,12 @@ +// Test for sZ mangling. +// { dg-do compile { target c++11 } } +// { dg-final { scan-assembler "_Z1fIJidEEv1AIXstDpT_EE" } } +// { dg-options -fabi-version=9 } + +template <int I> struct A { }; +template <typename... Ts> void f(A<sizeof...(Ts)>); + +int main() +{ + f<int,double>(A<2>()); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-mangle2a.C b/gcc/testsuite/g++.dg/cpp0x/variadic-mangle2a.C new file mode 100644 index 0000000000..3ac1517670 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-mangle2a.C @@ -0,0 +1,19 @@ +// Testcase from cxx-abi-dev. +// { dg-do compile { target c++11 } } +// { dg-options "-fabi-version=9" } + +struct A { + template<int...T> using N = int[sizeof...(T)]; + template<int...A> void f(N<A...> &); + + template<typename...T> using M = int[sizeof...(T)]; + template<typename...A> void g(M<A...> &); +}; +void g(A a) +{ + int arr[3]; + // { dg-final { scan-assembler "_ZN1A1fIJLi1ELi2ELi3EEEEvRAszspT__i" } } + a.f<1,2,3>(arr); + // { dg-final { scan-assembler "_ZN1A1gIJiiiEEEvRAstDpT__i" } } + a.g<int,int,int>(arr); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-mangle3.C b/gcc/testsuite/g++.dg/cpp0x/variadic-mangle3.C new file mode 100644 index 0000000000..f239ef717d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-mangle3.C @@ -0,0 +1,10 @@ +// Testcase from cxx-abi-dev. +// { dg-do compile { target c++11 } } +// { dg-final { scan-assembler "_ZN1A1fIJiiEiJiiiEEEvRAsPDpT_T0_DpT1_E_iS3_S5_" } } + +struct A { + template<typename...T> using N = int[sizeof...(T)]; + template<typename...A, typename B, typename...C> + void f(N<A..., B, C...> &, B, C...); +}; +void g(A a) { int arr[6]; a.f<int, int>(arr, 1, 2, 3, 4); } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-mangle3a.C b/gcc/testsuite/g++.dg/cpp0x/variadic-mangle3a.C new file mode 100644 index 0000000000..eba8f591c3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-mangle3a.C @@ -0,0 +1,11 @@ +// Testcase from cxx-abi-dev. +// { dg-do compile { target c++11 } } +// { dg-options -fabi-version=9 } +// { dg-final { scan-assembler "_ZN1A1fIJiiEiJiiiEEEvRAstDpT1__iT0_S2_" } } + +struct A { + template<typename...T> using N = int[sizeof...(T)]; + template<typename...A, typename B, typename...C> + void f(N<A..., B, C...> &, B, C...); +}; +void g(A a) { int arr[6]; a.f<int, int>(arr, 1, 2, 3, 4); } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-nested1.C b/gcc/testsuite/g++.dg/cpp0x/variadic-nested1.C new file mode 100644 index 0000000000..abfb49a712 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-nested1.C @@ -0,0 +1,9 @@ +// PR c++/71833 +// { dg-do compile { target c++11 } } + +template < typename ... Ts > struct A +{ + template < Ts ..., typename ... Us > struct B {}; +}; + +A <>::B < int > e; |