diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2013-04-19 06:23:16 -0500 |
---|---|---|
committer | Aldy Hernandez <aldyh@redhat.com> | 2013-04-19 06:23:16 -0500 |
commit | cd7cb45fc78ae9a62968372eae37da08444da8ca (patch) | |
tree | 034e6313862f8ff73c460181d06785834ef5f25a /gcc/testsuite/g++.dg/cpp0x | |
parent | e2d763ab505e4e070c7661d2373c2c9b43f45cb1 (diff) | |
parent | 52108848ca6e017bc3ca0efeef67a450d7e32e56 (diff) | |
download | gcc-cd7cb45fc78ae9a62968372eae37da08444da8ca.tar.gz |
Merge remote-tracking branch 'origin/cilkplus' into cilkplus-simd-rewrite
Diffstat (limited to 'gcc/testsuite/g++.dg/cpp0x')
20 files changed, 518 insertions, 5 deletions
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-specialization.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-specialization.C new file mode 100644 index 00000000000..8003ed9e133 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-specialization.C @@ -0,0 +1,12 @@ +// PR c++/56871 +// { dg-options "-std=c++11" } + +template<typename T> constexpr int foo(T); +template<> int foo(int); +template<> int foo(int); // { dg-error "previous" } +template<> constexpr int foo(int); // { dg-error "redeclaration" } + +template<typename T> int bar(T); +template<> constexpr int bar(int); +template<> constexpr int bar(int); // { dg-error "previous" } +template<> int bar(int); // { dg-error "redeclaration" } diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype-call3.C b/gcc/testsuite/g++.dg/cpp0x/decltype-call3.C new file mode 100644 index 00000000000..27797a2fa31 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype-call3.C @@ -0,0 +1,132 @@ +// Testcase for N3276 and operator overloading +// { dg-require-effective-target c++11 } + +struct A; +struct B { + A operator()(int); + A operator[](int); + A operator=(int); + A operator+=(int); + A operator-=(int); + A operator*=(int); + A operator/=(int); + A operator^=(int); + A operator&=(int); + A operator|=(int); + A operator<<=(int); + A operator>>=(int); +}; + +A operator-(B); +A operator+(B); +A operator*(B); +A operator&(B); +A operator!(B); +A operator~(B); +A operator++(B); +A operator--(B); + +A operator+(B,B); +A operator-(B,B); +A operator*(B,B); +A operator/(B,B); +A operator%(B,B); +A operator^(B,B); +A operator&(B,B); +A operator|(B,B); +A operator<(B,B); +A operator>(B,B); +A operator,(B,B); +A operator<<(B,B); +A operator>>(B,B); +A operator==(B,B); +A operator->*(B,B); + +#define TRY(E) static_cast<decltype(E)*>(0) + +template <class B> +void f() +{ + B b; + TRY(b(0)); + TRY(b[0]); + TRY(b=0); + TRY(b+=0); + TRY(b-=0); + TRY(b*=0); + TRY(b/=0); + TRY(b^=0); + TRY(b&=0); + TRY(b|=0); + TRY(b<<=0); + TRY(b>>=0); + + TRY(-b); + TRY(+b); + TRY(*b); + TRY(&b); + TRY(!b); + TRY(~b); + TRY(++b); + TRY(--b); + + TRY(b+b); + TRY(b-b); + TRY(b*b); + TRY(b/b); + TRY(b%b); + TRY(b^b); + TRY(b&b); + TRY(b|b); + TRY(b>b); + TRY(b<b); + TRY((b,b)); + TRY(b<<b); + TRY(b>>b); + TRY(b==b); + TRY(b->*b); +} + +int main() +{ + B b; + TRY(b(0)); + TRY(b[0]); + TRY(b=0); + TRY(b+=0); + TRY(b-=0); + TRY(b*=0); + TRY(b/=0); + TRY(b^=0); + TRY(b&=0); + TRY(b|=0); + TRY(b<<=0); + TRY(b>>=0); + + TRY(-b); + TRY(+b); + TRY(*b); + TRY(&b); + TRY(!b); + TRY(~b); + TRY(++b); + TRY(--b); + + TRY(b+b); + TRY(b-b); + TRY(b*b); + TRY(b/b); + TRY(b%b); + TRY(b^b); + TRY(b&b); + TRY(b|b); + TRY(b>b); + TRY(b<b); + TRY((b,b)); + TRY(b<<b); + TRY(b>>b); + TRY(b==b); + TRY(b->*b); + + f<B>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/enum25.C b/gcc/testsuite/g++.dg/cpp0x/enum25.C new file mode 100644 index 00000000000..cb2cf8f5363 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/enum25.C @@ -0,0 +1,18 @@ +// PR c++/56793 +// { dg-require-effective-target c++11 } + +struct A +{ + enum struct B {X, Y} b; +} a; + +enum struct D {X,Y}; +struct C { } c; + +int main () +{ + if (a.b == a.B::Y) + a.b = A::B::X; + + c.D::Y; // { dg-error "not a member" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/enum26.C b/gcc/testsuite/g++.dg/cpp0x/enum26.C new file mode 100644 index 00000000000..a21067edb87 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/enum26.C @@ -0,0 +1,8 @@ +// PR c++/54216 +// { dg-options "-std=c++11 -pedantic" } + +enum {}; // { dg-warning "empty anonymous" } + +enum class {}; // { dg-error "anonymous" } + +enum class { x }; // { dg-error "anonymous" } diff --git a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-4.C b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-4.C index bad33d6e822..dff46b4af76 100644 --- a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-4.C +++ b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-4.C @@ -3,17 +3,17 @@ // Test for syntax support of various attribute permutations. int -[[gnu::noreturn]] // { dg-warning "ignored" } +[[noreturn]] // { dg-warning "ignored" } one [[gnu::unused]] (void); -int one_third [[gnu::noreturn]] [[gnu::unused]] (void); +int one_third [[noreturn]] [[gnu::unused]] (void); int [[gnu::unused]] one_half(); // { dg-warning "ignored" } static -[[gnu::noreturn]] // { dg-warning "ignored" } +[[noreturn]] // { dg-warning "ignored" } void two [[gnu::unused]] (void) {} @@ -21,10 +21,10 @@ void two [[gnu::unused]] (void) {} [[gnu::unused]] int five(void) -[[gnu::noreturn]] // { dg-warning "ignored" } +[[noreturn]] // { dg-warning "ignored" } {} -[[gnu::noreturn]] +[[noreturn]] void six (void) ; diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist68.C b/gcc/testsuite/g++.dg/cpp0x/initlist68.C new file mode 100644 index 00000000000..7cfe1a34bee --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist68.C @@ -0,0 +1,20 @@ +// PR c++/56772 +// { dg-require-effective-target c++11 } + +typedef __SIZE_TYPE__ size_t; +void* operator new[](size_t, void *p) { return p; } +template <typename T = size_t> +void f () +{ + size_t coord [2][2]; + new (&coord) size_t [2][2] + { + {0,0}, + {0,0}, + }; +} + +int main () +{ + f<>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto2.C new file mode 100644 index 00000000000..05fadf5d047 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto2.C @@ -0,0 +1,16 @@ +// PR c++/56901 +// { dg-require-effective-target c++11 } + +template <typename> +void foo_impl() +{ + int data; + auto L = [&](){ return data; }; + [&](){ L(); }(); + [&L](){ L(); }(); +} + +void foo() +{ + foo_impl<int>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh3.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh3.C new file mode 100644 index 00000000000..10dc6e36d2b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh3.C @@ -0,0 +1,14 @@ +// PR c++/56388 +// { dg-require-effective-target c++11 } + +int main() +{ + bool /*const*/ condition = false; + + [&]{ + try{} + catch(...){ + if(condition){} + } + }(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for24.C b/gcc/testsuite/g++.dg/cpp0x/range-for24.C new file mode 100644 index 00000000000..b4a5b185bd7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for24.C @@ -0,0 +1,15 @@ +// PR c++/56794 +// { dg-require-effective-target c++11 } + +template<int... values> +static void Colors() +{ + static const int colors[] = { values... }; + + for(auto c: colors) { } +} + +int main() +{ + Colors<0,1,2> (); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/ref-qual-mangle1.C b/gcc/testsuite/g++.dg/cpp0x/ref-qual-mangle1.C new file mode 100644 index 00000000000..c6ef0792b50 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/ref-qual-mangle1.C @@ -0,0 +1,37 @@ +// PR c++/56821 +// { dg-require-effective-target c++11 } + +struct A { + // { dg-final { scan-assembler "_ZNR1A1fEv" } } + void f() & {} + // { dg-final { scan-assembler "_ZNO1A1gEv" } } + void g() && {} + // { dg-final { scan-assembler "_ZNKR1A1hEv" } } + void h() const & {} +}; + +// { dg-final { scan-assembler "_Z1jM1AFvvRE" } } +void j(void (A::*)() &) { } +// { dg-final { scan-assembler "_Z1kM1AFvvOE" } } +void k(void (A::*)() &&) { } +// { dg-final { scan-assembler "_Z1lM1AKFvvRE" } } +void l(void (A::*)() const &) { } + +// { dg-final { scan-assembler "_Z1mIFvvOEEvM1AT_" } } +// { dg-final { scan-assembler "_Z1mIFvvREEvM1AT_" } } +// { dg-final { scan-assembler "_Z1mIKFvvREEvM1AT_" } } +template <typename T> +void m(T A::*) {} + +// { dg-final { scan-assembler "_Z1nIM1AFvvOEEvT_" } } +// { dg-final { scan-assembler "_Z1nIM1AFvvREEvT_" } } +// { dg-final { scan-assembler "_Z1nIM1AKFvvREEvT_" } } +template <typename T> +void n(T) {} + +int main() +{ + j(&A::f); k(&A::g); l(&A::h); + m(&A::f); m(&A::g); m(&A::h); + n(&A::f); n(&A::g); n(&A::h); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/ref-qual-multi-neg.C b/gcc/testsuite/g++.dg/cpp0x/ref-qual-multi-neg.C new file mode 100644 index 00000000000..5be89423f03 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/ref-qual-multi-neg.C @@ -0,0 +1,7 @@ +// { dg-require-effective-target c++11 } + +class Foo +{ +public: + void bar() const && & { } // { dg-error "multiple ref-qualifiers" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/ref-qual1.C b/gcc/testsuite/g++.dg/cpp0x/ref-qual1.C new file mode 100644 index 00000000000..7fa826c3db4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/ref-qual1.C @@ -0,0 +1,30 @@ +// { dg-require-effective-target c++11 } + +template <class,class> struct ST; +template <class T> struct ST<T,T> {}; + +struct A +{ + int f() &; + char f() &&; +}; + +template <class T> struct B +{ + int f() &; + char f() &&; +}; + +int main() +{ + A a; + a.f(); + A().f(); + ST<decltype(a.f()), int>(); + ST<decltype(A().f()), char>(); + B<int> b; + b.f(); + B<int>().f(); + ST<decltype(b.f()), int>(); + ST<decltype(B<int>().f()), char>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/ref-qual2.C b/gcc/testsuite/g++.dg/cpp0x/ref-qual2.C new file mode 100644 index 00000000000..fa09ab48a15 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/ref-qual2.C @@ -0,0 +1,75 @@ +// In a .* expression whose object expression is an rvalue, the program is +// ill-formed if the second operand is a pointer to member function with +// ref-qualifier &. In a .* expression whose object expression is an +// lvalue, the program is ill-formed if the second operand is a pointer to +// member function with ref-qualifier &&. + +// { dg-require-effective-target c++11 } + +struct A { + void f() &; + void g() &&; + void h(); +}; + +void one() +{ + A a; + + void (A::*p)() & = &A::f; + (a.*p)(); + (A().*p)(); // { dg-error "" } + + p = &A::g; // { dg-error "" } + p = &A::h; // { dg-error "" } + + void (A::*p2)() && = &A::g; + (A().*p2)(); + (a.*p2)(); // { dg-error "" } + p2 = &A::f; // { dg-error "" } + p2 = &A::h; // { dg-error "" } + + void (A::*p3)() = &A::h; + (a.*p3)(); + (A().*p3)(); + p3 = &A::f; // { dg-error "" } + p3 = &A::g; // { dg-error "" } +} + +template <class T> +struct B { + void f() &; + void g() &&; + void h(); +}; + +template <class T> +void two() +{ + B<T> a; + + void (B<T>::*p)() & = &B<T>::f; + (a.*p)(); + (B<T>().*p)(); // { dg-error "" } + + p = &B<T>::g; // { dg-error "" } + p = &B<T>::h; // { dg-error "" } + + void (B<T>::*p2)() && = &B<T>::g; + (B<T>().*p2)(); + (a.*p2)(); // { dg-error "" } + p2 = &B<T>::f; // { dg-error "" } + p2 = &B<T>::h; // { dg-error "" } + + void (B<T>::*p3)() = &B<T>::h; + (a.*p3)(); + (B<T>().*p3)(); + p3 = &B<T>::f; // { dg-error "" } + p3 = &B<T>::g; // { dg-error "" } +} + +int main() +{ + one(); + two<int>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/ref-qual3.C b/gcc/testsuite/g++.dg/cpp0x/ref-qual3.C new file mode 100644 index 00000000000..1b21196321a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/ref-qual3.C @@ -0,0 +1,29 @@ +// An explicitly defaulted function can have a ref-qualifier. + +// { dg-require-effective-target c++11 } + +struct A { + A& operator=(const A&) & = default; +}; + +template<class T> +struct B { + B& operator=(const B&) & = default; +}; + +template<class T> +void f() +{ + B<T> b; + b = B<T>(); + B<T>() = b; // { dg-error "" } +} + +int main() +{ + A a; + a = A(); + A() = a; // { dg-error "" } + + f<int>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/ref-qual4.C b/gcc/testsuite/g++.dg/cpp0x/ref-qual4.C new file mode 100644 index 00000000000..5a0ee162fe5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/ref-qual4.C @@ -0,0 +1,14 @@ +// 12.1: A constructor shall not be declared with a ref-qualifier. +// 12.4: A destructor shall not be declared with a ref-qualifier. + +// { dg-require-effective-target c++11 } + +struct A { + A() & = default; // { dg-error "constructor" } + ~A() & = default; // { dg-error "destructor" } +}; + +int main() +{ + A a; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/ref-qual5.C b/gcc/testsuite/g++.dg/cpp0x/ref-qual5.C new file mode 100644 index 00000000000..e3d26e5a78f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/ref-qual5.C @@ -0,0 +1,13 @@ +// 13.1: ...cannot be overloaded if any of them, but not all, have a +// ref-qualifier. + +// { dg-require-effective-target c++11 } + +class Y { + void h() &; + void h() const &; // OK + void h() &&; // OK, all declarations have a ref-qualifier + void i() &; // { dg-message "" } + void i() const; // { dg-error "" } prior declaration of i + // has a ref-qualifier +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/ref-qual6.C b/gcc/testsuite/g++.dg/cpp0x/ref-qual6.C new file mode 100644 index 00000000000..02e3f6e683e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/ref-qual6.C @@ -0,0 +1,15 @@ +// Binding an rvalue to && beats binding it to const& (13.3.3.2). + +// { dg-require-effective-target c++11 } + +struct A +{ + int operator+(int) &&; +}; + +void operator+ (const A&, int); + +int main() +{ + return A() + 42; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/ref-qual7.C b/gcc/testsuite/g++.dg/cpp0x/ref-qual7.C new file mode 100644 index 00000000000..2430665db34 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/ref-qual7.C @@ -0,0 +1,19 @@ +// typedef test +// { dg-require-effective-target c++11 } + +typedef void F() &; + +F f; // { dg-error "" } +F* p; // { dg-error "" } +extern F& r; // { dg-error "" } + +struct A { + F f; +}; + +int main() +{ + A a; + a.f(); + A().f(); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/ref-qual8.C b/gcc/testsuite/g++.dg/cpp0x/ref-qual8.C new file mode 100644 index 00000000000..b4c972b3c3b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/ref-qual8.C @@ -0,0 +1,13 @@ +// { dg-require-effective-target c++11 } + +struct A +{ + virtual void f() & = 0; +}; + +struct B: A +{ + void f(); // doesn't override +}; + +B b; // { dg-error "abstract" } diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae44.C b/gcc/testsuite/g++.dg/cpp0x/sfinae44.C new file mode 100644 index 00000000000..bbcae622630 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae44.C @@ -0,0 +1,26 @@ +// PR c++/56913 +// { dg-do compile { target c++11 } } + +template<typename T> +T &&declval(); + +template<typename T, typename U, + typename = decltype((declval<T>().*declval<U>())())> +constexpr bool test(int) +{ + return true; +} + +template<typename T, typename U> +constexpr bool test(...) +{ + return false; +} + +struct S +{}; + +static_assert(!test<S, void (S::*)() &>(0), ""); +static_assert(test<S, void (S::*)() &&>(0), ""); +static_assert(test<S &, void (S::*)() &>(0), ""); +static_assert(!test<S &, void (S::*)() &&>(0), ""); |