diff options
Diffstat (limited to 'gcc/testsuite/g++.dg/cpp0x')
33 files changed, 400 insertions, 16 deletions
diff --git a/gcc/testsuite/g++.dg/cpp0x/auto3.C b/gcc/testsuite/g++.dg/cpp0x/auto3.C index 3cea856e601..f792c07b169 100644 --- a/gcc/testsuite/g++.dg/cpp0x/auto3.C +++ b/gcc/testsuite/g++.dg/cpp0x/auto3.C @@ -7,7 +7,7 @@ auto x; // { dg-error "auto" } // If the type deduced for the template parameter U is not the same in each // deduction, the program is ill-formed. -auto i = 42, j = 42.0; // { dg-error "" "" { xfail *-*-* } } +auto i = 42, j = 42.0; // { dg-error "auto" } // New CWG issue auto a[2] = { 1, 2 }; // { dg-error "auto" } diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype18.C b/gcc/testsuite/g++.dg/cpp0x/decltype18.C new file mode 100644 index 00000000000..0d44586e9d2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype18.C @@ -0,0 +1,5 @@ +// PR c++/37875 +// { dg-options "-std=c++0x" } + +template <typename> struct X {}; +X<decltype(1 > 2)> x; diff --git a/gcc/testsuite/g++.dg/cpp0x/deduce.C b/gcc/testsuite/g++.dg/cpp0x/deduce.C index 6bd05160898..635228cca08 100644 --- a/gcc/testsuite/g++.dg/cpp0x/deduce.C +++ b/gcc/testsuite/g++.dg/cpp0x/deduce.C @@ -5,7 +5,7 @@ template<typename T> struct same_type<T, T> {}; int lval_int; int rval_int(); int const lval_const_int=0; -int const rval_const_int(); +int const&& rval_const_int(); template <typename T> void deduce_lval_int(T && t) { diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted14.C b/gcc/testsuite/g++.dg/cpp0x/defaulted14.C new file mode 100644 index 00000000000..235e646780a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted14.C @@ -0,0 +1,18 @@ +// PR c++/39866 +// { dg-options "-std=c++0x" } + +struct A { + A& operator=(const A&) = delete; // { dg-bogus "" } + + void operator=(int) {} // { dg-message "" } + void operator=(char) {} // { dg-message "" } +}; + +struct B {}; + +int main() +{ + A a; + a = B(); // { dg-error "no match" } + a = 1.0; // { dg-error "ambiguous" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted15.C b/gcc/testsuite/g++.dg/cpp0x/defaulted15.C new file mode 100644 index 00000000000..092b5605901 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted15.C @@ -0,0 +1,43 @@ +// PR c++/38796 +// { dg-options -std=c++0x } + +struct A +{ + A (int); + A (const A& = 1) = default; // { dg-error "default argument" } + void operator= (const A&) = default; // { dg-error "defaulted|match" } +}; + +struct B +{ +private: + B() = default; // { dg-error "access" } +}; + +struct C +{ +protected: + ~C() = default; // { dg-error "access" } +}; + +struct D +{ +private: + D& operator= (const D&) = default; // { dg-error "access" } +}; + +struct E +{ + explicit E (const E&) = default; // { dg-error "explicit" } +}; + +struct F +{ + F(F&) = default; // { dg-error "non-const" } +}; + +struct G: public F +{ + // Can't be const because F copy ctor isn't. + G(const G&) = default; // { dg-error "const" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted16.C b/gcc/testsuite/g++.dg/cpp0x/defaulted16.C new file mode 100644 index 00000000000..741b43de27d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted16.C @@ -0,0 +1,13 @@ +// Test that non-inline default causes the function to be defined even if +// it isn't used. + +// { dg-options -std=c++0x } +// { dg-final { scan-assembler "_ZN1AC1Ev" } } + +struct A +{ + A(); +}; + +A::A() = default; + diff --git a/gcc/testsuite/g++.dg/cpp0x/explicit4.C b/gcc/testsuite/g++.dg/cpp0x/explicit4.C new file mode 100644 index 00000000000..74726a99cad --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/explicit4.C @@ -0,0 +1,17 @@ +// Negative explicit conv test. +// { dg-options "-std=c++0x" } + +struct A { + A(const A&, int = 0); // { dg-message "candidates" } +}; +struct B +{ + explicit operator A(); +}; + +int main() +{ + B b; + (A(b)); // OK + (A(b,1)); // { dg-error "no match" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg1.C b/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg1.C new file mode 100644 index 00000000000..25192ad8672 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg1.C @@ -0,0 +1,7 @@ +// PR c++/37766 +// { dg-options -std=c++0x } + +int a = 1; +template<int& b = a> void f() { + f<>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist25.C b/gcc/testsuite/g++.dg/cpp0x/initlist25.C new file mode 100644 index 00000000000..8e5e0065cfc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist25.C @@ -0,0 +1,17 @@ +// PR c++/41754 +// { dg-options -std=c++0x } +// { dg-do run } + +#include <map> +#include <string> +#include <iostream> + +using namespace std; + +int main() +{ + map<string, string> m; + m.insert({{"t", "t"}, {"y", "y"}}); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/inline-ns1.C b/gcc/testsuite/g++.dg/cpp0x/inline-ns1.C new file mode 100644 index 00000000000..e422d8970f1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inline-ns1.C @@ -0,0 +1,12 @@ +// { dg-options -std=c++0x } +// { dg-final { scan-assembler "_ZN1Q2V11fEv" } } +// { dg-final { scan-assembler "_ZN1Q2V11iE" } } + +namespace Q { + inline namespace V1 { + extern int i; + void f(); + } +} +int Q::i = 1; +void Q::f() { } diff --git a/gcc/testsuite/g++.dg/cpp0x/inline-ns2.C b/gcc/testsuite/g++.dg/cpp0x/inline-ns2.C new file mode 100644 index 00000000000..03851725bbd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inline-ns2.C @@ -0,0 +1,25 @@ +// { dg-options -std=c++0x } + +namespace Q { + inline namespace V1 { + extern int i; // { dg-error "" } + extern int j; // { dg-error "" } + void f(); // { dg-error "" } + void g(); // { dg-error "" } + } + inline namespace V2 { + extern int j; // { dg-error "" } + void g(); // { dg-error "" } + } + extern int i; // { dg-error "" } + void f(); // { dg-error "" } + void h(); +} +namespace R { + using namespace Q; +} +int Q::i = 1; // { dg-error "ambiguous" } +int Q::j = 1; // { dg-error "ambiguous" } +void Q::f() { } // { dg-error "ambiguous" } +void Q::g() { } // { dg-error "ambiguous" } +void R::h() { } // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/cpp0x/inline-ns3.C b/gcc/testsuite/g++.dg/cpp0x/inline-ns3.C new file mode 100644 index 00000000000..8981a57ac4c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inline-ns3.C @@ -0,0 +1,24 @@ +namespace C +{ + void f(); +} + +namespace B +{ + using namespace C; + + inline namespace B1 + { + void f(); + } +} + +namespace A +{ + using namespace B; +} + +int main() +{ + A::f(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const-neg.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const-neg.C index f48c6c243d6..0e329e5e161 100644 --- a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const-neg.C +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const-neg.C @@ -3,11 +3,11 @@ #include <cassert> template<typename F> -void call(const F& f) { f(); } // { dg-error "discards qualifiers" } +void call(const F& f) { f(); } int main() { call([] () -> void {}); - call([] () mutable -> void {}); // { dg-message "" "`f' does not have const `operator()'" } + call([] () mutable -> void {}); // { dg-message "" "declared mutable" } int i = -1; call([&i] () -> void { i = 0; }); diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv.C new file mode 100644 index 00000000000..e308248b657 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv.C @@ -0,0 +1,6 @@ +// { dg-options -std=c++0x } + +int main() +{ + void (*pfn)() = []{}; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-direct-init.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-direct-init.C new file mode 100644 index 00000000000..bbc2a1ca52d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-direct-init.C @@ -0,0 +1,14 @@ +// Test that capture by copy uses direct-initialization. +// { dg-options "-std=c++0x" } + +struct A +{ + A(); + explicit A(const A&); +}; + +int main() +{ + A a; + [a]{}; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-init.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-init.C new file mode 100644 index 00000000000..03c94e95981 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-init.C @@ -0,0 +1,8 @@ +// Test for the explicit initializer extension +// { dg-options "-std=c++0x" } + +int main() +{ + int j = [i = 2]{sizeof(i); return i;}(); + return (j != 2); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle.C index dc89d2388fb..aa7462b4fcf 100644 --- a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle.C +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle.C @@ -9,8 +9,8 @@ inline void g(int n) { // The closure type is encoded as Z1giEUlvE_. // The call operator of that type is _ZZ1giENKUlvE_clEv. -// { dg-final { scan-assembler "_ZZ1giENKUlvE_clEv" } } -// { dg-final { scan-assembler "weak\[ \t\]*_?_ZZ1giENKUlvE_clEv" { target { ! { *-*-darwin* } } } } } +// { dg-final { scan-assembler "_ZZ1giENUlvE_clEv" } } +// { dg-final { scan-assembler "weak\[ \t\]*_?_ZZ1giENUlvE_clEv" { target { ! { *-*-darwin* *-*-mingw* *-*-cygwin } } } } } algo([=]{return n+bef();}); // The captured entities do not participate in <lambda-sig> @@ -31,17 +31,17 @@ struct S { void f(int = // Type: ZN1S1fEiiEd0_UlvE_ // Operator: _ZZN1S1fEiiEd0_NKUlvE_clEv -// { dg-final { scan-assembler "_ZZN1S1fEiiEd0_NKUlvE_clEv" } } -// { dg-final { scan-assembler "weak\[ \t\]*_?_ZZN1S1fEiiEd0_NKUlvE_clEv" { target { ! { *-*-darwin* } } } } } +// { dg-final { scan-assembler "_ZZN1S1fEiiEd0_NUlvE_clEv" } } +// { dg-final { scan-assembler "weak\[ \t\]*_?_ZZN1S1fEiiEd0_NUlvE_clEv" { target { ! { *-*-darwin* *-*-mingw* *-*-cygwin } } } } } []{return 1;}() // Type: ZN1S1fEiiEd0_UlvE0_ // Operator: _ZZN1S1fEiiEd0_NKUlvE0_clEv -// { dg-final { scan-assembler "_ZZN1S1fEiiEd0_NKUlvE0_clEv" } } +// { dg-final { scan-assembler "_ZZN1S1fEiiEd0_NUlvE0_clEv" } } + []{return 2;}(), int = // Type: ZN1S1fEiiEd_UlvE_ // Operator: _ZZN1S1fEiiEd_NKUlvE_clEv -// { dg-final { scan-assembler "_ZZN1S1fEiiEd_NKUlvE_clEv" } } +// { dg-final { scan-assembler "_ZZN1S1fEiiEd_NUlvE_clEv" } } []{return 3;}()); }; @@ -52,8 +52,8 @@ template<typename T> int R<T>::x = []{return 1;}(); template int R<int>::x; // Type of lambda in intializer of R<int>::x: N1RIiE1xMUlvE_E // Corresponding operator(): _ZNK1RIiE1xMUlvE_clEv -// { dg-final { scan-assembler "_ZNK1RIiE1xMUlvE_clEv" } } -// { dg-final { scan-assembler "weak\[ \t\]*_?_ZNK1RIiE1xMUlvE_clEv" } } +// { dg-final { scan-assembler "_ZN1RIiE1xMUlvE_clEv" } } +// { dg-final { scan-assembler "weak\[ \t\]*_?_ZN1RIiE1xMUlvE_clEv" { target { ! { *-*-mingw* *-*-cygwin } } } } } void bar() { @@ -63,7 +63,7 @@ void bar() } // lambdas used in non-template, non-class body initializers are internal. -// { dg-final { scan-assembler-not "weak\[^\n\r\]*_ZNKUlv" } } +// { dg-final { scan-assembler-not "weak\[^\n\r\]*_ZNUlv" } } // { dg-final { scan-assembler-not "weak\[^\n\r\]*variable" } } int variable = []{return 1;}(); diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested2.C new file mode 100644 index 00000000000..b7887485595 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested2.C @@ -0,0 +1,31 @@ +// Testcase from N2998 +// { dg-options -std=c++0x } + +void f1(int i) { + int const N = 20; + auto m1 = [=]{ + int const M = 30; + auto m2 = [i]{ + int x[N][M]; // OK: N and M are not "used" + x[0][0] = i; // OK: i is explicitly captured by m2 + // and implicitly captured by m1 + }; + }; + struct s1 { + int f; + int work(int n) { + int m = n*n; + int j = 40; + auto m3 = [this,m]{ + /*auto m4=*/[&,j]{ // { dg-error "j. is not captured" } + int x = n; // { dg-error "n. is not captured" } + x += m; // OK: m implicitly captured by m4 + // and explicitly captured by m3 + x += i; // { dg-error "i. is not captured" } + x += f; // OK: this captured implicitly by m4 + // and explicitly by m3 + }; + }; + } + }; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-non-const.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-non-const.C index 9c2b1195af3..9ff8c029d5c 100644 --- a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-non-const.C +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-non-const.C @@ -8,7 +8,6 @@ void call(F f) { f(); } int main() { call([] () -> void {}); - call([] () mutable -> void {}); int i = -1; call([i] () mutable -> void { i = 0; }); diff --git a/gcc/testsuite/g++.dg/cpp0x/linkage2.C b/gcc/testsuite/g++.dg/cpp0x/linkage2.C new file mode 100644 index 00000000000..f41c21a7741 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/linkage2.C @@ -0,0 +1,33 @@ +// DR 743: A type without linkage shall not be used as the type of a +// variable or function with linkage, unless +// o the variable or function has extern "C" linkage (7.5 [dcl.link]), or +// o the variable or function is not used (3.2 [basic.def.odr]) or is +// defined in the same translation unit. + +// { dg-options -std=c++0x } + +template <typename T> struct B { + void g(T){} + void h(T); // { dg-error "never defined" } + friend void i(B, T){} + static T t1; // { dg-error "never defined" } + static T t2; +}; + +template <typename T> T B<T>::t2 = { }; + +enum {} e1; // OK, defined +extern enum {} e2; // { dg-error "never defined" } +extern "C" enum {} e3; // OK, extern "C" + +void f() { + struct A { int x; }; // no linkage + A a = {1}; + B<A> ba; // declares B<A>::g(A) and B<A>::h(A) + ba.t1 = a; // error, B<T>::t never defined + ba.t2 = a; // OK + ba.g(a); // OK + ba.h(a); // error, B<T>::h never defined + i(ba, a); // OK + e1+e2+e3; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/nolinkage1.C b/gcc/testsuite/g++.dg/cpp0x/nolinkage1.C index a31394b08ac..b69b6ddc4cf 100644 --- a/gcc/testsuite/g++.dg/cpp0x/nolinkage1.C +++ b/gcc/testsuite/g++.dg/cpp0x/nolinkage1.C @@ -3,6 +3,7 @@ // { dg-additional-sources "nolinkage1a.cc" } // { dg-do link } +// { dg-options -std=c++0x } #include "nolinkage1.h" diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-deduce.C b/gcc/testsuite/g++.dg/cpp0x/rv-deduce.C new file mode 100644 index 00000000000..043543631ad --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-deduce.C @@ -0,0 +1,8 @@ +// PR c++/36816, core issue 873 +// { dg-options -std=c++0x } + +template <class T> void h (T&&) { } + +void (*pf)(int&) = &h; +template <> void h(char&); +template void h(double&); diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-reinterpret.C b/gcc/testsuite/g++.dg/cpp0x/rv-reinterpret.C new file mode 100644 index 00000000000..5b6e4c3d126 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-reinterpret.C @@ -0,0 +1,11 @@ +// { dg-options -std=c++0x } +// { dg-do run } + +void f(int &); +void f(int &&ir) { ir = 42; } +int main() +{ + int x; + f(reinterpret_cast<int&&>(x)); + return (x != 42); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-return.C b/gcc/testsuite/g++.dg/cpp0x/rv-return.C new file mode 100644 index 00000000000..e52101feae1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-return.C @@ -0,0 +1,18 @@ +// PR c++/41815 +// { dg-options -std=c++0x } + +template<typename T, typename U> struct same_type; +template<typename T> struct same_type<T, T> {}; + +int const f() { return 0; } + +int &&r = f(); // binding "int&&" to "int" should succeed +same_type<decltype(f()), int const> s1; +same_type<decltype(0,f()), int> s2; + +template <class T> +T const g() { return 0; } + +int &&r2 = g<int>(); +same_type<decltype(g<int>()), int const> s3; +same_type<decltype(0,g<int>()), int> s4; diff --git a/gcc/testsuite/g++.dg/cpp0x/auto6.C b/gcc/testsuite/g++.dg/cpp0x/trailing1.C index 11e73d2e716..11e73d2e716 100644 --- a/gcc/testsuite/g++.dg/cpp0x/auto6.C +++ b/gcc/testsuite/g++.dg/cpp0x/trailing1.C diff --git a/gcc/testsuite/g++.dg/cpp0x/auto8.C b/gcc/testsuite/g++.dg/cpp0x/trailing2.C index e45204fe715..e45204fe715 100644 --- a/gcc/testsuite/g++.dg/cpp0x/auto8.C +++ b/gcc/testsuite/g++.dg/cpp0x/trailing2.C diff --git a/gcc/testsuite/g++.dg/cpp0x/auto12.C b/gcc/testsuite/g++.dg/cpp0x/trailing3.C index 82d36f0d0d2..82d36f0d0d2 100644 --- a/gcc/testsuite/g++.dg/cpp0x/auto12.C +++ b/gcc/testsuite/g++.dg/cpp0x/trailing3.C diff --git a/gcc/testsuite/g++.dg/cpp0x/auto13.C b/gcc/testsuite/g++.dg/cpp0x/trailing4.C index dc7e35aabaa..dc7e35aabaa 100644 --- a/gcc/testsuite/g++.dg/cpp0x/auto13.C +++ b/gcc/testsuite/g++.dg/cpp0x/trailing4.C diff --git a/gcc/testsuite/g++.dg/cpp0x/trailing5.C b/gcc/testsuite/g++.dg/cpp0x/trailing5.C new file mode 100644 index 00000000000..b97d362be2f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/trailing5.C @@ -0,0 +1,10 @@ +// PR c++/38798, DR 770 +// { dg-options -std=c++0x } + +struct A {}; +auto foo() -> struct A {} + +enum B {}; +auto bar() -> enum B {} + +auto baz() -> struct C {} {} // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-throw.C b/gcc/testsuite/g++.dg/cpp0x/variadic-throw.C index f2ff652d8a0..ee85bf2a569 100644 --- a/gcc/testsuite/g++.dg/cpp0x/variadic-throw.C +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-throw.C @@ -8,7 +8,7 @@ template<int M, int N> struct pair template<int... M> struct S { - template<int... N> static int foo() throw (pair <M, N>...) // { dg-error "mismatched|no matching" } + template<int... N> static int foo() throw (pair <M, N>...) // { dg-error "mismatched" } { return 1; } @@ -21,5 +21,5 @@ int bar () int wibble() { - return S<0, 1, 2>::foo<0, 1> (); + return S<0, 1, 2>::foo<0, 1> (); // { dg-error "no matching" } } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic95.C b/gcc/testsuite/g++.dg/cpp0x/variadic95.C new file mode 100644 index 00000000000..ebb04ebc10b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic95.C @@ -0,0 +1,17 @@ +// PR c++/39863 +// { dg-options -std=c++0x } + +template <typename... T> +struct A {}; + +template <typename T, typename U> +struct S {}; + +template <typename... T, typename... U> +A< S<T, U>... > f(U... u) +{ return A< S<T, U>... >(); } + +int main() +{ + f<int>(0.0); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic96.C b/gcc/testsuite/g++.dg/cpp0x/variadic96.C new file mode 100644 index 00000000000..d4709d074b6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic96.C @@ -0,0 +1,26 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/41785 +// { dg-options -std=c++0x } + +struct a {}; + +template < typename T, typename ENCLOSING > +struct base; + +template < typename... T > +struct derived + : public base< T, derived< T... > >... +{}; + +template < typename... T> +struct base< a, derived< T... > > +{ + typedef derived< T... > + Derived; +}; + +int main() +{ + derived< a > instance; +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-40092.C b/gcc/testsuite/g++.dg/cpp0x/vt-40092.C new file mode 100644 index 00000000000..063ed7e16eb --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-40092.C @@ -0,0 +1,21 @@ +// { dg-do "compile" } +// { dg-options "-std=c++0x" } + +template <typename... Types> struct package {}; + +template <int ArgGen> struct wrapper_gen {}; + +template <int ArgNest> struct wrapper_nest +{ + typedef wrapper_gen<ArgNest> type_nest; +}; + +template <int... ArgPack> +struct wrapper_pack +{ + typedef package<wrapper_gen <ArgPack>...> type_pack; + // incorrect error: expansion pattern 'wrapper_gen<ArgNest>' + // contains no argument packs +}; + + |