diff options
Diffstat (limited to 'gcc/testsuite/g++.dg/cpp0x')
440 files changed, 7931 insertions, 659 deletions
diff --git a/gcc/testsuite/g++.dg/cpp0x/Wzero-as-null-pointer-constant-1.C b/gcc/testsuite/g++.dg/cpp0x/Wzero-as-null-pointer-constant-1.C new file mode 100644 index 0000000000..aad273792a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/Wzero-as-null-pointer-constant-1.C @@ -0,0 +1,161 @@ +// { dg-options "-std=c++0x -Wzero-as-null-pointer-constant" } + +struct A; + +typedef int (A::*pointmemfun) (int); +typedef int (A::*pointdmem); +typedef int (*pointfun) (int); + +pointmemfun pmfs; +pointdmem pdms; +pointfun pfs; +int* ps; + +void f() +{ + pointmemfun pmf(0); // { dg-warning "zero as null pointer" } + pointdmem pdm(0); // { dg-warning "zero as null pointer" } + pointfun pf(0); // { dg-warning "zero as null pointer" } + int* p(0); // { dg-warning "zero as null pointer" } + + pointmemfun pmfn(nullptr); + pointdmem pdmn(nullptr); + pointfun pfn(nullptr); + int* pn(nullptr); + + pmf = 0; // { dg-warning "zero as null pointer" } + + pdm = 0; // { dg-warning "zero as null pointer" } + + pf = 0; // { dg-warning "zero as null pointer" } + + p = 0; // { dg-warning "zero as null pointer" } + + pmf = nullptr; + + pdm = nullptr; + + pf = nullptr; + + p = nullptr; + + if (pmf) + ; + + if (pdm) + ; + + if (pf) + ; + + if (p) + ; + + if (!pmf) + ; + + if (!pdm) + ; + + if (!pf) + ; + + if (!p) + ; + + if (pmf == 0) // { dg-warning "zero as null pointer" } + ; + + if (pdm == 0) // { dg-warning "zero as null pointer" } + ; + + if (pf == 0) // { dg-warning "zero as null pointer" } + ; + + if (p == 0) // { dg-warning "zero as null pointer" } + ; + + if (0 == pmf) // { dg-warning "zero as null pointer" } + ; + + if (0 == pdm) // { dg-warning "zero as null pointer" } + ; + + if (0 == pf) // { dg-warning "zero as null pointer" } + ; + + if (0 == p) // { dg-warning "zero as null pointer" } + ; + + if (pmf != 0) // { dg-warning "zero as null pointer" } + ; + + if (pdm != 0) // { dg-warning "zero as null pointer" } + ; + + if (pf != 0) // { dg-warning "zero as null pointer" } + ; + + if (p != 0) // { dg-warning "zero as null pointer" } + ; + + if (0 != pmf) // { dg-warning "zero as null pointer" } + ; + + if (0 != pdm) // { dg-warning "zero as null pointer" } + ; + + if (0 != pf) // { dg-warning "zero as null pointer" } + ; + + if (0 != p) // { dg-warning "zero as null pointer" } + ; + + if (pmf == nullptr) + ; + + if (pdm == nullptr) + ; + + if (pf == nullptr) + ; + + if (p == nullptr) + ; + + if (nullptr == pmf) + ; + + if (nullptr == pdm) + ; + + if (nullptr == pf) + ; + + if (nullptr == p) + ; + + if (pmf != nullptr) + ; + + if (pdm != nullptr) + ; + + if (pf != nullptr) + ; + + if (p != nullptr) + ; + + if (nullptr != pmf) + ; + + if (nullptr != pdm) + ; + + if (nullptr != pf) + ; + + if (nullptr != p) + ; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-0.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-0.C new file mode 100644 index 0000000000..c5760cfe53 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-0.C @@ -0,0 +1,37 @@ +// { dg-options "-std=c++0x" } + +template<template<class> class TT> struct X { }; +template<class> struct Y { }; +template<class T> using Z = Y<T>; + +void f(X<Y>); +void g(X<Z>); + +void +foo() +{ + // Below x and y don't have the same type, because Y and Z don't + // designate the same template ... + X<Y> y; + X<Z> z; + + // ... So these must fail to compile. + f(z); // { dg-error "" } + g(y); // { dg-error "" } +} + +template<class> struct A0 {}; +template<class T> using AA0 = A0<T>; +template<class T> using AAA0 = AA0<T>; + +void f0(A0<int>); +void +g0() +{ + AA0<int> a; + AAA0<int> b; + f0(a); + f0(b); +} + + diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-1.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-1.C new file mode 100644 index 0000000000..d0eda5ff1b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-1.C @@ -0,0 +1,15 @@ +// { dg-options "-std=c++0x" } + +// These also represent tests for printing alias declarations and +// their instantiations. + +template<class T, class U> struct A0 {}; +template<class T, class U> using AA0 = A0<T, U>; +template<class T> struct AA0<int, T> {}; // { dg-error "partial specialization" } + +template <class U> using Ptr = U*; +template<class U> struct Ptr<U*> {}; // { dg-error "partial specialization" } + +struct A { + using A = int;//{ dg-error "nested|has|same name as|class|in which|declared" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-10.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-10.C new file mode 100644 index 0000000000..733e791c2b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-10.C @@ -0,0 +1,26 @@ +// { dg-options "-std=c++0x" } + +template <class T> using Ptr = T*; +Ptr<unsigned>; // { dg-error "does not declare anything" } +Ptr<char><int>; // { dg-error "not a template|does not declare anything" } +template class Ptr<int>;//{ dg-error "alias template specialization\[^\n\r\]*after\[^\n\r\]*class" } + +template <class T> using Arg = T; +struct A {}; +template class Arg<A>;// { dg-error "alias templ\[^\n\r\]*specialization\[^\n\r\]*Arg<A>\[^\n\r\]*after\[^\n\r\]*class" } + +template <template <class> class TT, class T> using Instantiate = TT<T>; +template <class> struct Vector {}; + +// The below is not OK, because of [dcl.type.elab]: +// +// If the identifier resolves to a typedef-name or the +// simple-template-id resolves to an alias template +// specialization, the elaborated-type-specifier is ill-formed. +// +template class Instantiate<Vector, int>;//{ dg-error "alias template specialization\[^\n\r\]*after\[^\n\r\]*class" } + +template <class T> struct S {}; +template<class T> using SFor = S<T>; +// Likewise, this is not OK. +template class SFor<int>; //{ dg-error "alias template specialization\[^\n\r\]*after\[^\n\r\]*class" } diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-11.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-11.C new file mode 100644 index 0000000000..43ef7ba45e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-11.C @@ -0,0 +1,8 @@ +// { dg-options "-std=c++0x" } + +namespace N +{ + template <class T> using U = T*; +}; + +void f(N::U<int>) { blah; } // { dg-error "void f(N::U<int>)|not declared" } diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-12.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-12.C new file mode 100644 index 0000000000..11c26865d9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-12.C @@ -0,0 +1,4 @@ +// Origin: PR c++/51027 +// { dg-options "-std=c++0x" } + +using INT = int // { dg-error "expected|;|at end of input" } diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-13.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-13.C new file mode 100644 index 0000000000..8555154c63 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-13.C @@ -0,0 +1,24 @@ +// Origin PR c++/51191 +// { dg-options "-std=c++0x" } + +template< class T > +class ClassTemplate {}; + +template< class T > +struct Metafunction { + typedef T type; +}; + +template< class T > +using TemplateAlias = ClassTemplate< typename Metafunction<T>::type >; + +using Alias = TemplateAlias<int>; + +template< class T > +void f( TemplateAlias<T> ); + +int main() +{ + Alias x; + f( x ); // { dg-error "no matching function for call to|f" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-14.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-14.C new file mode 100644 index 0000000000..1a998022ad --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-14.C @@ -0,0 +1,14 @@ +// Origin: PR c++/51145 +// { dg-options "-std=c++0x" } + +struct A {}; + +template<class> +using X = A; + +struct X<int>* px; // { dg-error "using\[^\n\r\]*alias\[^\n\r\]*specialization\[^\n\r\]*X<int>\[^\n\r\]*after\[^\n\r\]*struct|invalid type in declaration before\[^\n\r\]*;" } + +template<int> +using Y = A; + +struct Y<0>* py;// { dg-error "alias\[^\n\r\]*specialization\[^\n\r\]*Y<0>\[^\n\r\]*after\[^\n\r\]*struct|invalid type in declaration before\[^\n\r\]*;" } diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-15.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-15.C new file mode 100644 index 0000000000..b23e4029f7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-15.C @@ -0,0 +1,17 @@ +// Origin PR c++/51194 +// { dg-options "-std=c++0x" } + +template<class U, class V> //#1 +struct foo {}; + +template<class U, class V=char> +struct P {}; + +template<template<class... U> class... TT> +struct bar { + template<class... Args> + using mem = P<TT<Args...>...>;//#2 +}; + +bar<foo>::mem<int, char> b;//#3 + diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-16.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-16.C new file mode 100644 index 0000000000..d66660a5f4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-16.C @@ -0,0 +1,28 @@ +// Origin PR c++/51143 +// { dg-options "-std=c++11" } + +using A0 = struct B0 { void f() {} }; + +template<int N> +using A1 = + struct B1 { // { dg-error "types may not be defined in alias template" } + static auto constexpr value = N; + }; + +A1<0> a1; + +template<class T> +using A2 = + struct B2 { // { dg-error "types may not be defined in alias template" } + void f(T){} + }; + +A2<bool> a2; + +template<class T> +using A3 = + enum B3 {b = 0;}; //{ dg-error "types may not be defined in alias template" } + +A3<int> a3; + +int main() { } diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-17.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-17.C new file mode 100644 index 0000000000..41b1c950fc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-17.C @@ -0,0 +1,21 @@ +// Origin PR c++/51289 +// { dg-options "-std=c++11" } + +template<typename a, template <typename, typename> class b> +struct foo { + template <typename t> + using type = b<a, t>; + template <typename t> + b<a, t> funca() {} + + template <typename t> + type<t> funcb() {} +}; + +// This is an additional test, to emit an error message when using +// unexpanded parameter packs in an alias declaration. +template <class ... T> +struct S {}; + +template<class ... T> +using A = S<T>; // { dg-error "parameter packs not expanded" } diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-18.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-18.C new file mode 100644 index 0000000000..ba65561311 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-18.C @@ -0,0 +1,9 @@ +// Origin: PR c++/51541 +// { dg-options -std=c++11 } + +template<typename Z> using ::T = void(int n); // { dg-error "" } +template<typename Z> using operator int = void(int n); // { dg-error "" } +template<typename Z> using typename U = void; // { dg-error "" } +template<typename Z> using typename ::V = void(int n); // { dg-error "" } +template<typename Z> using typename ::operator bool = void(int n); // { dg-error "" } +using foo __attribute__((aligned(4)) = int; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-2.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-2.C new file mode 100644 index 0000000000..6b5b42f7fd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-2.C @@ -0,0 +1,33 @@ +// { dg-options "-std=c++0x" } + +template<class T> struct S0 {}; +template<class T> using AS0 = S0<T>; + +template<template<class> class TT> +void f(TT<int>); + +template class AS0<char>; // { dg-error "alias templ\[^\n\r\]*specialization\[^\n\r\]*after\[^\n\r\]*class" } + +void +foo() +{ + AS0<int> a; + f(a); +} + +template<class T, class U> struct Vector{}; +template<class T> struct Alloc {}; + +template<class T> using Vec = Vector<T, Alloc<T> >; + +template<class T> void g(Vector<T, Alloc<T> >); + +template<template<class T> class TT> void h(TT<int>); // { dg-error "provided for" } + +void +bar() +{ + Vec<int> a; + g(a); + h(a); // { dg-error "no matching function|wrong number of template arguments" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-20.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-20.C new file mode 100644 index 0000000000..078d257187 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-20.C @@ -0,0 +1,9 @@ +// PR c++/53858 +// { dg-do compile { target c++11 } } + +template <typename T> struct s0 { typedef T tdef0; }; +template <typename T> struct s1 { typedef T tdef1; }; +template <typename T> using us1 = typename s1<T>::tdef1; +template <typename T, typename TT = typename us1<T>::tdef0> struct s2 {}; + +int main () { return 0; } diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-3.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-3.C new file mode 100644 index 0000000000..5484efce19 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-3.C @@ -0,0 +1,42 @@ +// { dg-options "-std=c++0x" } + +// Exercise some member alias templates ... + +template<class T, class U> class A0 {}; + +template<class T> +struct A1 { + template<class U> struct S {}; + template<class U> using AA0 = A0<T, U>; + + void f(A0<T, int>); + + void + foo() + { + AA0<int> a; + const AA0<int> b; + f(a); + f(b); + } +}; + +void +bar() +{ + A1<int> a1; + a1.foo(); + A1<int>::AA0<int> a1aa0; + a1.f(a1aa0); +} + +// ... some simple member alias ... +struct B { + using A = int; +}; + +B::A a; + +// ... and some simple alias + +using Int = int; diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-4.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-4.C new file mode 100644 index 0000000000..876944e23c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-4.C @@ -0,0 +1,14 @@ +// { dg-options "-std=c++0x" } + +// [temp.alias]/3: +// The type-id in an alias template declaration shall not refer +// to the alias template being declared. The type produced by an +// alias template specialization shall not directly or indirectly +// make use of that specialization. + +template <class T> struct A; +template <class T> using B = typename A<T>::U; // { dg-error "type" } +template <class T> struct A { + typedef B<T> U; +}; +B<short> b; // { dg-error "invalid type" } diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-5.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-5.C new file mode 100644 index 0000000000..1a4cbd5e5b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-5.C @@ -0,0 +1,34 @@ +// { dg-options "-std=c++0x" } + +// alias template of a partial specialization + +template<class T, class U, class W> struct S0 {}; +template<class T, class U> struct S0<T, U, char> {}; +template<class T> using AS0 = S0<T, int, char>; +void foo(S0<bool, int, char>); + +AS0<bool> a; // OK + +void +f() +{ + foo(a); //OK +} + +// alias template of an explicit specialization of a member template + +template<class T> +struct S1 { + template<class U> + struct M {}; +}; +template<class T> using AM = S1<int>::M<T>; +void bar(S1<int>::M<bool>); + +AM<bool> b; //OK. + +void +g() +{ + bar(b); //OK +} diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-6.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-6.C new file mode 100644 index 0000000000..f60b2ea7fc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-6.C @@ -0,0 +1,12 @@ +// { dg-options "-std=c++0x" } + +// Alias template of non-class types. + +template <class T, class U> struct same; +template <class T> struct same<T,T> {}; + +template <class T> using Ptr = T*; +template <template <class> class T> struct A { + template <class U> using X = T<U>; +}; +same<A<Ptr>::X<int>,int*> s; diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-7.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-7.C new file mode 100644 index 0000000000..96c349a0da --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-7.C @@ -0,0 +1,23 @@ +// { dg-options "-std=c++0x" } + +// Add arguments to unbound template template parameter. + +template <template <class> class Template> +struct Internal { + template <class Arg> using Bind = Template<Arg>; +}; + +template <template <class> class Template, class Arg> +using Instantiate = Template<Arg>; // After parsing #1, the + // BOUND_TEMPLATE_TEMPLATE_PARM + // parameter Template gets + // the UNBOUND_CLASS_TEMPLATE + // Internal<Template>::template Bind + // as an argument, and the + // parameter Arg gets Argument as + // an argument. And we build + // 'Bind<Argument>'. + +template <template <class> class Template, class Argument> +using Bind = Instantiate<Internal<Template>::template Bind, Argument>; //#1 + diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-8.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-8.C new file mode 100644 index 0000000000..c926df7539 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-8.C @@ -0,0 +1,32 @@ +// { dg-options "-std=c++0x" } + +struct A { + template <class U> using C = U; +}; + +// The particularity of the below struct is to have more than 7 +// fields. In this case, looking up a member here should exercise +// cp/search.c:lookup_field_1 in such a way that it finds it in the +// CLASSTYPE_SORTED_FIELDS of struct A7. +struct A7 { + int f0; + int f1; + int f2; + int f3; + int f4; + int f5; + int f6; + int f7; + template <class U> using C = U; +}; + +template <class T> +struct B { + typename T::template C<int> n; //#0 +}; + +// These should trigger the lookup +// of template C inside class A or +// A7, via #0. +B<A> b; +B<A7> c; diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-9.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-9.C new file mode 100644 index 0000000000..dcf642d768 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-9.C @@ -0,0 +1,9 @@ +// { dg-options "-std=c++0x" } + +template <class T> +struct A { + using Result = T; +}; +template <class A> using Arg = typename A::Result; +Arg<A<int>> b; + diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-debug-0.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-debug-0.C new file mode 100644 index 0000000000..63655286b0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-debug-0.C @@ -0,0 +1,12 @@ +// Origin: PR c++/51032 +// { dg-skip-if "No stabs" { mmix-*-* *-*-aix* alpha*-*-* hppa*64*-*-* ia64-*-* *-*-vxworks* } { "*" } { "" } } +// { dg-options "-std=c++0x -gstabs+" } + +template <class C> +struct A { + template<class U> using B = U*; + int a; +}; + +A<int> a; + diff --git a/gcc/testsuite/g++.dg/cpp0x/alignof3.C b/gcc/testsuite/g++.dg/cpp0x/alignof3.C new file mode 100644 index 0000000000..50c6ac915e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alignof3.C @@ -0,0 +1,6 @@ +// { dg-do compile } +// { dg-options "-std=c++0x -pedantic" } +int main(void) +{ + alignof(void (void)); // { dg-warning "function type" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/alignof4.C b/gcc/testsuite/g++.dg/cpp0x/alignof4.C new file mode 100644 index 0000000000..92d636faf0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alignof4.C @@ -0,0 +1,7 @@ +// PR c++/51316 +// { dg-options "-std=c++0x" } + +int main() +{ + alignof(int []); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/auto1.C b/gcc/testsuite/g++.dg/cpp0x/auto1.C index 9e274b6223..f5c0ea6e4d 100644 --- a/gcc/testsuite/g++.dg/cpp0x/auto1.C +++ b/gcc/testsuite/g++.dg/cpp0x/auto1.C @@ -1,8 +1,8 @@ -// { dg-options "-std=c++98 -Wc++0x-compat" } +// { dg-options "-std=c++98 -Wc++11-compat" } -// Test warning for use of auto in C++98 mode with C++0x +// Test warning for use of auto in C++98 mode with C++11 // compatibility warnings void f() { - auto int x = 5; // { dg-warning "will change meaning" } + auto int x = 5; // { dg-warning "changes meaning" } } diff --git a/gcc/testsuite/g++.dg/cpp0x/auto24.C b/gcc/testsuite/g++.dg/cpp0x/auto24.C new file mode 100644 index 0000000000..b024ad5b2a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto24.C @@ -0,0 +1,5 @@ +// PR c++/48599 +// { dg-options "-std=c++0x -pedantic-errors" } + +int v[1]; +auto (*p)[1] = &v; // { dg-error "array of .auto" } diff --git a/gcc/testsuite/g++.dg/cpp0x/auto25.C b/gcc/testsuite/g++.dg/cpp0x/auto25.C new file mode 100644 index 0000000000..2917c0e197 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto25.C @@ -0,0 +1,12 @@ +// PR c++/42056 +// { dg-options -std=c++0x } + +template<int> struct A +{ + int a[auto(1)]; // { dg-error "invalid use of" } +}; + +template<int> void foo() +{ + int a[auto(1)]; // { dg-error "invalid use of" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/auto26.C b/gcc/testsuite/g++.dg/cpp0x/auto26.C new file mode 100644 index 0000000000..6e55aa451a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto26.C @@ -0,0 +1,21 @@ +// PR c++/43321 +// { dg-options -std=c++0x } + +template <class T> +void f(T t) +{ + auto *p = t; +} + +template <class T> +void g(const T& tr) +{ + auto p = *tr; +} + +int main() +{ + int b; + f(&b); + g(&b); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/auto27.C b/gcc/testsuite/g++.dg/cpp0x/auto27.C new file mode 100644 index 0000000000..1921763607 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto27.C @@ -0,0 +1,6 @@ +// PR c++/51186 + +auto main()->int // { dg-error "std=" "std" { target c++98 } } + // { dg-error "auto" "auto" { target c++98 } 3 } + // { dg-error "no type" "no type" { target c++98 } 3 } +{ } diff --git a/gcc/testsuite/g++.dg/cpp0x/auto28.C b/gcc/testsuite/g++.dg/cpp0x/auto28.C new file mode 100644 index 0000000000..8d250166a8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto28.C @@ -0,0 +1,4 @@ +// PR c++/51404 +// { dg-options -std=c++0x } + +int i = auto().x; // { dg-error "invalid use of" } diff --git a/gcc/testsuite/g++.dg/cpp0x/auto29.C b/gcc/testsuite/g++.dg/cpp0x/auto29.C new file mode 100644 index 0000000000..818745751a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto29.C @@ -0,0 +1,25 @@ +// PR c++/51401 +// { dg-do compile } +// { dg-options "-std=c++11" } + +template <int> +struct A +{ + auto i; // { dg-error "non-static data member declared" } +}; + +template <int> +struct B +{ + auto i = 0; // { dg-error "non-static data member declared" } +}; + +struct C +{ + auto i; // { dg-error "non-static data member declared" } +}; + +struct D +{ + auto i = 0; // { dg-error "non-static data member declared" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/auto30.C b/gcc/testsuite/g++.dg/cpp0x/auto30.C new file mode 100644 index 0000000000..d26e290f5c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto30.C @@ -0,0 +1,9 @@ +// Origin PR c++/51473 +// { dg-options "-std=c++11" } + +struct A +{ + auto friend struct B; // { dg-error "multiple types|can only be specified|friend" } +}; + +auto int; // { dg-error "multiple types|can only be specified for variables" } diff --git a/gcc/testsuite/g++.dg/cpp0x/auto31.C b/gcc/testsuite/g++.dg/cpp0x/auto31.C new file mode 100644 index 0000000000..26a656063c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto31.C @@ -0,0 +1,12 @@ +// PR c++/51416 +// { dg-do compile { target c++11 } } + +template<typename T, typename... U> void foo(T, U... u) +{ + auto foo(u...); // { dg-error "auto" } +} + +void bar() +{ + foo(0); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/auto32.C b/gcc/testsuite/g++.dg/cpp0x/auto32.C new file mode 100644 index 0000000000..2aad34e40a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto32.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +// { dg-final { scan-assembler "_Z1fIiEDTnw_Dapifp_EET_" } } +template <class T> auto f(T t) -> decltype (new auto(t)); + +int main() +{ + f(1); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/auto33.C b/gcc/testsuite/g++.dg/cpp0x/auto33.C new file mode 100644 index 0000000000..dade5a8ba2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto33.C @@ -0,0 +1,15 @@ +// PR c++/53484 +// { dg-do compile { target c++11 } } + +template<class T,class U> struct ST; +template<class T> struct ST<T,T> {}; + +template <class T> +void f(T x){ + [&]{ + auto y = x; + ST<decltype(y),int>(); + }(); +} + +int main(){ f(0); } diff --git a/gcc/testsuite/g++.dg/cpp0x/auto7.C b/gcc/testsuite/g++.dg/cpp0x/auto7.C index 9ef5a80eb1..3b3b829016 100644 --- a/gcc/testsuite/g++.dg/cpp0x/auto7.C +++ b/gcc/testsuite/g++.dg/cpp0x/auto7.C @@ -7,7 +7,7 @@ auto j; // { dg-error "has no initializer" } template<int> struct A { - static auto k = 7; + static auto k = 7; // { dg-error "non-const" } static auto l; // { dg-error "has no initializer" } - auto m; // { dg-error "has no initializer" } + auto m; // { dg-error "non-static data member declared" } }; diff --git a/gcc/testsuite/g++.dg/cpp0x/bracket3.C b/gcc/testsuite/g++.dg/cpp0x/bracket3.C index 4ef7a0e9d3..f86aa041a2 100644 --- a/gcc/testsuite/g++.dg/cpp0x/bracket3.C +++ b/gcc/testsuite/g++.dg/cpp0x/bracket3.C @@ -1,10 +1,10 @@ -// { dg-options "-std=c++98 -Wc++0x-compat" } +// { dg-options "-std=c++98 -Wc++11-compat" } template<int N> struct X {}; -X<1 >> 2> x; // { dg-warning "will be treated as|suggest parentheses" } +X<1 >> 2> x; // { dg-warning "is treated as|suggest parentheses" } // From cp/parser.c typedef int Y; template <int V> struct Foo {}; -Foo<Y () >> 5> r; // { dg-warning "will be treated as|suggest parentheses" } +Foo<Y () >> 5> r; // { dg-warning "is treated as|suggest parentheses" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-46336.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-46336.C new file mode 100644 index 0000000000..3c51c2cbf5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-46336.C @@ -0,0 +1,14 @@ +// PR c++/46336 +// { dg-options -std=c++0x } + +extern "C" { + enum A { }; + inline constexpr A + f(A a, A b) // { dg-error "previous declaration" } + { return A(static_cast<int>(a) & static_cast<int>(b)); } + enum B { }; + inline constexpr B + f(B a, B b) // { dg-error "C function" } + { return B(static_cast<int>(a) & static_cast<int>(b)); } +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-47969.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-47969.C new file mode 100644 index 0000000000..c950a3642f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-47969.C @@ -0,0 +1,11 @@ +// PR c++/47969 +// { dg-options -std=c++0x } + +struct A +{ + // constexpr operator int () { return 1; } +}; + +constexpr A a = A(); + +int ar[a]; // { dg-error "has non-integral type" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-48089.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-48089.C index 5124f7c7f4..a6cf408075 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-48089.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-48089.C @@ -14,7 +14,7 @@ struct s { int v; }; -constexpr s bang; // { dg-error "" } +constexpr s bang; // { dg-message "" } struct R { int i,j; @@ -33,7 +33,7 @@ struct T { constexpr T t1; // Ill-formed (diagnostic required) -constexpr T t2(t1); // { dg-error "" } +constexpr T t2(t1); // { dg-message "" } // Well-formed struct U { diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-49776.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-49776.C new file mode 100644 index 0000000000..3fe3dcb86c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-49776.C @@ -0,0 +1,17 @@ +// PR c++/49776 +// { dg-options -std=c++0x } + +struct s +{ + int i[1]; + + template<class... Types> + constexpr s(Types... args) + : i{args...} // { dg-error "cannot convert" } + { } +}; + +int main() +{ + s test = nullptr; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-51369.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-51369.C new file mode 100644 index 0000000000..6606be8b6f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-51369.C @@ -0,0 +1,12 @@ +// PR c++/51369 +// { dg-do compile } +// { dg-options "-std=c++11" } + +constexpr int x[2][2] = {}; + +template<int> +void +foo () +{ + x[0][0]; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-52672.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-52672.C new file mode 100644 index 0000000000..9f878780c7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-52672.C @@ -0,0 +1,8 @@ +// PR c++/52672 +// { dg-do compile } +// { dg-options "-std=c++11" } + +typedef unsigned long * ul_ptr; +constexpr unsigned long a = *((ul_ptr)0x0); // { dg-error "" } +constexpr unsigned long b = *((ul_ptr)(*((ul_ptr)0x0))); // { dg-error "" } +constexpr unsigned long c = *((ul_ptr)*((ul_ptr)(*((ul_ptr)0x0)))); // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-98.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-98.C index 4ae3944c34..1a0189b56e 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-98.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-98.C @@ -1,4 +1,4 @@ // { dg-options "-std=c++98" } -constexpr int i = 42; // { dg-message "std=c\\+\\+0x" } +constexpr int i = 42; // { dg-message "std=c\\+\\+11" } // { dg-error "constexpr" "" { target *-*-* } 3 } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-99.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-99.C new file mode 100644 index 0000000000..13a5ea3e6c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-99.C @@ -0,0 +1,13 @@ +// Origin PR c++/51462 +// { dg-options "-std=c++11" } + +struct A +{ + int i = 0; +}; + +struct B +{ + A a; + constexpr B() : a(0) {} // { dg-error "no matching function" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-abi1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-abi1.C new file mode 100644 index 0000000000..e83f142300 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-abi1.C @@ -0,0 +1,16 @@ +// PR c++/47301 +// { dg-options "-std=c++0x -fabi-version=1" } + +struct A +{ + constexpr operator int () + { + return 1; + } +}; + +template < int > struct B +{ + static constexpr A a = A(); + int ar[a]; +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr7.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr7.C new file mode 100644 index 0000000000..44775c0703 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr7.C @@ -0,0 +1,20 @@ +// PR c++/49290 +// { dg-options -std=c++0x } + +typedef unsigned T; +struct S +{ + constexpr T foo (void); + unsigned s1[16]; +}; + +constexpr T +S::foo () +{ + return *(T *) (s1 + 10); +} + +constexpr S s = { 0,1,2,3,4,5,6,7,8,9,10 }; + +#define SA(X) static_assert ((X), #X) +SA(s.foo() == 10); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-builtin1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-builtin1.C new file mode 100644 index 0000000000..b3f5576360 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-builtin1.C @@ -0,0 +1,25 @@ +// PR c++/49813 +// { dg-options -std=c++0x } + +inline constexpr bool +isinf(long double __x) +{ return __builtin_isinf(__x); } + +inline constexpr bool +isinf(double __x) +{ return __builtin_isinf(__x); } + +inline constexpr bool +isnan(long double __x) +{ return __builtin_isnan(__x); } + +int main() +{ + constexpr long double num1 = __builtin_isinf(1.l); // Ok. + + constexpr long double num2 = isinf(1.l); // Error. + + constexpr double num3 = isinf(1.); // Ok. + + constexpr long double num4 = isnan(1.l); // Ok. +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-cache1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-cache1.C new file mode 100644 index 0000000000..b6d7b64713 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-cache1.C @@ -0,0 +1,9 @@ +// PR c++/51433 +// { dg-options -std=c++0x } + +constexpr int f(); +constexpr int g() { return f(); } +extern const int n = g(); // dynamic initialization +constexpr int f() { return 42; } +extern const int m = g(); +static_assert(m == 42, "m == 42"); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-compound.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-compound.C new file mode 100644 index 0000000000..81fcc54b3e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-compound.C @@ -0,0 +1,9 @@ +// { dg-options "-std=c++0x -pedantic-errors" } + +constexpr int f() +{ + { // { dg-error "" } + return 1; + } + { } // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-const1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-const1.C new file mode 100644 index 0000000000..6ee72256e2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-const1.C @@ -0,0 +1,7 @@ +// PR c++/54086 +// { dg-do compile { target c++11 } } + +static constexpr const char Data[] = { + 'D', 'A', 'T', 'A', +}; +static constexpr const char *data_func() { return Data; } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor11.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor11.C new file mode 100644 index 0000000000..4b526eaa79 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor11.C @@ -0,0 +1,16 @@ +// PR c++/55856 +// { dg-options -std=c++11 } + +struct A +{ + A(const char *); +}; + +template <class T> +struct B +{ + T t; + template <class U> constexpr B(U&& u): t(u) { }; +}; + +B<A&&> b(""); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor12.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor12.C new file mode 100644 index 0000000000..a5a4b4d14a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor12.C @@ -0,0 +1,14 @@ +// PR c++/55753 +// { dg-options -std=c++11 } + +template <typename Tp> +struct C { + constexpr C(const Tp& r) { } +}; + +template <typename Tp> +struct B { + B() { + C<double> cpl = C<double>((true ? 1.0 : C<double>())); + } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-decl.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-decl.C index 0a3fcb6562..8c46fab333 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-decl.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-decl.C @@ -2,8 +2,8 @@ // { dg-options -std=c++0x } struct S { - static constexpr int size; // { dg-error "must have an initializer" } - // { dg-error "previous declaration" "" { target *-*-* } 5 } + static constexpr int size; // { dg-error "must have an initializer" "must have" } + // { dg-error "previous declaration" "previous" { target *-*-* } 5 } }; const int limit = 2 * S::size; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-default-ctor.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-default-ctor.C new file mode 100644 index 0000000000..d3868b599a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-default-ctor.C @@ -0,0 +1,12 @@ +// { dg-options -std=c++0x } + +struct A { + int i; + constexpr A():i(42) { }; +}; +struct B: A { }; +constexpr int f(B b) { return b.i; } + +struct C { C(); }; // { dg-message "calls non-constexpr" } +struct D: C { }; // { dg-message "no constexpr constructor" } +constexpr int g(D d) { return 42; } // { dg-error "invalid type" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-delegating.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-delegating.C new file mode 100644 index 0000000000..a020888767 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-delegating.C @@ -0,0 +1,15 @@ +// PR c++/51526 +// { dg-options -std=c++0x } + +const int j = 42; + +struct S { + int i; + constexpr S(int i) : i(i) {} + constexpr S() : S(j) {} +}; + +constexpr S s{}; + +#define SA(X) static_assert((X),#X) +SA(s.i == 42); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-delegating2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-delegating2.C new file mode 100644 index 0000000000..c85ed2e819 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-delegating2.C @@ -0,0 +1,28 @@ +// PR c++/51723 +// { dg-options -std=c++0x } + +template <int... V> +struct A +{ + static constexpr int a[sizeof...(V)] = { V... }; +}; + +template <int... V> constexpr int A<V...>::a[]; + +struct B +{ + const int* const b; + + template <unsigned int N> + constexpr B(const int(&b)[N]) + : b(b) + { } + + template <int... V> + constexpr B(A<V...>) + : B(A<V...>::a) + { } +}; + +constexpr B b1 = A<10, 20, 30>::a; +constexpr B b2 = A<10, 20, 30>(); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-diag1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-diag1.C index 183d3f768f..cbd4983e84 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-diag1.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-diag1.C @@ -13,8 +13,8 @@ struct B { B(); operator int(); }; constexpr A<int> ai = { 42 }; constexpr int i = ai.f(); -constexpr int b = A<B>().f(); // { dg-error "not a constexpr function" } +constexpr int b = A<B>().f(); // { dg-error "non-constexpr function" } template <class T> constexpr int f (T t) { return 42; } // { dg-error "parameter" } -constexpr int x = f(B()); // { dg-error "constexpr function" } +constexpr int x = f(B()); // { dg-error "constexpr" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-diag3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-diag3.C new file mode 100644 index 0000000000..100c17edb4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-diag3.C @@ -0,0 +1,54 @@ +// PR c++/45923 +// { dg-options -std=c++0x } + +int f(int); + +template <class T> +constexpr T g(T t) { return f(t); } // { dg-error "f.int" } + +int main() +{ + constexpr int i = g(1); // { dg-error "g.T" } +} + +// -------------------- + +struct complex // { dg-message "no constexpr constructor" } +{ + complex(double r, double i) : re(r), im(i) { } + constexpr double real() { return re; } // { dg-error "not a literal type" } + double imag() const { return im; } + +private: + double re; + double im; +}; + +constexpr complex co1(0, 1); // { dg-error "not literal" } +constexpr double dd2 = co1.real(); // { dg-error "non-constexpr function" } + +// -------------------- + +struct base // { dg-message "no constexpr constructor" } +{ + int _M_i; + base() : _M_i(5) { } +}; + +struct derived : public base // { dg-message "base class" } +{ + constexpr derived(): base() { } // { dg-error "non-constexpr function" } +}; + +constexpr derived obj; // { dg-error "not literal" } + +// -------------------- + +struct Def +{ + int _M_i; // { dg-message "does not initialize" } + + constexpr Def() = default; // { dg-error "implicit declaration is not constexpr" } +}; + +constexpr Def defobj; // { dg-error "uninitialized" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-diag4.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-diag4.C new file mode 100644 index 0000000000..371190e978 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-diag4.C @@ -0,0 +1,25 @@ +// Origin: PR c++/51633 +// { dg-options "-std=c++11" } + +struct A +{ + ~A(); +}; + +struct B +{ + A a; + constexpr B() {} +}; + +struct A1 +{ + int a; + ~A1(); +}; + +struct B1 +{ + A1 a1; + constexpr B1() {} // { dg-error "uninitialized member" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-diag5.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-diag5.C new file mode 100644 index 0000000000..c0cbfdd1c5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-diag5.C @@ -0,0 +1,48 @@ +// Origin: PR c++/51633 +// { dg-options "-std=c++11" } + +struct A +{ + constexpr A() {} + ~A(); +}; + +struct B +{ + A a; + A b; + A c; + constexpr B() {} +}; + +struct C +{ + A a; + constexpr C() {} +}; + +struct D +{ + constexpr D() { return;} // { dg-error "does not have empty body" } +}; + +struct D1 +{ + A a; + constexpr D1() { return;} // { dg-error "does not have empty body" } +}; + +struct D2 +{ + A a; + A b; + constexpr D2() { return;} // { dg-error "does not have empty body" } +}; + +struct D3 +{ + A a; + A b; + A c; + constexpr D3() { return;} // { dg-error "does not have empty body" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C index 4ab4677805..3df7956fd2 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C @@ -88,7 +88,7 @@ struct resource { } }; constexpr resource f(resource d) -{ return d; } // { dg-error "not .constexpr" } -constexpr resource d = f(9); // { dg-error "resource" } +{ return d; } // { dg-error "non-constexpr" } +constexpr resource d = f(9); // { dg-message "constexpr" } // 4.4 floating-point constant expressions diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-friend.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-friend.C index f1d9ccee79..57782cf349 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-friend.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-friend.C @@ -19,5 +19,5 @@ struct C constexpr int i = f(C<int>()); constexpr int j = C<int>().m(C<int>()); -constexpr int k = C<double>().m(A()); // { dg-error "not a constexpr function" } -constexpr int l = g(C<double>(),A()); // { dg-error "not a constexpr function" } +constexpr int k = C<double>().m(A()); // { dg-error "constexpr" } +constexpr int l = g(C<double>(),A()); // { dg-error "constexpr" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-generated1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-generated1.C new file mode 100644 index 0000000000..73ddc8f5c2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-generated1.C @@ -0,0 +1,21 @@ +// { dg-options -std=c++0x } + +template <class T> struct A +{ + constexpr T f (); +}; + +int g(); + +// We should complain about this. +template<> constexpr int A<int>::f() +{ return g(); } // { dg-error "non-constexpr" } + +// But not about this. +struct B +{ + int i; + constexpr B(int i = g()):i(i) { } +}; +struct C: B { }; +C c; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ice2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ice2.C index 35643b990c..856246fcc9 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-ice2.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ice2.C @@ -1,3 +1,3 @@ // { dg-options -std=c++0x } int x; -constexpr int& rx = x; // { dg-error "int&" } +constexpr int& rx = x; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ice4.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ice4.C new file mode 100644 index 0000000000..e1ee36dfc9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ice4.C @@ -0,0 +1,9 @@ +// PR c++/51612 +// { dg-options -std=c++0x } + +struct A {}; + +struct B : virtual A +{ + constexpr B() { } // { dg-error "has virtual base classes" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ice5.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ice5.C new file mode 100644 index 0000000000..b88ec66c9f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ice5.C @@ -0,0 +1,13 @@ +// PR c++/51621 +// { dg-options -std=c++0x } + +struct A +{ + A() {} +}; + +struct B +{ + A a[1]; + constexpr B() : a() {} // { dg-error "non-constant|non-constexpr" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ice6.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ice6.C new file mode 100644 index 0000000000..1a494bb323 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ice6.C @@ -0,0 +1,11 @@ +// PR c++/51327 +// { dg-options -std=c++0x } + +struct A +{ + A(int); +}; + +struct B : A {}; // { dg-error "no matching" } + +constexpr int foo(B) { return 0; } // { dg-error "invalid type" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete1.C index 71372d226a..3f40e29aec 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete1.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete1.C @@ -2,6 +2,6 @@ struct A { - static constexpr A a = 1; // { dg-error "incomplete|literal" } + static constexpr A a = 1; // { dg-error "incomplete" } constexpr A(int i) { } }; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete2.C index dc0b7429dc..f61535f06b 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete2.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete2.C @@ -28,4 +28,4 @@ struct D C<D> c; }; -constexpr D d {}; // { dg-error "not a constexpr function" } +constexpr D d {}; // { dg-error "non-constexpr function" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist4.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist4.C new file mode 100644 index 0000000000..8151857569 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist4.C @@ -0,0 +1,8 @@ +// { dg-options -std=c++0x } + +struct A { int i; }; +struct B: A { constexpr B(): A{} {} }; +struct B2: A { constexpr B2(): A{1} {} }; + +struct C { protected: int i; }; +struct D: C { constexpr D(): C{} {} }; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist6.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist6.C new file mode 100644 index 0000000000..6b822a1f77 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist6.C @@ -0,0 +1,27 @@ +// PR c++/55419 +// { dg-options -std=c++11 } + +struct P +{ + P () = default; + explicit constexpr P (int x) : p (x) {} + int p; +}; + +struct Q +{ + constexpr Q () : q (0x7f) {} + int q; +}; + +struct R +{ + Q q; + P p; +}; + +void +foo (R *x) +{ + *x = {}; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-is_literal.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-is_literal.C index d1b95437db..82514ed865 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-is_literal.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-is_literal.C @@ -33,6 +33,7 @@ YES(NotLiteral (NotLiteral::*)(NotLiteral)); struct A { A(const A&) = default; + A(int); }; NO(A); // no constexpr ctor other than copy diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-mutable1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-mutable1.C new file mode 100644 index 0000000000..a14d611cee --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-mutable1.C @@ -0,0 +1,12 @@ +// { dg-options -std=c++0x } + +struct A +{ + int i; + mutable int j; +}; + +constexpr A a = { 0, 1 }; +constexpr A b = a; // { dg-error "mutable" } +constexpr int i = a.i; +constexpr int j = a.j; // { dg-error "mutable" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept6.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept6.C new file mode 100644 index 0000000000..91e93fd91b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept6.C @@ -0,0 +1,10 @@ +// PR c++/51305 +// { dg-options -std=c++0x } + +constexpr bool ok() noexcept +{ + typedef int type; + return true; +} + +constexpr auto x = ok(); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-nullptr.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-nullptr.C index 7ac53db489..6381323cc0 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-nullptr.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-nullptr.C @@ -2,5 +2,5 @@ constexpr int zero() { return 0; } -void* ptr1 = zero(); // #1 -constexpr void* ptr2 = zero(); // #2 +void* ptr1 = zero(); // { dg-error "int" } +constexpr void* ptr2 = zero(); // { dg-error "int" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-object1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-object1.C index 4ff398bf1f..6c9d466441 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-object1.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-object1.C @@ -18,8 +18,7 @@ extern constexpr int i2; // { dg-error "definition" } // error: missing initializer constexpr A1 a2; // { dg-error "uninitialized const" } -// error: duplicate cv -const constexpr A1 a3 = A1(); // { dg-error "both .const. and .constexpr. cannot" } +const constexpr A1 a3 = A1(); volatile constexpr A1 a4 = A1(); // { dg-error "both .volatile. and .constexpr. cannot" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrsub.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrsub.C new file mode 100644 index 0000000000..bccec73bb0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrsub.C @@ -0,0 +1,14 @@ +// PR c++/51489 +// DR 1313 +// { dg-options "-std=c++0x" } + +struct array +{ + constexpr array() :x(0) {} + constexpr int const* begin() { return &x; } + int x; +}; +constexpr array aa; +constexpr auto b = aa.begin(); +static_assert(b-b == 0, "compiles just fine"); +static_assert(aa.begin()-aa.begin() == 0, "compiler thinks it's not a constant expression"); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ref1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ref1.C new file mode 100644 index 0000000000..482e1ba369 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ref1.C @@ -0,0 +1,44 @@ +// PR c++/49172 +// { dg-options -std=c++0x } + +#define SA(X) static_assert((X),#X) + +constexpr int g() { return 42; }; +constexpr int(&rg)() = g; // #1 + +SA(rg() == 42); + +constexpr int i = 24; +constexpr int const& ri = i; // #2 + +SA(&ri == &i); +SA(ri == 24); + +void f() +{ + constexpr int(&rg)() = g; // #1 + + SA(rg() == 42); + + constexpr static int i = 24; + constexpr int const& ri = i; // #2 + + SA(&ri == &i); + SA(ri == 24); +} + +template <class T> +void f2() +{ + constexpr int(&rg)() = g; // #1 + + SA(rg() == 42); + + constexpr static int i = 24; + constexpr int const& ri = i; // #2 + + SA(&ri == &i); + SA(ri == 24); +} + +template void f2<int>(); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ref2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ref2.C new file mode 100644 index 0000000000..2a86eb765c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ref2.C @@ -0,0 +1,17 @@ +// Negative reference variable tests. +// { dg-options -std=c++0x } + +extern int *p; +constexpr int& ri = *p; // { dg-error "p" } + +extern constexpr int &er; // { dg-error "not a definition" } +constexpr int& ri2 = er; // { dg-error "er" } + +void f(int j) +{ + constexpr int i = 42; + constexpr int const& ri = i; // { dg-error "" } + + constexpr int& rj = j; // { dg-error "" } +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ref3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ref3.C new file mode 100644 index 0000000000..24cc9c8244 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ref3.C @@ -0,0 +1,10 @@ +// PR c++/50298 +// { dg-options -std=c++0x } + +int global_variable; + +template <class T> struct X { + static constexpr T r = global_variable; +}; + +X<int&> x; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ref4.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ref4.C new file mode 100644 index 0000000000..6ae355a273 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ref4.C @@ -0,0 +1,18 @@ +// PR c++/54777 +// { dg-options -std=c++0x } + +struct S +{ + int s[1]; + constexpr const int &foo (unsigned i) { return (i < 1 ? 0 : throw 1), s[i]; } + constexpr const int &bar (unsigned i) { return i < 1 ? s[i] : (throw 0, s[i]); } +}; + +int +main () +{ + constexpr S a {}; + constexpr int i = a.foo (0); + constexpr int j = a.bar (0); + static_assert (i == j, "Ouch"); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-rom.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-rom.C new file mode 100644 index 0000000000..5213d5930a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-rom.C @@ -0,0 +1,13 @@ +// PR c++/49673: check that test_data goes into .rodata +// { dg-options -std=c++0x } +// { dg-additional-options -G0 { target { { alpha*-*-* frv*-*-* ia64-*-* lm32*-*-* m32r*-*-* microblaze*-*-* mips*-*-* powerpc*-*-* rs6000*-*-* score*-*-* } && { ! { *-*-darwin* *-*-aix* alpha*-*-osf* alpha*-*-*vms* } } } } } +// { dg-final { scan-assembler "\\.rdata" { target mips*-*-* } } } +// { dg-final { scan-assembler "rodata" { target { { *-*-linux-gnu || *-*-elf } && { ! mips*-*-* } } } } } + +struct Data +{ + int i; + constexpr Data(int i = 0) : i(i+1) {} +}; + +extern const Data test_data = { 1 }; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-static7.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-static7.C index ba4a251840..e46ddafd70 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-static7.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-static7.C @@ -3,6 +3,8 @@ struct A { static constexpr bool is(); + static constexpr bool is_not(); }; constexpr bool A::is() { return true; } +constexpr bool A::is_not() const { return true; } // { dg-error "static" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-static8.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-static8.C new file mode 100644 index 0000000000..7c84cf8b07 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-static8.C @@ -0,0 +1,7 @@ +// PR c++/50258 +// { dg-options "-std=c++0x -fpermissive" } + +struct Foo { + static const double d = 3.14; // { dg-warning "constexpr" } +}; +const double Foo::d; // { dg-warning "constexpr" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-temp1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-temp1.C new file mode 100644 index 0000000000..d065436327 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-temp1.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +struct A { int i; }; +constexpr A f2 (const A& a) { return a; } +constexpr int f1 (const A &a) { return f2(a).i; } +A g(const A &a) +{ + return { f1(a) }; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-template1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-template1.C new file mode 100644 index 0000000000..88077231b0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-template1.C @@ -0,0 +1,27 @@ +// PR c++/50248, DR 1358 +// { dg-options -std=c++0x } + +template<class Elt, unsigned max> +struct earray +{ + Elt elts[max]; + earray() = default; + template<typename... Elt2> + constexpr earray(Elt2&& ... e): elts(0) { } +}; + +struct SessionData +{ + SessionData(SessionData&) = delete; + SessionData() = default; +}; + +struct MapSessionData : SessionData +{ + earray<short, 11> equip_index; +}; + +void test() +{ + MapSessionData *sd = new MapSessionData; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-template2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-template2.C new file mode 100644 index 0000000000..6786d1651e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-template2.C @@ -0,0 +1,12 @@ +// { dg-options -std=c++0x } + +template <class T> struct A +{ + T t; + constexpr A() { } // { dg-error "uninitialized" } +}; + +int main() +{ + constexpr A<int> a; // { dg-error "A()" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-template3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-template3.C new file mode 100644 index 0000000000..75b2fc4634 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-template3.C @@ -0,0 +1,9 @@ +// { dg-options -std=c++0x } + +struct A { constexpr operator int() { return 42; } }; + +template<class T> +struct B { + static const int versionConst = A(); + enum { versionEnum = versionConst }; +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-tuple.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-tuple.C new file mode 100644 index 0000000000..f59cd84530 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-tuple.C @@ -0,0 +1,106 @@ +// PR c++/53202 +// { dg-do run { target c++11 } } + +#include <tuple> + +template<typename Callable> + struct Bind_simple + { + explicit + Bind_simple(const Callable& callable) + : _M_bound(callable) + { } + + Bind_simple(const Bind_simple&) = default; + Bind_simple(Bind_simple&&) = default; + + auto operator()() -> decltype((*(Callable*)0)()) + { + return std::get<0>(_M_bound)(); + } + + private: + + std::tuple<Callable> _M_bound; + }; + +template<typename Callable> + Bind_simple<Callable> + bind_simple(Callable& callable) + { + return Bind_simple<Callable>(callable); + } + +struct thread +{ + struct ImplBase { }; + + template<typename T> + struct Impl : ImplBase { + T t; + Impl(T&& t) : t(std::move(t)) { } + }; + + template<typename T> + thread(T& t) + { + auto p = make_routine(bind_simple(t)); + + p->t(); + + delete p; + } + + template<typename Callable> + Impl<Callable>* + make_routine(Callable&& f) + { + return new Impl<Callable>(std::forward<Callable>(f)); + } +}; + + +int c; +class background_hello +{ +public: + background_hello() + { + __builtin_printf("default ctor called, this=%p\n", this); + ++c; + } + + background_hello(const background_hello &) + { + __builtin_printf("copy ctor called\n"); + ++c; + } + + background_hello(background_hello &&) + { + __builtin_printf("move ctor called\n"); + ++c; + } + + void operator ()() const + { + __builtin_printf("void background_hello::operator()() called, this=%p\n", this); + } + + ~background_hello() + { + __builtin_printf("destructor called, this=%p\n", this); + --c; + } + +}; + +int main() +{ + { + background_hello bh; + thread t(bh); + } + if (c != 0) + __builtin_abort (); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-union.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-union.C index b4613058ee..3c7a7f38ec 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-union.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-union.C @@ -1,5 +1,5 @@ // Test that we don't have to deal with type punning -// FIXME Mike Miller thinks it should work +// DR 1188 says this is ill-formed // { dg-options -std=c++0x } union U diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-union2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-union2.C new file mode 100644 index 0000000000..0bf2aa7e2b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-union2.C @@ -0,0 +1,18 @@ +// PR c++/51675 +// { dg-options -std=c++0x } + +union foo +{ + int x = 0; + short y; + + constexpr foo() = default; +}; + +union bar +{ + int x; + short y; + + constexpr bar() = default; // { dg-error "constexpr" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-union3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-union3.C new file mode 100644 index 0000000000..bac9cabfe5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-union3.C @@ -0,0 +1,12 @@ +// PR c++/51675 +// { dg-options -std=c++11 } + +union foo +{ + int x; + short y; + + constexpr foo(): x(0) { } +}; + +constexpr foo f; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-using.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-using.C new file mode 100644 index 0000000000..fc794e9abd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-using.C @@ -0,0 +1,27 @@ +// Core issue 898 +// { dg-options -std=c++0x } + +namespace N { const int i = 42; } +namespace M { const int j = 42; } + +constexpr int g() { + using namespace N; + using M::j; + static_assert (i == 42, "i == 42"); + return i + j; +} + +template <class T> +constexpr int h() { + using namespace N; + using M::j; + static_assert (i == 42, "i == 42"); + return i + j; +} + +constexpr int i = g(); +constexpr int i2 = h<int>(); + +static_assert (i == 84, "i == 84"); +static_assert (i2 == 84, "i2 == 84"); + diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-using2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-using2.C new file mode 100644 index 0000000000..6b282813e5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-using2.C @@ -0,0 +1,18 @@ +// PR c++/49520 +// { dg-options -std=c++0x } + +namespace x { void foo(); } + +template<typename T> +struct traits +{ + static constexpr bool f() { return true; } + + static constexpr bool g() + { + using x::foo; + return f() && noexcept(foo()); + } +}; + +template struct traits<int>; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual2.C new file mode 100644 index 0000000000..86040a31b1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual2.C @@ -0,0 +1,24 @@ +// PR c++/54341 +// { dg-do compile { target c++11 } } + +template<typename T> +struct enable_shared_from_this +{ + constexpr enable_shared_from_this(); // { dg-warning "used but never defined" } + +private: + int mem; +}; + +class VTableClass { +public: + virtual void someVirtualMethod() { } +}; + +class SomeClass : public enable_shared_from_this< SomeClass >, public +VTableClass { }; + +SomeClass* createInstance() +{ + return new SomeClass; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual3.C new file mode 100644 index 0000000000..de446bcfd3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual3.C @@ -0,0 +1,42 @@ +// PR c++/54253 +// { dg-do compile { target c++11 } } + +namespace A { + class Base { + int x; + public: + constexpr Base(int x) : x(x) {} + }; + + class Base2 { + public: + virtual void fun() {} + }; + + class Derived : public Base2, public Base { + public: + constexpr Derived() : Base2(), Base(5) {} + }; + + constexpr Derived der; +} + +namespace B { + class Base { + int x; + public: + constexpr Base() : x(5) {} + }; + + class Base2 { + public: + virtual void fun() {} + }; + + class Derived : public Base, public Base2 { + public: + constexpr Derived() {} + }; + + constexpr Derived der; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual4.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual4.C new file mode 100644 index 0000000000..32cee96984 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual4.C @@ -0,0 +1,18 @@ +// PR c++/56291 +// { dg-options -std=c++11 } + +class Base +{ +public: + constexpr Base() : v(1) {}; + int v; +}; + +class Derived : public Base +{ +public: + constexpr Derived() : Base() {}; + virtual void function(); +}; + +Derived d; diff --git a/gcc/testsuite/g++.dg/cpp0x/dc1.C b/gcc/testsuite/g++.dg/cpp0x/dc1.C new file mode 100644 index 0000000000..ba2e4f4fd0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/dc1.C @@ -0,0 +1,43 @@ +// { dg-do compile } +// { dg-options --std=c++0x } + +struct B { + int i; + B (int _i) : i(_i) { } + ~B () { i = 0; } +}; + +struct A : public B { + A () : B(-1) { } + A (int i) : A() { } + A (double b) : A(static_cast<int>(b)) { } + A (double b, double b2) : A(b2) { } + ~A () { } +}; + +void f_A () { A a(2.0, 3.0); } + +struct C { + C () { } + virtual ~C() { } + virtual int f () = 0; +}; + +struct D : public C { + int i; + D (int _i) : C(), i(_i) { } + D () : D(-1) { } + virtual ~D() { } + virtual int f () { } +}; + +void f_D () { C* c = new D(); } + +template <typename T> +struct E { + T t; + E () : E(T()) { } + E (T _t) : t(_t) { } +}; + +void f_E () { E<int> e; } diff --git a/gcc/testsuite/g++.dg/cpp0x/dc2.C b/gcc/testsuite/g++.dg/cpp0x/dc2.C new file mode 100644 index 0000000000..dda0b9fc69 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/dc2.C @@ -0,0 +1,23 @@ +// { dg-do compile } +// { dg-options --std=c++0x } + +struct A { + int i, j; + A () : A(0), j(0) { } // { dg-error "constructor delegation" } + A (int _i) : i(_i) { } +}; + +struct B { + int i, j; + B () : i(0), B(0) { } // { dg-error "constructor delegation" } + B (int _j) : j(_j) { } + +}; + +struct C {}; + +struct D : public C { + D () : C() { } + D (float) : D(), C() { } // { dg-error "constructor delegation" } + D (float, float): C(), D() { } // { dg-error "constructor delegation" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/dc3.C b/gcc/testsuite/g++.dg/cpp0x/dc3.C new file mode 100644 index 0000000000..b411c997d8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/dc3.C @@ -0,0 +1,63 @@ +// { dg-do compile } +// { dg-options --std=c++0x } + +struct X {}; + +struct B { + int i; + B (int _i) : i(_i) { } + ~B () { i = 0; } +}; + +template <typename T> +struct A : public B { + A () : B(-1) { } + ~A () { } +}; + +template <typename T> +struct A<T*> : public B { + A () : B(-1) { } + A (int i) : A() { } + A (double b) : A(static_cast<int>(b)) { } + A (double b, double b2) : A(b2) { } + ~A () { } +}; + +void f_A () { A<X*> a(2.0, 3.0); } + +struct C { + C () { } + virtual ~C() { } + virtual int f () = 0; +}; + +template <typename T> +struct D : public C { + int i; + D (int _i) : C(), i(_i) { } +}; + +template <> +struct D<X> : public C { + int i; + D (int _i) : C(), i(_i) { } + D () : D(-1) { } + virtual ~D() { } + virtual int f () { } +}; + +void f_D () { D<X>* d = new D<X>(); } + +template <typename T> +struct E { +}; + +template <> +struct E<int> { + int i; + E () : E(0) { } + E (int _i) : i(_i) { } +}; + +void f_E () { E<int> e; } diff --git a/gcc/testsuite/g++.dg/cpp0x/dc4.C b/gcc/testsuite/g++.dg/cpp0x/dc4.C new file mode 100644 index 0000000000..634b5498de --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/dc4.C @@ -0,0 +1,7 @@ +// { dg-do compile } +// { dg-options "--std=c++98" } + +struct X { + X() {} + X(int) : X() {} // { dg-warning "delegating constructors" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/dc5.C b/gcc/testsuite/g++.dg/cpp0x/dc5.C new file mode 100644 index 0000000000..0052b32111 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/dc5.C @@ -0,0 +1,28 @@ +// { dg-do run } +// { dg-options "--std=c++0x" } + +#include <cassert> + +int count = 0; +struct VB +{ + VB() {++count;} +}; + +struct B : virtual VB +{ + B() : B(42) {} + B(int) {} +}; + +struct D : B +{ + D() {} + D(int) : D() {} +}; + +int main() +{ + D d{42}; + assert(count == 1); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/dc6.C b/gcc/testsuite/g++.dg/cpp0x/dc6.C new file mode 100644 index 0000000000..b16c0b47ba --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/dc6.C @@ -0,0 +1,40 @@ +// { dg-do run { target c++11 } } + +int a_ct; + +struct A +{ + A(int i): i(i) { ++a_ct; } + A(const A& a): i(a.i) { ++a_ct; } + ~A() { --a_ct; } + int i; +}; + +struct V +{ + V() { } +}; + +struct B: virtual V +{ + A a; + B(A a): a(a) { } + B(int i): B(A(i)) { } +}; + +struct C: B +{ + C(int i): B(i) { } +}; + +int main() +{ + { + B b(42); + C c(24); + if (b.a.i != 42 + ||c.a.i != 24) + __builtin_abort (); + } + return a_ct; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype-1212.C b/gcc/testsuite/g++.dg/cpp0x/decltype-1212.C new file mode 100644 index 0000000000..38393d3b87 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype-1212.C @@ -0,0 +1,11 @@ +// Core 1212 +// { dg-options -std=c++0x } + +template <class T, class U> struct assert_same_type; +template <class T> struct assert_same_type<T,T> {}; + +int main() +{ + int i; + assert_same_type<int&&,decltype(static_cast<int&&>(i))>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype2.C b/gcc/testsuite/g++.dg/cpp0x/decltype2.C index 186d75b725..e0c5900304 100644 --- a/gcc/testsuite/g++.dg/cpp0x/decltype2.C +++ b/gcc/testsuite/g++.dg/cpp0x/decltype2.C @@ -45,8 +45,8 @@ int bar(char); int bar(int); CHECK_DECLTYPE(decltype(foo), int(char)); -decltype(bar) z; // { dg-error "overload" } -// { dg-error "invalid type" "" { target *-*-* } 48 } +decltype(bar) z; // { dg-error "overload" "overload" } +// { dg-error "invalid type" "invalid" { target *-*-* } 48 } CHECK_DECLTYPE(decltype(&foo), int(*)(char)); CHECK_DECLTYPE(decltype(*&foo), int(&)(char)); diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype21.C b/gcc/testsuite/g++.dg/cpp0x/decltype21.C new file mode 100644 index 0000000000..733725626c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype21.C @@ -0,0 +1,34 @@ +// PR c++/6709 (DR 743) +// PR c++/42603 (DR 950) +// { dg-options -std=c++0x } + +template <class T> +T make(); + +struct p { typedef int t; }; +struct c : decltype(make<p>()) {}; + +decltype(make<p>())::t t; + +// PR c++/49823 + +template < typename T > +auto f( const T &x ) + -> typename decltype( x )::type; // ICE on here + +template < typename T > +typename decltype( T{} )::type // ICE on here +f( T ); + +template < typename T > +void f( T x ) +{ typename decltype( x )::type t; } // ICE on here + +// Negative tests + +int f(); +decltype(f())::t t2; // { dg-error "not a class" } + +struct D: decltype(f()) { }; // { dg-error "not a class" } + +// { dg-prune-output "expected initializer" } diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype26.C b/gcc/testsuite/g++.dg/cpp0x/decltype26.C new file mode 100644 index 0000000000..a81d411558 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype26.C @@ -0,0 +1,16 @@ +// { dg-options -std=c++0x } + +struct A { }; + +template <class T> +decltype(f(T())) f(T t) // { dg-error "depth" } +{ + return f(t); +} + +int main() +{ + f(A()); // { dg-error "no match" } +} + +// { dg-prune-output "note" } diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype28.C b/gcc/testsuite/g++.dg/cpp0x/decltype28.C new file mode 100644 index 0000000000..c97fd202c1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype28.C @@ -0,0 +1,16 @@ +// PR c++/44175 +// { dg-options -std=c++0x } + +template <bool, class T> struct enable_if { }; +template <class T> struct enable_if <true, T> { typedef T type; }; + +template <class F, int N> +void ft (F f, typename enable_if<N!=0, int>::type) {} + +template< class F, int N > +decltype(ft<F, N-1> (F(), 0)) +ft (F f, typename enable_if<N==0, int>::type) {} // { dg-error "depth" } + +int main() { + ft<struct a*, 2> (0, 0); // { dg-message "from here" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype29.C b/gcc/testsuite/g++.dg/cpp0x/decltype29.C new file mode 100644 index 0000000000..70fe4412dc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype29.C @@ -0,0 +1,19 @@ +// PR c++/44175 +// { dg-options -std=c++0x } + +template <bool, class T> struct enable_if { }; +template <class T> struct enable_if <true, T> { typedef T type; }; + +template <int x> +typename enable_if<x==0,int>::type +ft() {} + +template<class F, int N> +decltype (ft<F> (F())) +ft() {} // { dg-error "depth" } + +int main() { + ft<struct a*, 0>(); // { dg-error "no match|wrong number" } +} + +// { dg-prune-output "note" } diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype3.C b/gcc/testsuite/g++.dg/cpp0x/decltype3.C index aeacfae091..b44dd17c8e 100644 --- a/gcc/testsuite/g++.dg/cpp0x/decltype3.C +++ b/gcc/testsuite/g++.dg/cpp0x/decltype3.C @@ -55,8 +55,8 @@ public: }; CHECK_DECLTYPE(decltype(aa.*&A::a), int&); -decltype(aa.*&A::b) zz; // { dg-error "cannot create pointer to reference member" } -// { dg-error "invalid type" "" { target *-*-* } 58 } +decltype(aa.*&A::b) zz; // { dg-error "cannot create pointer to reference member" "cannot" } +// { dg-error "invalid type" "invalid type" { target *-*-* } 58 } CHECK_DECLTYPE(decltype(caa.*&A::a), const int&); class X { diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype32.C b/gcc/testsuite/g++.dg/cpp0x/decltype32.C new file mode 100644 index 0000000000..66731cc947 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype32.C @@ -0,0 +1,12 @@ +// PR c++/50075 +// { dg-options -std=c++0x } + +template <typename T> +auto make_array(const T& il) -> // { dg-error "not declared" } +decltype(make_array(il)) +{ } + +int main() +{ + int z = make_array(1); // { dg-error "no match" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype33.C b/gcc/testsuite/g++.dg/cpp0x/decltype33.C new file mode 100644 index 0000000000..d022d16648 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype33.C @@ -0,0 +1,18 @@ +// PR c++/50084 +// { dg-options "-std=c++0x -fno-inline" } + +template<typename> struct remove_reference; +template<typename T> struct remove_reference<T&> { typedef T type; }; + +template <class T> void f(T) { } + +void g() +{ + struct { } * v = 0; + + typedef remove_reference<decltype(*v)>::type at; + + // The typedef should't assign the name "at" to the struct. + // { dg-final { scan-assembler "_Z1fIZ1gvEUt_EvT_" } } + f(at()); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype34.C b/gcc/testsuite/g++.dg/cpp0x/decltype34.C new file mode 100644 index 0000000000..fbd15c2797 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype34.C @@ -0,0 +1,19 @@ +// PR c++/50870 +// { dg-options "-std=gnu++0x" } + +struct impl +{ + template <class T> static T create(); +}; + +template<class T, class U, + class = decltype(impl::create<T>()->impl::create<U>())> +struct tester{}; + +tester<impl*, int> ti; + +template<class T, class U, + class = decltype(impl::create<T>()->impl::create<U>())> +int test() { return 0; } + +int i = test<impl*, int>(); diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype35.C b/gcc/testsuite/g++.dg/cpp0x/decltype35.C new file mode 100644 index 0000000000..d1fd47638a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype35.C @@ -0,0 +1,15 @@ +// PR c++/50870 +// { dg-options -std=c++0x } + +template <class V> + struct impl + { + template <class T> static T create(); + }; + +template <class T, class U, class V, class + = decltype(impl<V>::template create<T>() + -> impl<V>::template create<U>())> +struct tester { }; + +tester<impl<float>*, int, float> ti; diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype36.C b/gcc/testsuite/g++.dg/cpp0x/decltype36.C new file mode 100644 index 0000000000..f3dfed992c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype36.C @@ -0,0 +1,21 @@ +// PR c++/51265 +// { dg-options -std=c++0x } + +struct Funny +{ + int print(int); +}; + +template<typename X> +void c(); + +template<typename X, X ff> +void xx() +{ + c<decltype(ff)>(); +} + +int main() +{ + xx<int(Funny::*)(int), &Funny::print>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype37.C b/gcc/testsuite/g++.dg/cpp0x/decltype37.C new file mode 100644 index 0000000000..c885e9a076 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype37.C @@ -0,0 +1,14 @@ +// PR c++/53651 +// { dg-do compile { target c++11 } } + +template<typename> struct wrap { void bar(); }; + +template<typename T> auto foo(T* t) -> wrap<T>* { return 0; } + +template<typename T> +struct holder : decltype(*foo((T*)0)) // { dg-error "class type" } +{ + using decltype(*foo((T*)0))::bar; // { dg-error "is not a base" } +}; + +holder<int> h; diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype38.C b/gcc/testsuite/g++.dg/cpp0x/decltype38.C new file mode 100644 index 0000000000..97ebb33a03 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype38.C @@ -0,0 +1,17 @@ +// PR c++/53498 +// { dg-do compile { target c++11 } } + +template<typename... Args> +struct B +{ + template<typename U> + static + void b(const U& u, const Args&... args, + decltype(u.f(args...)) dummy) + { + } +}; + +int main() { + B<int> b; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype48.C b/gcc/testsuite/g++.dg/cpp0x/decltype48.C new file mode 100644 index 0000000000..5aa0174a1e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype48.C @@ -0,0 +1,16 @@ +// PR c++/56059 +// { dg-options -std=c++11 } + +typedef int Int; +template<typename T> struct baz { }; +template<typename T> T bar(); + +template<typename T, typename ... U> +baz<decltype(bar<Int>(bar<U>() ...))> +foo(); // { dg-error "no match" } + +int main() +{ + foo<int, int>(); // { dg-error "no match" } + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted15.C b/gcc/testsuite/g++.dg/cpp0x/defaulted15.C index 4c5b11c9e1..0a47c20f77 100644 --- a/gcc/testsuite/g++.dg/cpp0x/defaulted15.C +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted15.C @@ -54,5 +54,5 @@ struct G: public F struct H { - virtual ~H() = default; // { dg-error "declared virtual" } + virtual ~H() = default; }; diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted20.C b/gcc/testsuite/g++.dg/cpp0x/defaulted20.C index 5d536a97ef..9b8c697aba 100644 --- a/gcc/testsuite/g++.dg/cpp0x/defaulted20.C +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted20.C @@ -2,13 +2,12 @@ // { dg-options -std=c++0x } struct A { - A(A&&) = default; // { dg-message "A::A|no known conversion" } + A(A&&) = default; }; struct B { const A a; B(const B&) = default; - B(B&&) = default; // { dg-error "implicitly deleted|no match" } - // { dg-message "candidate" "candidate note" { target *-*-* } 10 } + B(B&&) = default; // { dg-error "implicitly deleted|use of deleted" } }; void g(B); // { dg-error "argument 1" } diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted21.C b/gcc/testsuite/g++.dg/cpp0x/defaulted21.C index 3e740331d8..51505dc460 100644 --- a/gcc/testsuite/g++.dg/cpp0x/defaulted21.C +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted21.C @@ -3,7 +3,8 @@ struct U { U(); - U(U const&); +private: + U(U const&); // { dg-error "private" } }; struct X { @@ -12,8 +13,8 @@ struct X { X(X&&); }; -X::X(X&&)=default; // { dg-error "implicitly deleted" } -// { dg-error "does not have a move constructor" "" { target *-*-* } 15 } +X::X(X&&)=default; // { dg-message "implicitly deleted" } +// { dg-prune-output "within this context" } X f() { return X(); diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted22.C b/gcc/testsuite/g++.dg/cpp0x/defaulted22.C new file mode 100644 index 0000000000..61e9d32052 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted22.C @@ -0,0 +1,23 @@ +// Test that a virtual defaulted constructor is still virtual. +// { dg-do run } +// { dg-options -std=c++0x } + +int r = 1; + +struct A +{ + virtual ~A() = default; +}; + +struct B: A +{ + ~B() noexcept { r = 0; } +}; + +A* ap = new B(); + +int main() +{ + delete ap; + return r; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted23.C b/gcc/testsuite/g++.dg/cpp0x/defaulted23.C new file mode 100644 index 0000000000..5b4438ddd0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted23.C @@ -0,0 +1,27 @@ +// Test for checking of exception specifications on defaulted fns +// { dg-options -std=c++0x } + +struct A +{ + A() noexcept = default; +}; + +struct B +{ + B() throw (int) = default; // { dg-error "exception-specification that differs from the implicit declaration" } +}; + +struct C +{ + C() throw (int) { } +}; + +struct D: C +{ + D() throw (int) = default; +}; + +struct E +{ + E() = default; +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted25.C b/gcc/testsuite/g++.dg/cpp0x/defaulted25.C new file mode 100644 index 0000000000..2a38fedb24 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted25.C @@ -0,0 +1,10 @@ +// PR c++/48930 +// { dg-options -std=c++0x } +// { dg-prune-output "note" } + +struct A +{ + A(const A&) = default; +}; + +A a; // { dg-error "no match" } diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted28.C b/gcc/testsuite/g++.dg/cpp0x/defaulted28.C new file mode 100644 index 0000000000..bcbf763f6d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted28.C @@ -0,0 +1,17 @@ +// PR c++/49102 +// PR c++/50034 +// { dg-options -std=c++0x } + +struct A { + A() = default; + +private: + A(A const&) = default; // { dg-error "private" } +}; + +int f(...) { } +int main() { + A a; + f(a); // { dg-error "this context" } + sizeof(f(a)); // OK because unevaluated +} diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted31.C b/gcc/testsuite/g++.dg/cpp0x/defaulted31.C new file mode 100644 index 0000000000..de6a29854a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted31.C @@ -0,0 +1,16 @@ +// PR c++/39164 +// { dg-options -std=c++0x } + +struct A +{ + A() { } // { dg-error "defined" } + ~A() = default; // { dg-error "defaulted" } +}; + +A::A() = default; // { dg-error "redefinition" } +A::~A() noexcept (true) { } // { dg-error "defaulted" } + +int main() +{ + A a; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted33.C b/gcc/testsuite/g++.dg/cpp0x/defaulted33.C new file mode 100644 index 0000000000..2f11c1369d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted33.C @@ -0,0 +1,32 @@ +// PR c++/50973 +// { dg-do compile { target c++11 } } + +class HD +{ + public: + virtual ~HD() {}; +}; +class InputHD : public virtual HD +{ +}; +class OutputHD : public virtual HD +{ +}; +class IOHD : public InputHD, public OutputHD +{ +}; +template <typename T, unsigned int N> +class ArrayNHD : public IOHD +{ + public: + ~ArrayNHD() = default; +}; +class TLText +{ + ~TLText(); + ArrayNHD<int, 1>* m_argsHD; +}; +TLText::~TLText() +{ + delete m_argsHD; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted34.C b/gcc/testsuite/g++.dg/cpp0x/defaulted34.C new file mode 100644 index 0000000000..0821992673 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted34.C @@ -0,0 +1,10 @@ +// { dg-options -std=c++0x } +// { dg-final { scan-assembler "__cxa_deleted_virtual" } } + +struct A +{ + virtual void f(); + virtual ~A() = delete; +}; + +void A::f() {} diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted36.C b/gcc/testsuite/g++.dg/cpp0x/defaulted36.C new file mode 100644 index 0000000000..1360f608e6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted36.C @@ -0,0 +1,24 @@ +// PR c++/53733 +// { dg-do compile { target c++11 } } + +template<typename T> +struct wrap +{ + wrap() = default; + wrap(wrap&&) = default; // Line 5 + wrap(const wrap&) = default; + + T t; +}; + +struct S { + S() = default; + S(const S&){} + S(S&&) = default; +}; + +typedef wrap<const S> W; + +W get() { return W(); } // Line 19 + +int main() {} diff --git a/gcc/testsuite/g++.dg/cpp0x/diag1.C b/gcc/testsuite/g++.dg/cpp0x/diag1.C new file mode 100644 index 0000000000..b3f30bcd0b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/diag1.C @@ -0,0 +1,32 @@ +// { dg-options -std=c++0x } + +template <int U> +struct TypeA +{ + typedef int type; +}; + +template <int N> +struct TypeB +{ + template <int U> typename TypeA<U>::type fn(); +}; + +struct TypeC +{ + TypeB<10> b; + // This was being printed as: + // template<int N> + // decltype (((TypeC*)this)-> + // TypeC::b. + // template<int U> typename TypeA<U>::type TypeB::fn [with int U = U, int N = 10, typename TypeA<U>::type = TypeA<U>::type]()) + // TypeC::fn() + // we don't want to see the template header, return type, or parameter bindings + // for TypeB::fn. + template <int N> auto fn() -> decltype(b.fn<N>()); // { dg-bogus "typename|with" } +}; + +int main() +{ + TypeC().fn<4>(1); // { dg-error "no match" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/enum11.C b/gcc/testsuite/g++.dg/cpp0x/enum11.C new file mode 100644 index 0000000000..156c765bea --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/enum11.C @@ -0,0 +1,14 @@ +// PR c++/48969 +// { dg-options "-std=c++0x -ftemplate-depth=10" } + +template<unsigned int N> struct Pair { }; +struct Foo { enum { Mask = 1 }; } foo; +template<typename A, typename B> class Pair<A::Mask | B::Mask> +operator|(const A &, const B &) // { dg-message "substitution" } +{ } + +Pair<Foo::Mask> f = foo|foo; // { dg-message "no match" } + +// { dg-prune-output "note" } +// { dg-prune-output "here" } +// { dg-prune-output "instantiation depth" } diff --git a/gcc/testsuite/g++.dg/cpp0x/enum12.C b/gcc/testsuite/g++.dg/cpp0x/enum12.C new file mode 100644 index 0000000000..b2ec91990e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/enum12.C @@ -0,0 +1,18 @@ +// PR c++/48780 +// { dg-options "-std=c++0x -fabi-version=0" } + +typedef __builtin_va_list __gnuc_va_list; +typedef __gnuc_va_list va_list; + +enum struct A : short { X }; + +void foo(int x, ...) { + va_list vl; + __builtin_va_start(vl, x); + enum A t = __builtin_va_arg(vl, enum A); + __builtin_va_end(vl); +} + +int main() { + foo(0, A::X); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/enum14.C b/gcc/testsuite/g++.dg/cpp0x/enum14.C new file mode 100644 index 0000000000..709b201d1f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/enum14.C @@ -0,0 +1,12 @@ +// PR c++/48106 +// { dg-options -std=c++0x } + +enum class E : char +{ + e +}; + +bool operator&(E e, char m) +{ + return static_cast<int>(e) & m; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/enum17.C b/gcc/testsuite/g++.dg/cpp0x/enum17.C new file mode 100644 index 0000000000..8ba827e50f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/enum17.C @@ -0,0 +1,17 @@ +// PR c++/48536 +// { dg-options "-std=c++0x -pedantic-errors" } + +#include <climits> + +// According to C++11 / Clause 7.2/5 the following enumeration is +// well-formed. It is also well-formed in C++03 if UINT_MAX < ULONG_MAX, +// but C++11 adds long long. + +enum Enum_Inc { EI_1=UINT_MAX, EI_2 }; // #1 + +// It is not equivalent to the following. +enum Enum_Inc2 { FI_1=UINT_MAX, FI_2=FI_1+1 }; // #2 + +#define SA(X) static_assert(X,#X) +SA (EI_2 != 0); +SA (FI_2 == 0); diff --git a/gcc/testsuite/g++.dg/cpp0x/enum18.C b/gcc/testsuite/g++.dg/cpp0x/enum18.C index 5575ca6ce9..306ed8259f 100644 --- a/gcc/testsuite/g++.dg/cpp0x/enum18.C +++ b/gcc/testsuite/g++.dg/cpp0x/enum18.C @@ -2,7 +2,7 @@ // { dg-options -std=c++0x } int main(void) { - enum e {}; - e ev; - ev.e::~e_u(); // { dg-error "" } + enum e {}; + e ev; + ev.e::~e_u(); // { dg-error "e_u. has not been declared" } } diff --git a/gcc/testsuite/g++.dg/cpp0x/enum20.C b/gcc/testsuite/g++.dg/cpp0x/enum20.C new file mode 100644 index 0000000000..e5dc186e4a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/enum20.C @@ -0,0 +1,5 @@ +// PR c++/47635 +// { dg-options -std=c++0x } + +enum A { }; +void A::f() { } // { dg-error "not a class" } diff --git a/gcc/testsuite/g++.dg/cpp0x/enum21a.C b/gcc/testsuite/g++.dg/cpp0x/enum21a.C new file mode 100644 index 0000000000..5526811a63 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/enum21a.C @@ -0,0 +1,4 @@ +// { dg-do compile } +// { dg-options "-pedantic -std=c++98" } + +enum x { y, }; // { dg-warning "comma at end of enumerator list" } diff --git a/gcc/testsuite/g++.dg/cpp0x/enum21b.C b/gcc/testsuite/g++.dg/cpp0x/enum21b.C new file mode 100644 index 0000000000..48989128d8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/enum21b.C @@ -0,0 +1,4 @@ +// { dg-do compile } +// { dg-options "-pedantic -std=c++0x" } + +enum x { y, }; diff --git a/gcc/testsuite/g++.dg/cpp0x/error4.C b/gcc/testsuite/g++.dg/cpp0x/error4.C index 29a1cddab1..064c2f2f62 100644 --- a/gcc/testsuite/g++.dg/cpp0x/error4.C +++ b/gcc/testsuite/g++.dg/cpp0x/error4.C @@ -10,7 +10,7 @@ struct S { static U get(const volatile T&); template<typename U> - static decltype(*declval<U>()) get(...); + static decltype(*declval<U>()) get(...); // { dg-error "operator*" } typedef decltype(get<T>(declval<T>())) type; // { dg-error "no match" } }; diff --git a/gcc/testsuite/g++.dg/cpp0x/error5.C b/gcc/testsuite/g++.dg/cpp0x/error5.C new file mode 100644 index 0000000000..1931926422 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/error5.C @@ -0,0 +1,107 @@ +// PR c++/49181 +// { dg-options -std=c++0x } + +namespace std +{ + typedef __SIZE_TYPE__ size_t; + + template<typename _Tp, _Tp> + struct integral_constant; + + template<typename _Tp, _Tp __v> + struct integral_constant + { + static constexpr _Tp value = __v; + typedef _Tp value_type; + typedef integral_constant<_Tp, __v> type; + constexpr operator value_type() { return value; } + }; + + typedef integral_constant<bool, true> true_type; + + typedef integral_constant<bool, false> false_type; + + template<typename _Tp, _Tp __v> + constexpr _Tp integral_constant<_Tp, __v>::value; + + template<bool, typename _Tp = void> + struct enable_if + { }; + + template<typename _Tp> + struct enable_if<true, _Tp> + { typedef _Tp type; }; + + template<typename _Tp> + inline _Tp + declval(); + +struct bad_alloc { }; +} + +void* operator new(std::size_t) throw (std::bad_alloc); + +namespace std +{ + + template<typename _Tp> + class allocator + { + public: + typedef _Tp* pointer; + typedef _Tp value_type; + + pointer + allocate(size_t, const void* = 0); + }; + + template<typename _Alloc> + struct allocator_traits + { + typedef typename _Alloc::value_type value_type; + + template<typename _Tp> static typename _Tp::pointer +_S_pointer_helper(_Tp*); + static value_type* _S_pointer_helper(...); + typedef decltype(_S_pointer_helper((_Alloc*)0)) __pointer; + + typedef __pointer pointer; + + typedef const void* const_void_pointer; + + private: + template<typename _Alloc2> + struct __allocate_helper + { + template<typename _Alloc3, + typename = decltype(std::declval<_Alloc3*>()->allocate( + std::declval<size_t>(), + std::declval<const_void_pointer>()))> + static true_type __test(int); + + template<typename> + static false_type __test(...); + + typedef decltype(__test<_Alloc>(0)) type; + static const bool value = type::value; + }; + + template<typename _Alloc2> + static typename + enable_if<__allocate_helper<_Alloc2>::value, pointer>::type + _S_allocate(_Alloc2& __a, size_t __n, const_void_pointer __hint) + { return __a.allocate(__n, __hint); } + + public: + static pointer + allocate(_Alloc& __a, size_t __n, const_void_pointer __hint) + { return _S_allocate(__a, __n, __hint); } + }; + +} + +namespace std +{ + typedef short test_type; + template struct allocator_traits<allocator<test_type>>; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/error7.C b/gcc/testsuite/g++.dg/cpp0x/error7.C new file mode 100644 index 0000000000..0dfbf9f040 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/error7.C @@ -0,0 +1,10 @@ +// Test for printing the type of T{} in error messages. +// { dg-options -std=c++0x } + +template <class T, T t> struct A { }; +template <class T> A<T,T{}> f(T t); // { dg-message "T{}" } + +int main() +{ + f(); // { dg-error "no match" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/explicit6.C b/gcc/testsuite/g++.dg/cpp0x/explicit6.C new file mode 100644 index 0000000000..0d620be080 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/explicit6.C @@ -0,0 +1,11 @@ +// PR c++/47080 +// { dg-options -std=c++0x } + +struct A { + explicit operator int(); // { dg-message "qualification conversion" } +}; + +int main() { + bool b((A())); // { dg-error "invalid user-defined" } + !A(); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/explicit7.C b/gcc/testsuite/g++.dg/cpp0x/explicit7.C new file mode 100644 index 0000000000..7a0b73e9ba --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/explicit7.C @@ -0,0 +1,17 @@ +// [over.match.conv]: For direct-initialization, those explicit conversion +// functions that are not hidden within S and yield type T or a type that +// can be converted to type T with a qualification conversion (4.4) are +// also candidate functions. + +// { dg-options -std=c++0x } + +struct A { }; +struct B: A { }; +struct C { + explicit operator B*(); // { dg-message "explicit" } + explicit operator B&(); // { dg-message "explicit" } +}; + +C c; +A* ap (c); // { dg-error "" } +A& ar (c); // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg2.C b/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg2.C index 12cc83659c..d94843c1fe 100644 --- a/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg2.C +++ b/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg2.C @@ -4,11 +4,21 @@ struct B { }; struct D : B { }; struct A { - template<typename T = void> operator D&(); + template<typename T = void> operator D&(); // { dg-message "template conversion" } operator long(); }; void f(long); void f(B&); -int main() { f(A()); } +struct A2 { + template<typename T = void> operator B&(); +}; + +void f2(const B&); + +int main() { + f(A()); + f2(A2()); + f2(A()); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg4.C b/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg4.C new file mode 100644 index 0000000000..0248b60599 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg4.C @@ -0,0 +1,6 @@ +// PR c++/55724 +// { dg-options -std=c++11 } + +template<int N> struct S {}; +template<typename T = int, T N> void f(S<N>) {} +int main() { S<1> s; f(s); } diff --git a/gcc/testsuite/g++.dg/cpp0x/forw_enum10.C b/gcc/testsuite/g++.dg/cpp0x/forw_enum10.C new file mode 100644 index 0000000000..a57c0a9f41 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/forw_enum10.C @@ -0,0 +1,31 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +//This error is diagnosed at instantiation time +template<typename T> struct S1 +{ + enum E : T; // { dg-error "previous definition" } + enum E : int; // { dg-error "different underlying type" } +}; +template struct S1<short>; // { dg-message "required from here" } + +template<typename T> struct S2 +{ + enum E : T; + enum E : T; +}; +template struct S2<short>; + +template<typename T1, typename T2> struct S3 +{ + enum E : T1; + enum E : T2; +}; +template struct S3<short,short>; + +template<typename T1, typename T2> struct S4 +{ + enum E : T1; // { dg-error "previous definition" } + enum E : T2; // { dg-error "different underlying type" } +}; +template struct S4<short,char>; // { dg-message "required from here" } diff --git a/gcc/testsuite/g++.dg/cpp0x/forw_enum11.C b/gcc/testsuite/g++.dg/cpp0x/forw_enum11.C new file mode 100644 index 0000000000..dd5fd9be78 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/forw_enum11.C @@ -0,0 +1,24 @@ +// { dg-do compile } +// { dg-options "-std=c++0x -pedantic-errors" } + +enum { A = 1 }; +struct T +{ + int i1, i2, i3, i4, i5, i6, i7; + enum E2 : int; + + void f(); +}; + +enum T::E2 : int { A1 = A, A2 = 23 }; + +static_assert(int(T::A1) == 1, "error"); +static_assert(int(T::A2) == 23, "error"); + +void T::f() +{ + static_assert(int(T::A1) == 1, "error"); + static_assert(int(T::A2) == 23, "error"); + static_assert(int(A1) == 1, "error"); + static_assert(int(A2) == 23, "error"); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/forw_enum8.C b/gcc/testsuite/g++.dg/cpp0x/forw_enum8.C index c87aa5bf65..69e73119e0 100644 --- a/gcc/testsuite/g++.dg/cpp0x/forw_enum8.C +++ b/gcc/testsuite/g++.dg/cpp0x/forw_enum8.C @@ -15,7 +15,7 @@ template<typename T> struct S2 enum E : int; // { dg-error "previous definition" } enum E : T; // { dg-error "different underlying type" } }; -template struct S2<short>; // { dg-message "instantiated from here" } +template struct S2<short>; // { dg-message "required from here" } //This error is diagnosed at compilation time template<typename T> struct S3 diff --git a/gcc/testsuite/g++.dg/cpp0x/friend1.C b/gcc/testsuite/g++.dg/cpp0x/friend1.C new file mode 100644 index 0000000000..2cf4c3c715 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/friend1.C @@ -0,0 +1,22 @@ +// From N1791 +// { dg-options -std=c++0x } + +class C; +typedef C Ct; +class X1 { + friend C; // OK: class C is a friend +}; + +class X2 +{ + friend Ct; // OK: class C is a friend + friend D; // { dg-error "" } no type-name D in scope + friend class D; // OK: elaborated-type-specifier declares new class +}; + +template <typename T> class R { + friend T; +}; + +R<C> rc; // class C is a friend of R<C> +R<int> Ri; // OK: "friend int;" is ignored diff --git a/gcc/testsuite/g++.dg/cpp0x/friend2.C b/gcc/testsuite/g++.dg/cpp0x/friend2.C new file mode 100644 index 0000000000..39276a05ac --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/friend2.C @@ -0,0 +1,40 @@ +// PR c++/47721 +// { dg-options -std=c++0x } + +// template type parameter friend: + +template<class W> +class Q +{ + static const int I = 2; +public: + friend W; +}; + +struct B +{ + int ar[Q<B>::I]; +}; + +// bonus template template parameter friend: + +template <class T> struct A; + +template<template <class> class W> +class P +{ + static const int I = 2; +public: + // I'm not sure this is well-formed, but I can't find anything + // that says otherwise. + template <class T> friend class W; +}; + +template <class T> +struct A +{ + int ar[P<A>::I]; +}; + +A<int> a; + diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit-copy.C b/gcc/testsuite/g++.dg/cpp0x/implicit-copy.C index 861fe201f1..c3f6b85e24 100644 --- a/gcc/testsuite/g++.dg/cpp0x/implicit-copy.C +++ b/gcc/testsuite/g++.dg/cpp0x/implicit-copy.C @@ -3,13 +3,13 @@ struct S { S(); private: - S(S const &&); // { dg-error "" } - S & operator=(S const &&); // { dg-error "" } + S(S const &&); + S & operator=(S const &&); }; void f() { S a; - S b(a); // { dg-error "" } - a = b; // { dg-error "" } + S b(a); // { dg-error "deleted" } + a = b; // { dg-error "deleted" } } diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit11.C b/gcc/testsuite/g++.dg/cpp0x/implicit11.C new file mode 100644 index 0000000000..7ec8e95dcb --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/implicit11.C @@ -0,0 +1,17 @@ +// Test that we consider base dtors in determining whether +// a derived ctor is deleted even if the ctor is trivial. +// { dg-options -std=c++0x } + +struct A +{ + ~A() = delete; // { dg-error "declared here" } +}; + +struct B: A { }; // { dg-error "deleted" } + +extern B eb; +int main() +{ + B* b1 = new B; // { dg-error "use of deleted function" "" { xfail *-*-* } } + B* b2 = new B(eb); // { dg-error "use of deleted function" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit12.C b/gcc/testsuite/g++.dg/cpp0x/implicit12.C new file mode 100644 index 0000000000..da806e006a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/implicit12.C @@ -0,0 +1,54 @@ +// PR c++/50500 +// { dg-options "-std=c++0x" } + +// If a class declares move operations, the implicitly declared copy +// operations are deleted. +struct A +{ + A(); + A(A&&); + A& operator=(A&&); +}; + +// But they can still be explicitly defaulted. +struct B +{ + B(); + B(B&&); + B(const B&) = default; + B& operator=(B&&); + B& operator=(const B&) = default; +}; + +struct C +{ + C(); + C(C&&); +}; + +struct D +{ + D(); + D& operator=(D&&); +}; + +int main() +{ + A a; + A a2 (a); // { dg-error "deleted" } + a2 = a; // { dg-error "deleted" } + + B b; + B b2 (b); + b2 = b; + + C c; + C c2(c); // { dg-error "deleted" } + c2 = c; // { dg-error "deleted" } + + D d; + D d2(d); // { dg-error "deleted" } + d2 = d; // { dg-error "deleted" } +} + +// { dg-prune-output "because" } diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit13.C b/gcc/testsuite/g++.dg/cpp0x/implicit13.C new file mode 100644 index 0000000000..3165863c63 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/implicit13.C @@ -0,0 +1,32 @@ +// Make sure that A's destructor doesn't affect constexpr +// or exception-spec on D's default constructor. +// { dg-do compile { target c++11 } } + +struct A { + constexpr A() noexcept: i(0) { } + int i; + ~A() noexcept(false); +}; + +struct B: A { }; + +// Should get static initialization, so no constructor call. +// { dg-final { scan-assembler-not "_ZN1BC1Ev" } } +B b; + +struct C { C() noexcept; ~C() noexcept(false); }; +struct D: C { }; +extern D d; + +void *operator new(__SIZE_TYPE__, void*) noexcept; + +#define SA(X) static_assert((X),#X) +SA(noexcept(new (&d) D)); + +struct E: virtual C { }; +extern E e; +SA(noexcept (new (&e) E)); + +struct F { C c; }; +extern F f; +SA(noexcept (new (&f) F)); diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit14.C b/gcc/testsuite/g++.dg/cpp0x/implicit14.C new file mode 100644 index 0000000000..8a56244631 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/implicit14.C @@ -0,0 +1,26 @@ +// PR c++/54506 +// { dg-do compile { target c++11 } } + +template <class T> +struct A +{ + A() {} + + A(A const volatile &&) = delete; + A &operator =(A const volatile &&) = delete; + + template <class U> A(A<U> &&) {} + template <class U> A &operator =(A<U> &&) { return *this; } +}; + +struct B +{ + A<int> a; + B() = default; +}; + +int main() +{ + B b = B(); + b = B(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit4.C b/gcc/testsuite/g++.dg/cpp0x/implicit4.C index f97eb7549f..47fd56a525 100644 --- a/gcc/testsuite/g++.dg/cpp0x/implicit4.C +++ b/gcc/testsuite/g++.dg/cpp0x/implicit4.C @@ -2,14 +2,13 @@ // constructor to be deleted. // { dg-options "-std=c++0x" } -struct A +struct A // { dg-message "declares a move" } { - A(); // { dg-message "A::A|candidate expects" } - A(A&&); // { dg-message "A::A|no known conversion" } + A(); + A(A&&); }; -struct B: A // { dg-error "implicit|no match" } -// { dg-message "candidate" "candidate note" { target *-*-* } 11 } +struct B: A // { dg-error "use of deleted" } { }; diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit5.C b/gcc/testsuite/g++.dg/cpp0x/implicit5.C index f25c08530d..d25294831e 100644 --- a/gcc/testsuite/g++.dg/cpp0x/implicit5.C +++ b/gcc/testsuite/g++.dg/cpp0x/implicit5.C @@ -1,19 +1,19 @@ -// Test that the default B copy constructor calls the A member template -// constructor. +// Test that the default B copy constructor calls the deleted A +// copy constructor. // { dg-options -std=c++0x } -struct A +struct A // { dg-message "declares a move" } { A() = default; A(A&&) = default; template <class T> - A(const T& t) { t.i; } // { dg-error "no member" } + A(const T& t) { t.i; } }; -struct B: A { }; +struct B: A { }; // { dg-error "implicitly|use of deleted" } int main() { B b; - B b2(b); + B b2(b); // { dg-error "deleted" } } diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit8.C b/gcc/testsuite/g++.dg/cpp0x/implicit8.C index 2f3febae8b..c949af2105 100644 --- a/gcc/testsuite/g++.dg/cpp0x/implicit8.C +++ b/gcc/testsuite/g++.dg/cpp0x/implicit8.C @@ -1,9 +1,6 @@ // The hack for PR c++/44909 breaks this testcase. We need feedback // from the C++ committee to know how to proceed. // { dg-options -std=c++0x } -// { dg-prune-output "implicitly deleted" } -// { dg-prune-output "cannot bind" } -// { dg-prune-output "initializing argument" } struct A { @@ -28,7 +25,8 @@ struct B // subobject of C should use B(const BP&). But we ignore that constructor // in order to break the cycle in 44909. Perhaps the move ctor shouldn't // suppress the copy ctor? -struct C: A, B { }; +// As of DR 1082, it doesn't suppress it. +struct C: A, B { }; // { dg-error "use of deleted" } C c; -C c2(c); // { dg-bogus "deleted" "" { xfail *-*-* } } +C c2(c); // { dg-error "deleted" } diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-49216.C b/gcc/testsuite/g++.dg/cpp0x/initlist-49216.C deleted file mode 100644 index 4bf6082295..0000000000 --- a/gcc/testsuite/g++.dg/cpp0x/initlist-49216.C +++ /dev/null @@ -1,6 +0,0 @@ -// PR c++/49216 -// { dg-options -std=c++0x } - -int main() { - new int[1]{}; -} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-array3.C b/gcc/testsuite/g++.dg/cpp0x/initlist-array3.C new file mode 100644 index 0000000000..1a94f4ed55 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist-array3.C @@ -0,0 +1,10 @@ +// PR c++/52743 +// { dg-do compile { target c++11 } } + +void composite (int const (&) [2]); +void composite (int const (&) [3]); + +int main () +{ + composite({0,1}); // { dg-error "ambiguous" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-ctor1.C b/gcc/testsuite/g++.dg/cpp0x/initlist-ctor1.C new file mode 100644 index 0000000000..82031cbcc8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist-ctor1.C @@ -0,0 +1,13 @@ +// PR c++/52905 +// { dg-options -std=c++11 } + +#include <initializer_list> + +enum E { e1, e2 }; +struct A +{ + A(std::initializer_list<E>); // { dg-message "A::A" } + A(int, E); // { dg-message "A::A" } +}; + +A a{e1,2}; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-deduce.C b/gcc/testsuite/g++.dg/cpp0x/initlist-deduce.C index e422132afc..373044f765 100644 --- a/gcc/testsuite/g++.dg/cpp0x/initlist-deduce.C +++ b/gcc/testsuite/g++.dg/cpp0x/initlist-deduce.C @@ -2,7 +2,7 @@ // supported by the working draft, but is necessary for perfect forwarding // of initializer-lists to things that can take a std::initializer_list. -// { dg-options -std=c++0x } +// { dg-options "-std=c++0x -fdeduce-init-list" } // { dg-do run } #include <initializer_list> diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-defarg1.C b/gcc/testsuite/g++.dg/cpp0x/initlist-defarg1.C new file mode 100644 index 0000000000..45eb2d5e1f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist-defarg1.C @@ -0,0 +1,36 @@ +// PR c++/56614 +// { dg-require-effective-target c++11 } + +#include <initializer_list> + +namespace std +{ + template<typename T> + struct allocator + { }; + + template<typename T, typename Alloc = std::allocator<T> > + struct vector + { + vector(std::initializer_list<T>, const Alloc& = Alloc()) { } + }; +} + +void func() { } + +enum E { ee }; + +struct C +{ + template<typename T> + C(T, std::vector<E> = std::vector<E>({ ee })) + { } +}; + +struct G +{ + void gen() + { + C c(&func); + } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-lifetime1.C b/gcc/testsuite/g++.dg/cpp0x/initlist-lifetime1.C new file mode 100644 index 0000000000..e43ce5d62c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist-lifetime1.C @@ -0,0 +1,34 @@ +// Test that we properly extend the lifetime of the initializer_list +// array even if the initializer_list is a subobject. +// { dg-options -std=c++0x } +// { dg-do run } + +#include <initializer_list> + +extern "C" void abort(); +bool ok; + +bool do_throw; + +struct A { + A(int) { if (do_throw) throw 42; } + ~A() { if (!ok) abort(); } +}; + +typedef std::initializer_list<A> AL; +typedef std::initializer_list<AL> AL2; +typedef std::initializer_list<AL2> AL3; + +struct B { + AL al; + const AL& alr; +}; + +int main(int argc, const char** argv) +{ + do_throw = (argc > 1); // always false, but optimizer can't tell + AL ar[] = {{1,2},{3,4}}; + B b = {{5,6},{7,8}}; + AL3 al3 = {{{1},{2},{3}}}; + ok = true; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-lifetime2.C b/gcc/testsuite/g++.dg/cpp0x/initlist-lifetime2.C new file mode 100644 index 0000000000..16ae1ac6e0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist-lifetime2.C @@ -0,0 +1,64 @@ +// Test that we properly extend the lifetime of the initializer_list +// array even if the initializer_list is a subobject. +// { dg-options -std=c++0x } +// { dg-do run } + +#include <initializer_list> + +extern "C" void abort(); +bool ok; + +bool do_throw; + +struct A { + A(int) { if (do_throw) throw 42; } + ~A() { if (!ok) abort(); } +}; + +typedef std::initializer_list<A> AL; +typedef std::initializer_list<AL> AL2; +typedef std::initializer_list<AL2> AL3; + +struct B { + AL al; + const AL& alr; +}; + +struct A2 +{ + const A& a1; + const A& a2; +}; + +struct C { + AL ar[2]; + B b; + AL3 al3; + A2 a2; + A2 a2r[2]; + C(): + ar{{1,2},{3,4}}, + b{{5,6},{7,8}}, + al3{{{1},{2},{3}}}, + a2{1,2}, + a2r{{1,2},{3,4}} + { ok = true; } +}; + +struct D { + AL ar[2] = {{1,2},{3,4}}; + B b = {{5,6},{7,8}}; + AL3 al3 = {{{1},{2},{3}}}; + A2 a2 = {1,2}; + A2 a2r[2] = {{1,2},{3,4}}; + D() { ok = true; } +}; + +int main(int argc, const char** argv) +{ + do_throw = (argc > 1); // always false, but optimizer can't tell + ok = false; + C c; + ok = false; + D d; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-postfix-open-square.C b/gcc/testsuite/g++.dg/cpp0x/initlist-postfix-open-square.C new file mode 100644 index 0000000000..38b17820db --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist-postfix-open-square.C @@ -0,0 +1,18 @@ +// PR c++/51738 +// { dg-options -std=c++0x } + +struct Index +{ + Index(unsigned, unsigned){ } +}; + +struct Matrix +{ + void operator[](Index){ } +}; + +int main() +{ + Matrix m; + m[{0,1}]; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-protected.C b/gcc/testsuite/g++.dg/cpp0x/initlist-protected.C new file mode 100644 index 0000000000..fb5cc6aa89 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist-protected.C @@ -0,0 +1,23 @@ +// PR c++/54325 +// { dg-options -std=c++11 } + +class base +{ + protected: + base() + {} +}; + +class derived : public base +{ + public: + derived() + : base{} // <-- Note the c++11 curly brace syntax + {} +}; + +int main() +{ + derived d1; + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-pure.C b/gcc/testsuite/g++.dg/cpp0x/initlist-pure.C new file mode 100644 index 0000000000..63c341c12c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist-pure.C @@ -0,0 +1,25 @@ +// PR c++/54325 +// { dg-options -std=c++11 } + +class Base { +public: + Base() {}; + virtual ~Base() {}; + + virtual void do_stuff() = 0; +}; + +class Derived: public Base { +public: + Derived() : Base{} {}; + virtual ~Derived() {}; + + virtual void do_stuff() {}; +}; + +int +main() { + Derived d; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-value.C b/gcc/testsuite/g++.dg/cpp0x/initlist-value.C new file mode 100644 index 0000000000..215bb90d4d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist-value.C @@ -0,0 +1,35 @@ +// Test for value-initialization via {} +// { dg-options -std=c++0x } +// { dg-do run } + +void * operator new (__SIZE_TYPE__, void *p) { return p; } +void * operator new[] (__SIZE_TYPE__, void *p) { return p; } + +// Empty base so A isn't an aggregate +struct B {}; +struct A: B { + int i; +}; + +struct C: A { + C(): A{} {} +}; + +int f(A a) { return a.i; } + +int main() +{ + A a{}; + C c; + int space = 42; + A* ap = new (&space) A{}; + int space1[1] = { 42 }; + A* a1p = new (space1) A[1]{}; + if (a.i != 0 + || c.i != 0 + || ap->i != 0 + || a1p[0].i != 0 + || A{}.i != 0 + || f({}) != 0) + return 1; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-value2.C b/gcc/testsuite/g++.dg/cpp0x/initlist-value2.C new file mode 100644 index 0000000000..2b78241e95 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist-value2.C @@ -0,0 +1,20 @@ +// Test that we properly value-initialize a class with a user-provided +// constructor but defaulted default constructor. The FDIS got this +// wrong; see c++std-core-19883. + +// { dg-options -std=c++0x } +// { dg-do run } + +struct A +{ + int i; + A() = default; + A(int); +}; + +int main() +{ + A a{}; + if (a.i != 0) + return 1; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist13.C b/gcc/testsuite/g++.dg/cpp0x/initlist13.C index 9ed6c74419..bc5ee2c3ae 100644 --- a/gcc/testsuite/g++.dg/cpp0x/initlist13.C +++ b/gcc/testsuite/g++.dg/cpp0x/initlist13.C @@ -4,5 +4,5 @@ #include <complex> -__complex__ int i ({0}); -std::complex<int> i2 ({0}); +__complex__ int i {0}; +std::complex<int> i2 {0}; diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist17.C b/gcc/testsuite/g++.dg/cpp0x/initlist17.C index 86371e8196..6ea08d1500 100644 --- a/gcc/testsuite/g++.dg/cpp0x/initlist17.C +++ b/gcc/testsuite/g++.dg/cpp0x/initlist17.C @@ -1,4 +1,4 @@ -// { dg-options "-std=c++0x" } +// { dg-options "-std=c++0x -pedantic-errors" } void f(int i); diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist36.C b/gcc/testsuite/g++.dg/cpp0x/initlist36.C index 94624c977c..a703b45907 100644 --- a/gcc/testsuite/g++.dg/cpp0x/initlist36.C +++ b/gcc/testsuite/g++.dg/cpp0x/initlist36.C @@ -1,5 +1,5 @@ // PR c++/44358 -// { dg-options "-std=c++0x" } +// { dg-options "-std=c++0x -pedantic-errors" } #include <initializer_list> diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist49.C b/gcc/testsuite/g++.dg/cpp0x/initlist49.C new file mode 100644 index 0000000000..752c4331af --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist49.C @@ -0,0 +1,18 @@ +// Test for non-trivial list-initialization with array new. +// { dg-options -std=c++0x } +// { dg-do run } + +struct A +{ + enum E { c_string, number } e; + A(const char *): e(c_string) {} + A(int): e(number) {} +}; + +int main() +{ + A* ap = new A[2]{1, ""}; + if (ap[0].e != A::number || ap[1].e != A::c_string) + return 1; + delete[] ap; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist5.C b/gcc/testsuite/g++.dg/cpp0x/initlist5.C index 32caac3825..51345c73fc 100644 --- a/gcc/testsuite/g++.dg/cpp0x/initlist5.C +++ b/gcc/testsuite/g++.dg/cpp0x/initlist5.C @@ -1,5 +1,5 @@ // Test for narrowing diagnostics -// { dg-options "-std=c++0x" } +// { dg-options "-std=c++0x -pedantic-errors" } #include <initializer_list> @@ -25,3 +25,11 @@ double d = 1.1; float fa[] = { d, 1.1 }; // { dg-error "narrowing conversion of 'd'" } constexpr double d2 = 1.1; float fa2[] = { d2, 1.1 }; + +// PR c++/49577 +unsigned u{ -1 }; // { dg-error "narrowing" } +char c = char{ u }; // { dg-error "narrowing" } + +// PR c++/50011 +short unsigned su; +int i { su }; diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist50.C b/gcc/testsuite/g++.dg/cpp0x/initlist50.C index ef4e72c7cf..5cb23e2db3 100644 --- a/gcc/testsuite/g++.dg/cpp0x/initlist50.C +++ b/gcc/testsuite/g++.dg/cpp0x/initlist50.C @@ -8,7 +8,7 @@ struct A2 { template <class T> struct B { T ar[1]; - B(T t):ar({t}) {} + B(T t):ar{t} {} }; int main(){ diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist52.C b/gcc/testsuite/g++.dg/cpp0x/initlist52.C new file mode 100644 index 0000000000..17c0cfe3f1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist52.C @@ -0,0 +1,7 @@ +// PR c++/45378 +// { dg-options "-std=c++0x -pedantic-errors" } + +int main() +{ + int x { 22.2 }; // { dg-error "narrowing" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist53.C b/gcc/testsuite/g++.dg/cpp0x/initlist53.C new file mode 100644 index 0000000000..22633f9095 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist53.C @@ -0,0 +1,22 @@ +// PR c++/49216 +// { dg-options -std=c++0x } +// { dg-do run } + +#include <initializer_list> +extern "C" void abort(); +void * operator new[] (__SIZE_TYPE__, void *p) { return p; } + +bool constructed; + +struct A +{ + A(std::initializer_list<int>) { constructed = true; } +}; + +int main() { + new A[1]{}; + int space[1] = { 42 }; + int *p = new (space) int[1]{}; + if (p[0] != 0 || !constructed) + abort(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist54.C b/gcc/testsuite/g++.dg/cpp0x/initlist54.C new file mode 100644 index 0000000000..cdb296133f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist54.C @@ -0,0 +1,13 @@ +// PR c++/49355 +// { dg-options -std=c++0x } + +#include <string> + +struct T { + std::string foobar; +}; + +int main() +{ + T* x = new T({""}); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist55.C b/gcc/testsuite/g++.dg/cpp0x/initlist55.C new file mode 100644 index 0000000000..cb42e81ed6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist55.C @@ -0,0 +1,5 @@ +// Test for -Wno-narrowing +// { dg-options "-std=c++0x -pedantic-errors -Wno-narrowing" } + +int i; +float d = { i }; diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist56.C b/gcc/testsuite/g++.dg/cpp0x/initlist56.C new file mode 100644 index 0000000000..862b41bb3c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist56.C @@ -0,0 +1,37 @@ +// PR c++/47453 +// { dg-options "-std=c++0x -pedantic-errors" } + +// invalid +int a({0}); // { dg-error "" } + +// invalid +int const &b({0}); // { dg-error "" } + +// invalid +struct A1 { int a[2]; A1(); }; +A1::A1():a({1, 2}) { } // { dg-error "" } + +struct A { explicit A(int, int); A(int, long); }; + +// invalid +A c({1, 2}); // { dg-error "" } + +// valid (by copy constructor). +A d({1, 2L}); + +// valid +A e{1, 2}; + +#include <initializer_list> + +struct B { + template<typename ...T> + B(std::initializer_list<int>, T ...); +}; + +// invalid (the first phase only considers init-list ctors) +// (for the second phase, no constructor is viable) +B f{1, 2, 3}; // { dg-error "" } + +// valid (T deduced to <>). +B g({1, 2, 3}); diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist58.C b/gcc/testsuite/g++.dg/cpp0x/initlist58.C new file mode 100644 index 0000000000..dfb9f0cd50 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist58.C @@ -0,0 +1,17 @@ +// PR c++/50209 +// { dg-options -std=c++0x } + +struct S { int i,j; }; + +struct A +{ + static void f (S = {1,2}); +}; + +void f (S = {3,4}); + +int main() +{ + A::f(); + f(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist59.C b/gcc/testsuite/g++.dg/cpp0x/initlist59.C new file mode 100644 index 0000000000..2cc015d1fe --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist59.C @@ -0,0 +1,18 @@ +// PR c++/49996 +// { dg-options -std=c++0x } + +struct A +{ + ~A() + { } +}; + +struct B +{ + const A& ref; +}; + +int main() +{ + B* p = new B{A()}; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist61.C b/gcc/testsuite/g++.dg/cpp0x/initlist61.C new file mode 100644 index 0000000000..28eccc2637 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist61.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +struct N { N(int); }; +struct A { N i,j; }; + +int main() +{ + A* ap = new A{1,2}; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist62.C b/gcc/testsuite/g++.dg/cpp0x/initlist62.C new file mode 100644 index 0000000000..cabbcd1db4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist62.C @@ -0,0 +1,10 @@ +// PR c++/51399 +// { dg-options "-std=c++0x" } + +#include <initializer_list> + +struct A +{ + std::initializer_list<int> x[1] = { 0 }; // { dg-error "could not convert" } + A() {} +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist63.C b/gcc/testsuite/g++.dg/cpp0x/initlist63.C new file mode 100644 index 0000000000..a72c0ab992 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist63.C @@ -0,0 +1,16 @@ +// Origin PR c++/51475 +// { dg-options -std=c++11 } + +#include <initializer_list> + +struct A +{ + A(int*); +}; + +struct B +{ + const std::initializer_list<A>& x; +}; + +B b = {{1}}; // { dg-error "invalid conversion|cannot convert" } diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist64.C b/gcc/testsuite/g++.dg/cpp0x/initlist64.C new file mode 100644 index 0000000000..bcf1658074 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist64.C @@ -0,0 +1,29 @@ +// PR c++/51553 +// { dg-options -std=c++0x } + +struct X +{ + X(); +}; + +struct Y +{ + operator X() const; +}; + +struct Z +{ + explicit operator X() const; +}; + +X a = { Y() }; +X aa = Y(); + +X b{ Y() }; +X bb(Y()); + +X c = { Z() }; // { dg-error "" } +X cc = Z(); // { dg-error "" } + +X d{ Z() }; +X dd( Z() ); diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist7.C b/gcc/testsuite/g++.dg/cpp0x/initlist7.C index 7913ed7edb..55a0371860 100644 --- a/gcc/testsuite/g++.dg/cpp0x/initlist7.C +++ b/gcc/testsuite/g++.dg/cpp0x/initlist7.C @@ -1,5 +1,5 @@ // PR c++/37932 -// { dg-options "-std=c++0x" } +// { dg-options "-std=c++0x -pedantic-errors" } typedef enum { AA=1, BB=2 } my_enum; diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-__func__.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-__func__.C new file mode 100644 index 0000000000..1cc7bb6583 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-__func__.C @@ -0,0 +1,9 @@ +// PR c++/44160 +// { dg-options -std=c++0x } +// { dg-do link } + +int main() +{ + const char *p = []() { return __func__; }(); + return p == 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto1.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto1.C new file mode 100644 index 0000000000..b5ba066375 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto1.C @@ -0,0 +1,14 @@ +// PR c++/50437 +// { dg-options -std=c++0x } + +template <typename T> +void f() +{ + auto g = [](T t){ return t == 0; }; + g(T()); +} + +int main() +{ + f<int>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-neg.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-neg.C new file mode 100644 index 0000000000..82cc98423e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-neg.C @@ -0,0 +1,15 @@ +// PR c++/50736 +// { dg-options "-std=c++0x -pedantic-errors" } + +int i; +void f(); +typedef int T; + +int main() +{ + [i]{}; // { dg-error "non-automatic" } + [f]{}; // { dg-error "non-variable" } + [T]{}; // { dg-error "non-variable" } +} + +struct A { }; diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-redundancy.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-redundancy.C new file mode 100644 index 0000000000..51e55a7aa4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-redundancy.C @@ -0,0 +1,12 @@ +// FDIS 5.1.2/8 +// { dg-options "-pedantic-errors -std=c++0x" } + +struct S2 { void f(int i); }; +void S2::f(int i) { + [&, i]{ }; // OK + [&, &i]{ }; // { dg-error "" } i preceded by & when & is the default + [=, i]{ }; // { dg-error "" } i not preceded by & when = is the default + [=, this]{ }; // { dg-error "" } this when = is the default + [i, i]{ }; // { dg-error "" } i repeated + [this, this]{ }; // { dg-error "" } i repeated +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const2.C new file mode 100644 index 0000000000..d2457d6491 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const2.C @@ -0,0 +1,15 @@ +// PR c++/52026 +// { dg-options "-std=c++11 -O" } +// { dg-do run } + +template<bool B> +int func() { + const int constVal1 = B ? 100 : -100; + const int constVal = constVal1; + return [] { return constVal; }(); +} + +int main() { + if (func<true>() != 100) + __builtin_abort (); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv6.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv6.C new file mode 100644 index 0000000000..bd90437236 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv6.C @@ -0,0 +1,7 @@ +// PR c++/55015 +// { dg-do link } +// { dg-options -std=c++11 } + +typedef void (*VoidFunc)(); +inline VoidFunc GetFunc() { return [](){}; } +int main() { VoidFunc func = GetFunc(); } diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv7.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv7.C new file mode 100644 index 0000000000..89e4e4babf --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv7.C @@ -0,0 +1,20 @@ +// PR c++/55710 +// { dg-do link { target c++11 } } + +template <class T> +struct X { + static void (*code) (); +}; + +template <class T> +void (*X<T>::code) () = []{}; // Line 7 + +struct Y { + void (*code) () = []{} ; // Line 10 + void operator()() { code(); } +}; + +int main () { + X<int>::code(); + Y()(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg.C index bfe7acab69..f93e78a27c 100644 --- a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg.C +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg.C @@ -1,24 +1,22 @@ -// Testcase for an extension to allow return type deduction when the lambda -// contains more than just a single return-statement. +// Testcase for DR 975. // { dg-options -std=c++0x } bool b; -template <class T> -T f (T t) -{ - return [=] - { - auto i = t+1; - if (b) - return i+1; - else - return i+2; // { dg-error "lambda return type" } - }(); +struct A { int fn1(); const int& fn2(); }; +struct B { int fn1(); long fn2(); }; + +template <class T> int f (T t) { + return [](T t){ + if (b) + return t.fn1(); + else + return t.fn2(); // { dg-error "inconsistent types" } + }(t); } int main() { - if (f(1) != 3) - return 1; + f(A()); // { dg-bogus "" } int and const int& are compatible + f(B()); // { dg-message "from here" } int and long are not } diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg2.C index a236e6d116..5c63409b68 100644 --- a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg2.C +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg2.C @@ -1,6 +1,5 @@ -// Test that in pedantic mode, we warn about the extension to allow return -// type deduction when the lambda contains more than just a single -// return-statement. +// Test that this is accepted even when pedantic now that it's part +// of the standard. // { dg-options "-std=c++0x -pedantic" } @@ -11,7 +10,7 @@ T f (T t) [=] { return t+1; }; // OK return [=] { auto i = t+1; - return i+1; // { dg-warning "only statement" } + return i+1; }(); } diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-neg.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-neg.C index 4abdf59a69..c932c09db3 100644 --- a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-neg.C +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-neg.C @@ -1,5 +1,4 @@ // { dg-options "-std=c++0x" } -#include <cassert> int main() { int i = 0; diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce2.C index 718d49cd9b..eeb9814a05 100644 --- a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce2.C +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce2.C @@ -1,7 +1,11 @@ // PR c++/43875 // { dg-options "-std=c++0x" } +void f(); +void f(int); + int main() { - auto x2 = []{ return { 1, 2 }; }; // { dg-message "return" } + auto x1 = []{ return f; }; // { dg-error "return|overloaded" } + auto x2 = []{ return { 1, 2 }; }; // { dg-error "return|list" } } diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err1.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err1.C new file mode 100644 index 0000000000..ebf0cbd078 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err1.C @@ -0,0 +1,8 @@ +// PR c++/51415 +// { dg-do compile { target c++11 } } + +void foo() +{ + int x[1]; + [x]{} = 0; // { dg-error "lambda closure" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc2.C index dab53f1276..f94d64ec0e 100644 --- a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc2.C +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc2.C @@ -15,5 +15,5 @@ void f() int main() { - f<A>(); // { dg-message "instantiated" } + f<A>(); // { dg-message "required" } } diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-for.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-for.C new file mode 100644 index 0000000000..f161da8577 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-for.C @@ -0,0 +1,12 @@ +// PR c++/50114 +// { dg-options "-std=c++0x -w" } + +int open() +{ + int *x2feed_i = 0; + auto insert_feed = [&](unsigned char venue, int* newfeed) + { + for(int x2feed_i = 1; 0; ) ; + x2feed_i = newfeed; + }; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice2.C index 352137aad2..6468f18a0a 100644 --- a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice2.C +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice2.C @@ -9,8 +9,9 @@ decltype(F()) run(F f) // { dg-message "note" } int main() { - auto l = []() { return 5; }; + auto l = []() { return 5; }; // { dg-message "lambda closure type" } run(l); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 14 } + // { dg-error "use of deleted function" "candidate explanation" { target *-*-* } 5 } } diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice5.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice5.C new file mode 100644 index 0000000000..305db812d8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice5.C @@ -0,0 +1,12 @@ +// PR c++/51227 +// { dg-options "-std=c++0x" } + +template<int> int foo() +{ + [] (void i) { return 0; } (0); // { dg-error "incomplete|invalid|no match" } +} + +void bar() +{ + foo<0>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice6.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice6.C new file mode 100644 index 0000000000..ddf352766e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice6.C @@ -0,0 +1,4 @@ +// PR c++/51464 +// { dg-options "-std=c++0x" } + +template<int = sizeof([])> struct A {}; // { dg-error "lambda" } diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice7.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice7.C new file mode 100644 index 0000000000..946377e550 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice7.C @@ -0,0 +1,9 @@ +// PR c++/52487 +// { dg-options "-std=c++0x" } + +struct A; // { dg-error "forward declaration" } + +void foo(A& a) +{ + [=](){a;}; // { dg-error "invalid use of incomplete type" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist1.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist1.C new file mode 100644 index 0000000000..078ebaee18 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist1.C @@ -0,0 +1,12 @@ +// PR c++/50863 +// { dg-options -std=gnu++0x } + +struct T { + template<typename F> + T(F) { } +}; + +int main() +{ + T t{ []{ } }; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist2.C new file mode 100644 index 0000000000..daaa33938a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist2.C @@ -0,0 +1,27 @@ +// PR c++/54947 +// { dg-options -std=gnu++11 } + +struct X +{ + template<typename L> + X(L) + { } +}; + +template<typename A> + void + test() + { + int i = 0; + + A a_ok_1( [=] { return i; } ); // OK + A a_ok_2( [i] { return i; } ); // OK + + A a_err_1{ [i] { return i; } }; // error + A a_err_2{ [=] { return i; } }; // error + } + +int main() +{ + test<X>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle3.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle3.C new file mode 100644 index 0000000000..06913a1c1a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle3.C @@ -0,0 +1,15 @@ +// PR c++/51818 +// { dg-options -std=c++0x } +// { dg-final { scan-assembler "_ZN1AC1IN3foo3barMUlvE_EEET_" } } + +struct A +{ + template <class T> A(T) { } +}; + +struct foo +{ + A bar = []{}; +}; + +foo f; diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested4.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested4.C new file mode 100644 index 0000000000..a5bd1a2f4e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested4.C @@ -0,0 +1,9 @@ +// PR c++/47687 +// { dg-options -std=c++0x } + +template <class T> struct A { }; + +auto inl = []{ return []{}; }(); +typedef decltype(inl) inlt; + +A<inlt> a; diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-switch.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-switch.C new file mode 100644 index 0000000000..c3067713ca --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-switch.C @@ -0,0 +1,26 @@ +// PR c++/49867 +// { dg-options -std=c++0x } + +int +main () +{ + void (*l)(); + while (true) + { + switch (3) + { + struct A { + void f() + { + case 4: // { dg-error "case" } + break; // { dg-error "break" } + } + }; + l = []() + { + case 3: // { dg-error "case" } + break; // { dg-error "break" } + }; + } + } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-syntax1.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-syntax1.C new file mode 100644 index 0000000000..b3b749c2a5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-syntax1.C @@ -0,0 +1,5 @@ +// PR c++/46124 +// { dg-options -std=c++0x } + +void foo() { [] () -> void (); } // { dg-error "returning a function" "returning" } +// { dg-error "expected .\{" "expected" { target *-*-* } 4 } diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template3.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template3.C new file mode 100644 index 0000000000..fd6f1d3192 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template3.C @@ -0,0 +1,33 @@ +// PR c++/49554 +// { dg-options -std=c++0x } + +template<typename T> + struct base + { + struct iterator { }; + + iterator begin(); + }; + +template<typename T> +class flist : public base<T> +{ + typedef base<T> Base; + + typedef typename Base::iterator Base_iterator; +public: + + void + resize() + { + Base_iterator b = Base::begin(); + + [b](int i) { return i; }; + } +}; + +void test01() +{ + flist<int> fl; + fl.resize(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template4.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template4.C new file mode 100644 index 0000000000..a65727a1d4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template4.C @@ -0,0 +1,42 @@ +// PR c++/51459 +// { dg-do run { target c++11 } } + +struct func { + virtual ~func() { } + virtual void operator()() const = 0; + virtual func* clone() const = 0; +}; + +template<typename T> +struct funcimpl : func { + explicit funcimpl(T t) : t(t) { } + void operator()() const { t(); } + func* clone() const { return new funcimpl(*this); } + T t; +}; + +struct function +{ + func* p; + + template<typename T> + function(T t) : p(new funcimpl<T>(t)) { } + + ~function() { delete p; } + + function(const function& f) : p(f.p->clone()) { } + + function& operator=(const function& ) = delete; + + void operator()() const { (*p)(); } +}; + +template <typename F> +function animate(F f) { return [=]{ f(); }; } + +int main() +{ + function linear1 = []{}; + function av(animate(linear1)); + av(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template5.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template5.C new file mode 100644 index 0000000000..b91b89ff36 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template5.C @@ -0,0 +1,17 @@ +// PR c++/53137 +// { dg-do compile { target c++11 } } + +struct A +{ + template <typename T> void f(); + + template <typename T> void g() + { + [this]{ f<T>(); }(); + } + + void h() + { + g<int>(); + } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template6.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template6.C new file mode 100644 index 0000000000..5e8561946a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template6.C @@ -0,0 +1,14 @@ +// PR c++/53821 +// { dg-final { scan-assembler-not "_ZZ1fIvEvvENKUlvE_cvPFvvEEv" } } +// { dg-do compile { target c++11 } } + +template <class T> void f() +{ + auto g = []{}; + g(); +} + +int main() +{ + f<void>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template9.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template9.C new file mode 100644 index 0000000000..c1d010ba12 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template9.C @@ -0,0 +1,15 @@ +// PR c++/54276 +// { dg-do link { target c++11 } } + +template <typename T> +void foo(T) +{ + static int x = 1; + auto f = [] { return x + 1; }; + f(); +} + +int main() +{ + foo(4); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this6.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this6.C new file mode 100644 index 0000000000..acf4eaa7fc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this6.C @@ -0,0 +1,32 @@ +// PR c++/53137 +// { dg-options -std=c++11 } + +template <typename STORE> +void getParent(STORE& tStore) +{ +} + +struct Store +{ + template <typename CheckParentFunc> + void updateChildCommon(CheckParentFunc c) + { + c(); + } + + template <typename T> + int& getStore(); + + template <typename T> + void updateChild(const T& obj) + { + updateChildCommon([this] () { getParent(getStore<T>()); }); + } + + void update(int obj); +}; + +void Store::update(int obj) +{ + updateChild(obj); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this7.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this7.C new file mode 100644 index 0000000000..6e25c331b4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this7.C @@ -0,0 +1,11 @@ +// PR c++/54122 +// { dg-options -std=c++11 } + +enum E { F }; + +template <typename A> +struct C +{ + E e; + void f () { auto l = [&](void)->void { if (e == F) return; }; } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this8.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this8.C new file mode 100644 index 0000000000..d7c5d2c051 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this8.C @@ -0,0 +1,37 @@ +// PR c++/56135 +// { dg-do run { target c++11 } } + +#include <functional> + +struct test { + template<typename T> + std::function<void()> broken(int x) { + return [=] { +x; print<T>(); }; + } + + std::function<void()> works0() { + return [=] { print<int>(); }; + } + + template<typename T> + std::function<void()> works1() { + return [=] { print<int>(); }; + } + + template<typename T> + std::function<void()> works2() { + return [=] { this->print<T>(); }; + } + + template<typename T> + void print() { if (this == 0) __builtin_abort (); } +}; + +int main(void) { + test().broken<int>(1)(); + test().works0()(); + test().works1<int>()(); + test().works2<int>()(); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this9.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this9.C new file mode 100644 index 0000000000..07ddd0863d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this9.C @@ -0,0 +1,19 @@ +// PR c++/54277 +// { dg-do compile { target c++11 } } + +struct Used +{ + void foo() { } +}; + +template <typename> +struct S +{ + Used x; + + void bar() + { + auto f = [this] { x.foo(); }; + f(); + } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/named.C b/gcc/testsuite/g++.dg/cpp0x/named.C index ef1a2fb6f7..2dff24ca47 100644 --- a/gcc/testsuite/g++.dg/cpp0x/named.C +++ b/gcc/testsuite/g++.dg/cpp0x/named.C @@ -13,6 +13,7 @@ struct T S && get() { return movel(s); } operator S&&() { return movel(s); } S && s; + S s2; }; void named(S const &) {} @@ -33,6 +34,7 @@ void f(S && p) unnamed(t.get()); // function return unnamed(t); // implicit conversion unnamed(static_cast<S&&>(s)); // cast to rvalue + unnamed(static_cast<T&&>(t).s2); // cast to rvalue } int main() diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept11.C b/gcc/testsuite/g++.dg/cpp0x/noexcept11.C index eba2c40808..b7c64a6ef0 100644 --- a/gcc/testsuite/g++.dg/cpp0x/noexcept11.C +++ b/gcc/testsuite/g++.dg/cpp0x/noexcept11.C @@ -1,4 +1,53 @@ -// PR c++/50309 +// PR c++/49107 // { dg-options -std=c++0x } -void foo () noexcept () { } // { dg-error "expected" } +template<typename _Tp> +_Tp declval() noexcept; + +template<typename _Tp , typename = decltype(_Tp(declval<_Tp&&>()))> +struct trait +{ + static const bool value=true; +}; + +template<class _T2> +struct pair +{ + _T2 second; + void swap(pair& __p) + noexcept(trait<_T2>::value); +}; + +template < class R_ > +struct Main +{ + Main() {} + Main(const typename R_::Sub1T& r) ; + Main(const typename R_::Sub2T& l) ; +}; + +template < class R_ > +class Sub1 +{ + typedef pair<typename R_::MainT> Rep; + Rep base; +}; + +template < class R_ > +struct Sub2 +{ + typedef pair<typename R_::MainT> Rep; + Rep base; +}; + +struct Kernel +{ + typedef Main<Kernel> MainT; + typedef Sub1<Kernel> Sub1T; + typedef Sub2<Kernel> Sub2T; +}; + +Main<Kernel> f() +{ + return Main<Kernel> (); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept12.C b/gcc/testsuite/g++.dg/cpp0x/noexcept12.C new file mode 100644 index 0000000000..1fd1b032f4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/noexcept12.C @@ -0,0 +1,11 @@ +// Test that we handle merging with deferred noexcept. +// { dg-options -std=c++0x } + +template <class U> +struct O +{ + template <class T> + void f() noexcept(noexcept(T())); +}; + +template<> template<> void O<int>::f<int>() noexcept { } diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept13.C b/gcc/testsuite/g++.dg/cpp0x/noexcept13.C new file mode 100644 index 0000000000..7d51c82b54 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/noexcept13.C @@ -0,0 +1,78 @@ +// PR c++/49107 +// { dg-options -std=c++0x } + +namespace std +{ + template<typename _Tp> _Tp&& declval() noexcept; + + struct true_type { static const bool value = true; }; + struct false_type { static const bool value = false; }; + + template<typename _Tp, typename _Arg> + struct __is_direct_constructible_impl + { + template<typename _Tp2, typename _Arg2, typename + = decltype(::new _Tp2(declval<_Arg2>()))> + static true_type __test(int); + + template<typename, typename> + static false_type __test(...); + + typedef decltype(__test<_Tp, _Arg>(0)) type; + }; + + template<typename _Tp, typename _Arg> + struct __is_direct_constructible_new_safe + : public __is_direct_constructible_impl<_Tp, _Arg>::type + { }; + + template<class _T1, class _T2> + struct pair + { + pair() = default; + constexpr pair(const pair&) = default; + + pair(pair&& __p) + noexcept(__is_direct_constructible_new_safe<_T2,_T2&&>::value); + }; +} + +template <class R_> +struct Vector3 +{ + typedef typename R_::Ray_3 Ray_3; + Vector3() {} + explicit Vector3(const Ray_3& r); +}; + +template < class R_ > class LineC3 +{ + typedef typename R_::Vector_3 Vector_3; + std::pair<int, Vector_3> x; +}; + +template < class R_ > class RayH3 +{ + typedef typename R_::Vector_3 Vector_3; + std::pair<int, Vector_3> x; +}; + +template <typename Kernel > +struct Homogeneous_base +{ + typedef LineC3<Kernel> Line_3; + typedef RayH3<Kernel> Ray_3; +}; + +template < typename RT_> +struct Simple_homogeneous +: public Homogeneous_base< Simple_homogeneous<RT_> > +{ + typedef Vector3<Simple_homogeneous<RT_> > Vector_3; +}; + +int main() +{ + typedef Simple_homogeneous<double> R; + R::Line_3 l3; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept14.C b/gcc/testsuite/g++.dg/cpp0x/noexcept14.C new file mode 100644 index 0000000000..eba2c40808 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/noexcept14.C @@ -0,0 +1,4 @@ +// PR c++/50309 +// { dg-options -std=c++0x } + +void foo () noexcept () { } // { dg-error "expected" } diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept15.C b/gcc/testsuite/g++.dg/cpp0x/noexcept15.C new file mode 100644 index 0000000000..5e8c40c277 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/noexcept15.C @@ -0,0 +1,34 @@ +// PR c++/50391 +// { dg-options -std=c++0x } + +#include <type_traits> + +template<class Tp> + struct single + { + Tp elem; // { dg-error "incomplete type" } + + constexpr single(const Tp& e) + : elem(e) { } // { dg-error "invalid field" } + + single(single&& s) // { dg-error "not a member" } + noexcept(std::is_nothrow_move_constructible<Tp>::value) + : elem(s.elem) { } // { dg-error "invalid field|no member" } + }; + +template<class Tp> + constexpr single<typename std::decay<Tp>::type> + make_single(Tp&& x) + { + return single<typename std::decay<Tp>::type>(x); + } + +class Blob; // { dg-error "forward declaration" } + +void +foo(Blob *b) +{ + make_single(*b); +} + +// { dg-prune-output "include" } diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept16.C b/gcc/testsuite/g++.dg/cpp0x/noexcept16.C new file mode 100644 index 0000000000..10e0be9588 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/noexcept16.C @@ -0,0 +1,130 @@ +// PR c++/50972 +// { dg-do compile { target c++11 } } +// Ignore all errors, we're just testing that this doesn't ICE +// { dg-prune-output "error" } + +namespace std +typedef long unsigned int size_t; +template<typename...> +struct __and_; +template<typename _Tp> +struct is_nothrow_move_constructible +{ +}; +template<typename _Tp> +struct is_nothrow_move_assignable +struct __add_rvalue_reference_helper<_Tp, true> +{ typedef _Tp&& type; }; +template<typename _Tp> +struct add_rvalue_reference + : public __add_rvalue_reference_helper<_Tp> +{ +}; +template<typename _Tp> +inline typename add_rvalue_reference<_Tp>::type +declval() noexcept +{ +} +} +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) +template<typename _Tp> +class new_allocator +{ +}; +} +namespace std __attribute__ ((__visibility__ ("default"))) +class allocator: public __gnu_cxx::new_allocator<_Tp> +{ + template<typename _Tp1> + struct rebind + { typedef allocator<_Tp1> other; }; +}; +} +namespace std __attribute__ ((__visibility__ ("default"))) +template<typename _Alloc, typename _Tp> +struct __alloctr_rebind<_Alloc, _Tp, true> +{ + typedef typename _Alloc::template rebind<_Tp>::other __type; +}; +template<typename _Alloc> +struct allocator_traits +{ + template<typename _Tp> + struct __rebind_alloc + { + typedef typename __alloctr_rebind<_Alloc, _Tp>::__type __type; + }; +} + } +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) +template<typename _Alloc> +struct __alloc_traits +{ + typedef std::allocator_traits<_Alloc> _Base_type; + static constexpr bool _S_nothrow_swap() + { + return !_S_propagate_on_swap() + || noexcept(swap(std::declval<_Alloc&>(), std::declval<_Alloc&>())); + } + template<typename _Tp> + struct rebind + { typedef typename _Base_type::template __rebind_alloc<_Tp>::__type other; }; +}; +} +namespace std __attribute__ ((__visibility__ ("default"))) +template<typename _Tp, typename _Alloc> +struct _Vector_base +{ + typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template + rebind<_Tp>::other _Tp_alloc_type; +}; +template<typename _Tp, typename _Alloc = std::allocator<_Tp> > +class vector : protected _Vector_base<_Tp, _Alloc> +{ + typedef _Vector_base<_Tp, _Alloc> _Base; + typedef typename _Base::_Tp_alloc_type _Tp_alloc_type; + typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Alloc_traits; + swap(vector& __x) + noexcept(_Alloc_traits::_S_nothrow_swap()); +}; +} +namespace lexertl +namespace detail +} +namespace detail +template<typename id_type> +struct basic_internals +{ + typedef std::vector<id_type> id_type_vector; +}; +}; +template<typename char_type, typename id_type = std::size_t> +class basic_state_machine +{ + typedef detail::basic_internals<id_type> internals; + void minimise () + { + minimise_dfa (dfa_alphabet_, *dfa_, size_); + } + typedef typename internals::id_type_vector id_type_vector; + void minimise_dfa (const id_type dfa_alphabet_, + id_type_vector &dfa_, std::size_t size_) + { + id_type_vector new_dfa_ (front_, front_ + dfa_alphabet_); + dfa_.swap (new_dfa_); + } +} + } +namespace std __attribute__ ((__visibility__ ("default"))) +template<typename _Tp> +void +swap(_Tp&, _Tp&) + noexcept(__and_<is_nothrow_move_constructible<_Tp>, + is_nothrow_move_assignable<_Tp>>::value) + ; +typedef lexertl::basic_state_machine<char32_t> lexstate; +lexstate m_state_machine; +GenerateLexer() +{ + m_state_machine.minimise(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept18.C b/gcc/testsuite/g++.dg/cpp0x/noexcept18.C new file mode 100644 index 0000000000..953fb0ec8b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/noexcept18.C @@ -0,0 +1,11 @@ +// PR c++/54207 +// { dg-do compile } +// { dg-options "-std=c++11" } + +typedef bool B; +constexpr B foo () { return true; } + +void +bar () noexcept (foo ()) +{ +} diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept19.C b/gcc/testsuite/g++.dg/cpp0x/noexcept19.C new file mode 100644 index 0000000000..12ff86e0d2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/noexcept19.C @@ -0,0 +1,29 @@ +// PR c++/55652 +// { dg-do compile } +// { dg-options "-std=c++11" } + +template <typename T> +struct A +{ + static const bool a = false; +}; + +template <typename X, typename Y = A <X>> +struct B +{ + B () noexcept (A <Y>::a) {} +}; + +template <typename X, typename Y> +struct C +{ + X x; + Y y; +}; + +struct D +{ + D () throw (int); +}; + +C <D, B <D>> c; diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept20.C b/gcc/testsuite/g++.dg/cpp0x/noexcept20.C new file mode 100644 index 0000000000..b86760292b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/noexcept20.C @@ -0,0 +1,22 @@ +// PR c++/56071 +// { dg-options -std=c++11 } + +class B +{ + template <typename T> friend struct A; + B() {} +}; + +template <typename T> +struct A +{ + A() noexcept(noexcept(B())) { } +}; + +struct C +{ + C() + { + static_assert( !noexcept(A<int>()), "" ); + } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/not_special.C b/gcc/testsuite/g++.dg/cpp0x/not_special.C index 6d73bd086c..2b510bb9a1 100644 --- a/gcc/testsuite/g++.dg/cpp0x/not_special.C +++ b/gcc/testsuite/g++.dg/cpp0x/not_special.C @@ -1,8 +1,8 @@ // I, Howard Hinnant, hereby place this code in the public domain. // Test that move constructor and move assignement are special. -// That is, their presence should inhibit compiler generated -// copy ctor or assignment. +// That is, their presence should cause compiler declared +// copy ctor or assignment to be deleted. // { dg-options "-std=c++0x" } @@ -24,12 +24,12 @@ struct base base& operator=(const base&) {++assign; return *this;} }; -struct derived +struct derived // { dg-message "declares a move" } : base { derived() {} - derived(derived&&) {} // { dg-error "argument 1" } - derived& operator=(derived&&) {return *this;} // { dg-error "argument 1" } + derived(derived&&) {} + derived& operator=(derived&&) {return *this;} }; int test1() @@ -37,11 +37,11 @@ int test1() derived d; derived d2(static_cast<derived&&>(d)); // should not call base::(const base&) assert(copy == 0); - derived d3(d); // { dg-error "lvalue" } + derived d3(d); // { dg-error "deleted" } assert(copy == 1); d2 = static_cast<derived&&>(d); // should not call base::operator= assert(assign == 0); - d3 = d; // { dg-error "lvalue" } + d3 = d; // { dg-error "deleted" } assert(assign == 1); return 0; } diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-const1.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-const1.C new file mode 100644 index 0000000000..ddf9f04c58 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-const1.C @@ -0,0 +1,10 @@ +// PR c++/50707 +// { dg-options -std=c++0x } + +int g; + +struct S { + int const v=g; +}; + +S s; diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer1.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer1.C new file mode 100644 index 0000000000..b3d9b93575 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer1.C @@ -0,0 +1,14 @@ +// { dg-options -std=c++0x } + +#define SA(X) static_assert(X,#X) + +struct A +{ + int i = f(); + int j { f() }; + static constexpr int f() { return 42; } +}; + +constexpr A a; +SA(a.i == 42); +SA(a.j == 42); diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer2.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer2.C new file mode 100644 index 0000000000..1951262f9d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer2.C @@ -0,0 +1,9 @@ +// { dg-options -std=c++0x } + +struct A +{ + int i = f(); + static int f(int i = 42) { return i; } +}; + +A a; diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer3.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer3.C new file mode 100644 index 0000000000..2777fb5d8e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer3.C @@ -0,0 +1,19 @@ +// Do NSDMI get deferred instantiation? +// { dg-options -std=c++0x } + +template <class T> +struct A +{ + T t = T(42); + constexpr A() { } + A(T t): t(t) { } +}; + +struct B { }; + +#define SA(X) static_assert(X,#X) + +constexpr A<int> a1; +SA(a1.t == 42); + +A<B> a2 {B()}; diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer4.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer4.C new file mode 100644 index 0000000000..65b2e73807 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer4.C @@ -0,0 +1,18 @@ +// { dg-options -std=c++0x } +// { dg-do run } + +struct A +{ + int i = 42; + int j = f(); + int k = this->f(); + int f() { return i++; } +}; + +A a; + +int main() +{ + if (a.j != 42 || a.k != 43 || a.i != 44) + __builtin_abort(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer5.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer5.C new file mode 100644 index 0000000000..85abfbf861 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer5.C @@ -0,0 +1,20 @@ +// PR c++/51666 (DR 325) +// { dg-options -std=c++0x } + +template<typename T, typename U> +struct tuple +{ + tuple(T, U) { } +}; + +struct Y +{ + tuple<int, int> tt = tuple<int, int>{1, 2}; +}; + +struct A +{ + int i = 0; + int j = i < 42, k; // OK, declares j and k + int l = i < 42, 24; // { dg-error "" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-eh1.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-eh1.C new file mode 100644 index 0000000000..09c92d2f15 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-eh1.C @@ -0,0 +1,18 @@ +// Core issue 1351 +// { dg-do run { xfail *-*-* } } +// { dg-options -std=c++0x } + +bool fail; +struct A +{ + int i = fail ? throw "noooooooo" : 42; +}; + +int main() +{ + A a1; + if (a1.i != 42) return 1; + fail = true; + try { A a2; } + catch (...) { } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-list1.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-list1.C new file mode 100644 index 0000000000..526f29ae28 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-list1.C @@ -0,0 +1,14 @@ +// PR c++/50563 +// { dg-options -std=c++0x } + +struct S1 { + int a{10}, b{20}; // OK +}; + +struct S2 { + int a, b = 20; // OK +}; + +struct S3 { + int a = 10, b = 20; +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-list2.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-list2.C new file mode 100644 index 0000000000..a6321ffb60 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-list2.C @@ -0,0 +1,32 @@ +// PR c++/50930 +// { dg-options -std=c++0x } + +struct nmc { + nmc() = default; + nmc(nmc&&) = delete; // line 3 +}; + +struct A { // line 6 + nmc n{}; + nmc n2 = {}; +} a; // line 8 + +// ------ + +struct lock_t { + int lock[4]; +}; + +struct pthread_mutex_t { + volatile lock_t __spinlock; +}; + +struct mutex { + pthread_mutex_t m = { }; + mutex() = default; +}; + +int main() +{ + mutex mx; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-template1.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-template1.C new file mode 100644 index 0000000000..04f1e0391d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-template1.C @@ -0,0 +1,21 @@ +// { dg-do run } +// { dg-options -std=c++0x } + +struct base +{ + int calc_avg() { return 42; } +}; + +template <class T> struct nsdmi : T +{ + nsdmi() {} + int avg() { return avg_; } + int avg_ = this->calc_avg(); +}; + +int main() +{ + nsdmi<base> x; + if (x.avg() != 42) + __builtin_abort(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-template2.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-template2.C new file mode 100644 index 0000000000..27b0aa5f9d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-template2.C @@ -0,0 +1,14 @@ +// PR c++/50614 +// { dg-options "-std=c++0x -fcompare-debug" } + +struct A +{ + int f (); +}; + +template <int> struct B : A +{ + int i = this->f (); +}; + +B<0> b; diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-virtual1.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-virtual1.C new file mode 100644 index 0000000000..4aa8d482da --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-virtual1.C @@ -0,0 +1,26 @@ +// PR c++/51611 +// { dg-options -std=c++0x } +// { dg-do run } + +struct A +{ + A(): i(42) { } + int i; + int f() { return i; } +}; + +struct B : virtual A +{ + int j = i + f(); + int k = A::i + A::f(); +}; + +struct C: B { int pad; }; + +int main() +{ + C c; + if (c.j != 84 || c.k != 84) + __builtin_abort(); +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi1.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi1.C new file mode 100644 index 0000000000..159c16de85 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi1.C @@ -0,0 +1,53 @@ +// { dg-do run } +// { dg-options -std=c++0x } + +struct A +{ + int i = 42; +}; + +struct B +{ + int i = 42; + B() { } + B(int i): i(i) { } +}; + +template <class T, T t> +struct C +{ + T m = t; +}; + +template <class T, T t> +struct D +{ + T m = t; + D() { } + D(T m):m(m) { } +}; + +int main() +{ + A a1; + if (a1.i != 42) return 1; + A a2{}; + if (a2.i != 42) return 2; + A a3[1]; + if (a3[0].i != 42) return 3; + + B b1; + if (b1.i != 42) return 3; + B b2 (24); + if (b2.i != 24) return 4; + + C<int,3> c1; + if (c1.m != 3) return 5; + C<int,5> c2 {}; + if (c2.m != 5) return 6; + + D<int,3> d1; + if (d1.m != 3) return 7; + D<int,3> d2 (5) ; + if (d2.m != 5) return 8; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi2.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi2.C new file mode 100644 index 0000000000..9636bed882 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi2.C @@ -0,0 +1,21 @@ +// { dg-options -std=c++0x } + +struct A +{ + int i; + constexpr A(int i): i(i) {} +}; + +struct B +{ + A a1 = 1; + A a2 { 2 }; + A a3 = { 3 }; +}; + +#define SA(X) static_assert(X,#X) + +constexpr B b; +SA(b.a1.i == 1); +SA(b.a2.i == 2); +SA(b.a3.i == 3); diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi3.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi3.C new file mode 100644 index 0000000000..73b2bc2e1a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi3.C @@ -0,0 +1,18 @@ +// { dg-options -std=c++0x } + +struct A +{ + int i; + explicit constexpr A(int i): i(i) {} +}; + +struct B +{ + A a1 = 1; // { dg-error "" } + A a2 { 2 }; + A a3 = { 3 }; // { dg-error "" } +}; + +constexpr B b; // { dg-error "B::B" } + +// { dg-message "a1. is invalid" "" { target *-*-* } 11 } diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi4.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi4.C new file mode 100644 index 0000000000..db365cb55e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi4.C @@ -0,0 +1,24 @@ +// { dg-do run } +// { dg-options -std=c++0x } + +int c; + +struct A +{ + A() { } + A(const A&) { } +}; + +A f() { ++c; return A(); } + +struct B +{ + A a = f(); +}; + +int main() +{ + B b1, b2; + if (c != 2) + __builtin_abort(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi5.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi5.C new file mode 100644 index 0000000000..62803b0819 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi5.C @@ -0,0 +1,20 @@ +// { dg-options -std=c++0x } + +struct X +{ + int x = 5; + int f() { return x; } +}; +struct Y : X +{ + int y = this->x; +}; +template <class T> struct Z : T +{ + int y = this->f(); +}; +int main() +{ + Y foo; + Z<X> bar; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi6.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi6.C new file mode 100644 index 0000000000..bb455e778e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi6.C @@ -0,0 +1,8 @@ +// Origin PR c++/51477 +// { dg-options "-std=c++11" } + +struct A +{ + typedef int int T; // { dg-error "two or more data types in declaration" } + struct T x[1] = { 0 }; // { dg-error "invalid|forward" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi7.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi7.C new file mode 100644 index 0000000000..ea1957775a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi7.C @@ -0,0 +1,17 @@ +// PR c++/53594 +// { dg-do compile } +// { dg-options "-std=c++11 -Wuninitialized" } + +struct A +{ + const int a = 6; // { dg-bogus "non-static const member" } + static int b; + int &c = b; // { dg-bogus "non-static reference" } +}; + +struct B +{ + const int d; // { dg-warning "non-static const member" } + int &e; // { dg-warning "non-static reference" } + int f = 7; +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr15.C b/gcc/testsuite/g++.dg/cpp0x/nullptr15.C index e02fd5592e..af661ecc3a 100644 --- a/gcc/testsuite/g++.dg/cpp0x/nullptr15.C +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr15.C @@ -17,10 +17,10 @@ void test_g() // Deduction to nullptr_t, no deduction to pointer type // g(nullptr); // { dg-error "no matching function for call to " } - // { dg-message "candidate" "candidate note" { target *-*-* } 19 } + // { dg-message "(candidate|mismatched types)" "candidate note" { target *-*-* } 19 } type_equal<float*>(g((float*)nullptr)); decltype(nullptr) mynull = 0; g(mynull); // { dg-error "no matching function for call to " } - // { dg-message "candidate" "candidate note" { target *-*-* } 23 } + // { dg-message "(candidate|mismatched types)" "candidate note" { target *-*-* } 23 } type_equal<float*>(g((float*)mynull)); } diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr19.C b/gcc/testsuite/g++.dg/cpp0x/nullptr19.C index cf30f1c239..ecc36139a4 100644 --- a/gcc/testsuite/g++.dg/cpp0x/nullptr19.C +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr19.C @@ -5,8 +5,8 @@ typedef decltype(nullptr) nullptr_t; -char* k( char* ); /* { dg-message "note" } { dg-message "note" } */ -nullptr_t k( nullptr_t ); /* { dg-message "note" } { dg-message "note" } */ +char* k( char* ); /* { dg-message "note" } */ +nullptr_t k( nullptr_t ); /* { dg-message "note" } */ void test_k() { diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr21.C b/gcc/testsuite/g++.dg/cpp0x/nullptr21.C index c30cb3c8b6..8362bd2965 100644 --- a/gcc/testsuite/g++.dg/cpp0x/nullptr21.C +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr21.C @@ -3,42 +3,53 @@ // Test throw and catch -#include <cstdio> +extern "C" void abort (void); typedef decltype(nullptr) nullptr_t; +int result[2]; + +void __attribute__((noinline)) +foo (int i, int j) +{ + result[i] = j; +} + int main() { try { throw nullptr; } catch (void*) { - printf("Test 1 Fail"); + foo (0, 1); } catch (bool) { - printf("Test 1 Fail"); + foo (0, 2); } catch (int) { - printf("Test 1 Fail"); + foo (0, 3); } catch (long int) { - printf("Test 1 Fail"); + foo (0, 4); } catch (nullptr_t) { - printf("Test 1 OK"); + foo (0, 5); } catch (...) { - printf("Test 1 Fail"); - } // { dg-output "Test 1 OK" } + foo (0, 6); + } nullptr_t mynull = 0; try { throw mynull; } catch (void*) { - printf("Test 2 Fail"); + foo (1, 1); } catch (bool) { - printf("Test 2 Fail"); + foo (1, 2); } catch (int) { - printf("Test 2 Fail"); + foo (1, 3); } catch (long int) { - printf("Test 2 Fail"); + foo (1, 4); } catch (nullptr_t) { - printf("Test 2 OK"); + foo (1, 5); } catch (...) { - printf("Test 2 Fail"); - } // { dg-output "Test 2 OK" } + foo (1, 6); + } + + if (result[0] != 5 || result[1] != 5) + abort (); } diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr23.C b/gcc/testsuite/g++.dg/cpp0x/nullptr23.C new file mode 100644 index 0000000000..a078269de2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr23.C @@ -0,0 +1,24 @@ +// PR c++/50361 +// { dg-options -std=c++0x } + +#include <initializer_list> + +struct Foo +{ + Foo(std::initializer_list<Foo>) { }; + + template<class T> Foo(T t) { T u(t); }; + +private: + union Data + { + Data() : null(nullptr) {} + + std::nullptr_t null; + } u_; +}; + +int main() +{ + Foo f = { {} }; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr24.C b/gcc/testsuite/g++.dg/cpp0x/nullptr24.C new file mode 100644 index 0000000000..f391779662 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr24.C @@ -0,0 +1,5 @@ +// PR c++/50371 +// { dg-options -std=c++0x } + +template<decltype(nullptr)> +struct nt; diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr25.C b/gcc/testsuite/g++.dg/cpp0x/nullptr25.C new file mode 100644 index 0000000000..b8a7f45c67 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr25.C @@ -0,0 +1,6 @@ +// { dg-options -std=c++0x } + +template<decltype(nullptr)> +struct nt{}; + +nt<nullptr> x; diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr26.C b/gcc/testsuite/g++.dg/cpp0x/nullptr26.C new file mode 100644 index 0000000000..b7421b8d04 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr26.C @@ -0,0 +1,13 @@ +// PR c++/51530 +// { dg-options -std=c++0x } + +template <class T, class U> +void f(T, U); + +template <class T> +void f(T, decltype(nullptr)); + +int main() +{ + f(1, nullptr); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr28.C b/gcc/testsuite/g++.dg/cpp0x/nullptr28.C new file mode 100644 index 0000000000..05fbe57b19 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr28.C @@ -0,0 +1,16 @@ +// { dg-do run { target c++11 } } + +typedef decltype(nullptr) nullptr_t; + +int i; +nullptr_t n; +const nullptr_t& f() { ++i; return n; } + +nullptr_t g() { return f(); } + +int main() +{ + g(); + if (i != 1) + __builtin_abort (); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr29.C b/gcc/testsuite/g++.dg/cpp0x/nullptr29.C new file mode 100644 index 0000000000..a8e35a9b67 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr29.C @@ -0,0 +1,4 @@ +// PR c++/53882 +// { dg-options "-std=gnu++11 -O" } + +void f(decltype(nullptr) &__restrict np) { } diff --git a/gcc/testsuite/g++.dg/cpp0x/overload2.C b/gcc/testsuite/g++.dg/cpp0x/overload2.C new file mode 100644 index 0000000000..ff8ad22bea --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/overload2.C @@ -0,0 +1,24 @@ +// Core 1321 +// { dg-options -std=c++0x } +// Two dependent names are equivalent even if the overload sets found by +// phase 1 lookup are different. Merging them keeps the earlier set. + +int g1(int); +template <class T> decltype(g1(T())) f1(); +int g1(); +template <class T> decltype(g1(T())) f1() +{ return g1(T()); } +int i1 = f1<int>(); // OK, g1(int) was declared before the first f1 + +template <class T> decltype(g2(T())) f2(); +int g2(int); +template <class T> decltype(g2(T())) f2() // { dg-error "g2. was not declared" } +{ return g2(T()); } +int i2 = f2<int>(); // { dg-error "no match" } + +int g3(); +template <class T> decltype(g3(T())) f3(); +int g3(int); +template <class T> decltype(g3(T())) f3() // { dg-error "too many arguments" } +{ return g3(T()); } +int i3 = f3<int>(); // { dg-error "no match" } diff --git a/gcc/testsuite/g++.dg/cpp0x/override1.C b/gcc/testsuite/g++.dg/cpp0x/override1.C new file mode 100644 index 0000000000..ba580b5c09 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/override1.C @@ -0,0 +1,61 @@ +// { dg-do compile } +// { dg-options "--std=c++0x" } +struct B +{ + virtual void f() final {} + virtual void g() {} + virtual void x() const {} +}; + +struct B2 +{ + virtual void h() {} +}; + +struct D : B +{ + virtual void g() override final {} // { dg-error "overriding" } +}; + +template <class T> struct D2 : T +{ + void h() override {} // { dg-error "marked override, but does not override" } +}; + +template <class T> struct D3 : T +{ + void h() override {} +}; + +struct D4 : D +{ + void g() {} // { dg-error "virtual function" } +}; + +struct B3 +{ + virtual void f() final final {} // { dg-error "duplicate virt-specifier" } +}; + +struct B4 +{ + void f() final {} // { dg-error "marked final, but is not virtual" } +}; + +struct D5 : B +{ + void ff() override {} // { dg-error "marked override, but does not override" } + virtual void fff() override {} // { dg-error "marked override, but does not override" } + virtual void x() override {} // { dg-error "marked override, but does not override" } + void g() override; +}; + +void D5::g() override {} // { dg-error "not allowed outside a class definition" } +void g() override {} // { dg-error "not allowed outside a class definition" } + +int main() +{ + D2<B> d; + D2<B2> d2; + D3<B2> d3; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/override2.C b/gcc/testsuite/g++.dg/cpp0x/override2.C new file mode 100644 index 0000000000..0d8871d6ae --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/override2.C @@ -0,0 +1,54 @@ +// { dg-do compile } +// { dg-options "--std=c++0x" } +struct B1 {}; + +struct B2 final {}; + +struct D1 : B1 {}; + +struct D2 : B2 {}; // { dg-error "cannot derive from 'final' base" } + +template<class T> struct D3 : T {}; + +template<class T> struct D4 : T {}; // { dg-error "cannot derive from 'final' base" } + +template <class T> struct B3 {}; + +template <class T> struct B4 final {}; + +template <class T> struct B5 final {}; + +struct undeclared<int> final { }; // { dg-error "not a template" } + +struct D5 : B3<D5> {}; + +struct D6 : B4<D6> {}; // { dg-error "cannot derive from 'final' base" } + +struct B6 final final {}; // { dg-error "duplicate virt-specifier" } + +struct B7 override {}; // { dg-error "cannot specify 'override' for a class" } + +namespace N +{ + struct C; +} + +struct N::C final{}; + +int main() +{ + D3<B1> d; + D4<B2> d2; + struct B2 final{}; // { dg-error "previous definition" } + B2 final; // { dg-error "has a previous declaration|previously declared here" } + B2 final2 = final; + struct B2 {}; // { dg-error "redefinition" } + struct B2 final; // { dg-error "redeclaration" } + struct B2 override; // { dg-error "previously declared here" } + struct B2 final {}; // { dg-error "redefinition" } + struct B2 override {}; // { dg-error "cannot specify 'override' for a class" } + B2 override{}; // { dg-error "redeclaration" } + struct foo final {}; // { dg-error "previous definition" } + struct foo final {}; // { dg-error "redefinition" } + foo final; // { dg-error "conflicting declaration" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/override3.C b/gcc/testsuite/g++.dg/cpp0x/override3.C new file mode 100644 index 0000000000..2d22cbf2aa --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/override3.C @@ -0,0 +1,24 @@ +// { dg-do compile } +// { dg-options "--std=c++98" } + +struct B final {}; // { dg-warning "override controls" } + +struct D : B {}; // { dg-error "cannot derive from 'final' base" } + +struct E __final {}; + +struct F : E {}; // { dg-error "cannot derive from 'final' base" } + +struct G +{ + virtual void f(); +}; + +struct H : G +{ + void f() override; // { dg-warning "override controls" } +}; + +int main() +{ +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr31431-2.C b/gcc/testsuite/g++.dg/cpp0x/pr31431-2.C index 15efbc5d35..076493938a 100644 --- a/gcc/testsuite/g++.dg/cpp0x/pr31431-2.C +++ b/gcc/testsuite/g++.dg/cpp0x/pr31431-2.C @@ -4,5 +4,5 @@ template<typename, typename..., typename> void foo(); // { dg-message "note" } void bar() { foo<int>(); // { dg-error "no matching function" } - // { dg-message "candidate" "candidate note" { target *-*-* } 6 } + // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 6 } } diff --git a/gcc/testsuite/g++.dg/cpp0x/pr31431.C b/gcc/testsuite/g++.dg/cpp0x/pr31431.C index 36f341f3d0..afd3237157 100644 --- a/gcc/testsuite/g++.dg/cpp0x/pr31431.C +++ b/gcc/testsuite/g++.dg/cpp0x/pr31431.C @@ -4,5 +4,5 @@ template<typename..., typename> void foo(); // { dg-message "note" } void bar() { foo<int>(); // { dg-error "no matching function" } - // { dg-message "candidate" "candidate note" { target *-*-* } 6 } + // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 6 } } diff --git a/gcc/testsuite/g++.dg/cpp0x/pr31434.C b/gcc/testsuite/g++.dg/cpp0x/pr31434.C index 97ad079ab0..54786167c3 100644 --- a/gcc/testsuite/g++.dg/cpp0x/pr31434.C +++ b/gcc/testsuite/g++.dg/cpp0x/pr31434.C @@ -8,5 +8,5 @@ template<typename... T> int foo(const T&) // { dg-error "not expanded with|T" } void bar() { foo(0); // { dg-error "no matching" } - // { dg-message "candidate" "candidate note" { target *-*-* } 10 } + // { dg-message "(candidate|cannot convert)" "candidate note" { target *-*-* } 10 } } diff --git a/gcc/testsuite/g++.dg/cpp0x/pr45908.C b/gcc/testsuite/g++.dg/cpp0x/pr45908.C index 3a8508890e..45399b5395 100644 --- a/gcc/testsuite/g++.dg/cpp0x/pr45908.C +++ b/gcc/testsuite/g++.dg/cpp0x/pr45908.C @@ -14,5 +14,5 @@ struct vector { class block { vector v; auto end() const -> decltype(v.begin()) - { return v.begin(); } // { dg-error "could not convert" } + { return v.begin(); } }; diff --git a/gcc/testsuite/g++.dg/cpp0x/pr47416.C b/gcc/testsuite/g++.dg/cpp0x/pr47416.C index a11368a50f..55426c1f81 100644 --- a/gcc/testsuite/g++.dg/cpp0x/pr47416.C +++ b/gcc/testsuite/g++.dg/cpp0x/pr47416.C @@ -210,7 +210,7 @@ namespace boost private:table table_; public: unordered_map (size_type n = boost::unordered_detail::default_bucket_count, hasher hf = hasher (), key_equal eql = key_equal (), - allocator_type a = allocator_type ()):table_ (n, hf, eql, a) // { dg-message "instantiated" } + allocator_type a = allocator_type ()):table_ (n, hf, eql, a) // { dg-message "required" } { } }; @@ -220,6 +220,6 @@ void foo (const int &a) { typedef boost::unordered_map < std::string, int >Name2Port; - Name2Port b; // { dg-message "instantiated" } + Name2Port b; // { dg-message "required" } std::make_pair (a, b); } diff --git a/gcc/testsuite/g++.dg/cpp0x/pr50901.C b/gcc/testsuite/g++.dg/cpp0x/pr50901.C new file mode 100644 index 0000000000..439c15cc1c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr50901.C @@ -0,0 +1,9 @@ +// { dg-options "-std=c++0x" } + +template<class T> int foo(int a) +{ + const unsigned b = a < 0 ? -a : a; + return 0; +} + +int i = foo<float>(1); diff --git a/gcc/testsuite/g++.dg/cpp0x/pr51150.C b/gcc/testsuite/g++.dg/cpp0x/pr51150.C new file mode 100644 index 0000000000..37eb166b43 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr51150.C @@ -0,0 +1,20 @@ +// PR c++/51150 +// { dg-options "-std=c++0x" } + +struct Clock { + double Now(); +}; +template <class T> void Foo(Clock* clock) { + const int now = clock->Now(); +} + +template void Foo<float>(Clock*); + +template <class T> void Boo(int val) { + const int now1 = (double)(val); + const int now2 = const_cast<double>(val); // { dg-error "invalid" } + const int now3 = static_cast<double>(val); + const int now4 = reinterpret_cast<double>(val); // { dg-error "invalid" } +} + +template void Boo<float>(int); diff --git a/gcc/testsuite/g++.dg/cpp0x/pr51216.C b/gcc/testsuite/g++.dg/cpp0x/pr51216.C new file mode 100644 index 0000000000..4bdd071475 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr51216.C @@ -0,0 +1,10 @@ +// PR c++/51216 +// { dg-options "-std=c++0x" } + +void foo() +{ + int i = ({ if (1) ; }); // { dg-error "ignored" } + int j = ({ for (;;) ; }); // { dg-error "ignored" } + int k = ({ while (1) ; }); // { dg-error "ignored" } + int l = ({ do { } while (1); }); // { dg-error "ignored" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr51225.C b/gcc/testsuite/g++.dg/cpp0x/pr51225.C new file mode 100644 index 0000000000..6fcf8611f9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr51225.C @@ -0,0 +1,14 @@ +// PR c++/51225 +// { dg-options "-std=c++0x" } + +template<int> struct A {}; + +template<typename> void foo() +{ + A<int(x)> a; // { dg-error "not declared|invalid type" } +} + +template<typename> struct bar +{ + static constexpr A<1> b = A<1>(x); // { dg-error "not declared" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/pr51313.C b/gcc/testsuite/g++.dg/cpp0x/pr51313.C new file mode 100644 index 0000000000..ff078e02d6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr51313.C @@ -0,0 +1,18 @@ +// PR c++/51313 +// { dg-options "-std=c++0x" } + +class ostream; + +extern "C" { + extern int isdigit (int); +} + +ostream& +operator<<(ostream&, const unsigned char*); + +extern ostream cout; + +int main() +{ + cout << isdigit(0); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr51420.C b/gcc/testsuite/g++.dg/cpp0x/pr51420.C new file mode 100644 index 0000000000..aec8cb1fcb --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr51420.C @@ -0,0 +1,8 @@ +// { dg-options "-std=c++11" } + +void +foo() +{ + float x = operator"" _F(); // { dg-error "was not declared in this scope" } + float y = 0_F; // { dg-error "unable to find numeric literal operator" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr51463.C b/gcc/testsuite/g++.dg/cpp0x/pr51463.C new file mode 100644 index 0000000000..1e8be3b521 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr51463.C @@ -0,0 +1,8 @@ +// PR c++/51463 +// { dg-do compile } +// { dg-options "-std=c++11" } + +struct A +{ + static virtual int i = 0; // { dg-error "both virtual and static|declared as" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/pr51547.C b/gcc/testsuite/g++.dg/cpp0x/pr51547.C new file mode 100644 index 0000000000..80215f6a34 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr51547.C @@ -0,0 +1,50 @@ +// PR c++/51547 +// { dg-options "-std=c++0x" } + +template <class T> +struct vector +{ + T* + begin() + { return &member; } + + const T* + begin() const + { return &member; } + + T member; +}; + +struct Bar { + int x; +}; + +struct Foo { + const vector<Bar>& bar() const { + return bar_; + } + + vector<Bar> bar_; +}; + +template <class X> +struct Y { + void foo() { + Foo a; + auto b = a.bar().begin(); + auto&& c = b->x; + } +}; + +template <class X> +void foo() { + Foo a; + auto b = a.bar().begin(); + auto&& c = b->x; +} + +int main() { + Y<int> p; + p.foo(); + foo<int>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr51619.C b/gcc/testsuite/g++.dg/cpp0x/pr51619.C new file mode 100644 index 0000000000..dd51679158 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr51619.C @@ -0,0 +1,7 @@ +// PR c++/51619 +// { dg-do compile } +// { dg-options "-std=c++0x" } + +struct A { virtual ~A(); }; +struct B { A a[1][1]; } b; +struct C { A a[3][3]; } c; diff --git a/gcc/testsuite/g++.dg/cpp0x/pr52841.C b/gcc/testsuite/g++.dg/cpp0x/pr52841.C new file mode 100644 index 0000000000..f6467f8f72 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr52841.C @@ -0,0 +1,17 @@ +// { dg-do compile } + +struct Solvable; +namespace sat +{ + class Solvable + { + public: + typedef bool bool_type; + }; +} + +class Resolvable : public sat::Solvable +{ +public: + using sat::Solvable::bool_type; +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/ptrmem-cst-arg1.C b/gcc/testsuite/g++.dg/cpp0x/ptrmem-cst-arg1.C new file mode 100644 index 0000000000..b6c81d5f46 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/ptrmem-cst-arg1.C @@ -0,0 +1,9 @@ +// Origin PR c++/51476 +// { dg-options "-std=c++11" } + +template<int> struct A {}; +struct B +{ + int i; + A<&B::i> a; // { dg-error "could not convert template argument" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for11.C b/gcc/testsuite/g++.dg/cpp0x/range-for11.C new file mode 100644 index 0000000000..d02519a251 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for11.C @@ -0,0 +1,40 @@ +// Test for range-based for loop +// Test the loop with a custom iterator +// with begin/end as member functions + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +struct iterator +{ + int x; + explicit iterator(int v) :x(v) {} + iterator &operator ++() { ++x; return *this; } + int operator *() { return x; } + bool operator != (const iterator &o) { return x != o.x; } +}; + +namespace foo +{ + struct container + { + int min, max; + container(int a, int b) :min(a), max(b) {} + + iterator begin() + { + return iterator(min); + } + iterator end() + { + return iterator(max + 1); + } + }; +} + +int main() +{ + foo::container c(1,4); + for (int it : c) + ; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for12.C b/gcc/testsuite/g++.dg/cpp0x/range-for12.C new file mode 100644 index 0000000000..9b405dc620 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for12.C @@ -0,0 +1,116 @@ +// Test for range-based for loop with templates +// and begin/end as member functions + +// { dg-do run } +// { dg-options "-std=c++0x" } + +/* Preliminary declarations */ +namespace pre +{ + struct iterator + { + int x; + explicit iterator (int v) :x(v) {} + iterator &operator ++() { ++x; return *this; } + int operator *() { return x; } + bool operator != (const iterator &o) { return x != o.x; } + }; + + struct container + { + int min, max; + container(int a, int b) :min(a), max(b) {} + iterator begin() const + { + return iterator(min); + } + iterator end() const + { + return iterator(max); + } + + }; + +} //namespace pre + +using pre::container; +extern "C" void abort(void); + +container run_me_just_once() +{ + static bool run = false; + if (run) + abort(); + run = true; + return container(1,2); +} + +/* Template with dependent expression. */ +template<typename T> int test1(const T &r) +{ + int t = 0; + for (int i : r) + t += i; + return t; +} + +/* Template with non-dependent expression and dependent declaration. */ +template<typename T> int test2(const container &r) +{ + int t = 0; + for (T i : r) + t += i; + return t; +} + +/* Template with non-dependent expression (array) and dependent declaration. */ +template<typename T> int test2(const int (&r)[4]) +{ + int t = 0; + for (T i : r) + t += i; + return t; +} + +/* Template with non-dependent expression and auto declaration. */ +template<typename T> int test3(const container &r) +{ + int t = 0; + for (auto i : r) + t += i; + return t; +} + +/* Template with non-dependent expression (array) and auto declaration. */ +template<typename T> int test3(const int (&r)[4]) +{ + int t = 0; + for (auto i : r) + t += i; + return t; +} + +int main () +{ + container c(1,5); + int a[4] = {5,6,7,8}; + + for (auto x : run_me_just_once()) + ; + + if (test1 (c) != 10) + abort(); + if (test1 (a) != 26) + abort(); + + if (test2<int> (c) != 10) + abort(); + if (test2<int> (a) != 26) + abort(); + + if (test3<int> (c) != 10) + abort(); + if (test3<int> (a) != 26) + abort(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for13.C b/gcc/testsuite/g++.dg/cpp0x/range-for13.C new file mode 100644 index 0000000000..7ebf0c563e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for13.C @@ -0,0 +1,103 @@ +// Test for errors in range-based for loops +// with member begin/end + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +//These should not be used +template<typename T> int *begin(T &t) +{ + T::fail; +} +template<typename T> int *end(T &t) +{ + T::fail; +} + +struct container1 +{ + int *begin(); + //no end +}; + +struct container2 +{ + int *end(); + //no begin +}; + +struct container3 +{ +private: + int *begin(); // { dg-error "is private" } + int *end(); // { dg-error "is private" } +}; + +struct container4 +{ + int *begin; + int *end; +}; + +struct container5 +{ + typedef int *begin; + typedef int *end; +}; + +struct callable +{ + int *operator()(); +}; + +struct container6 +{ + callable begin; + callable end; +}; + +struct container7 +{ + static callable begin; + static callable end; +}; + +struct container8 +{ + static int *begin(); + int *end(); +}; + +struct private_callable +{ +private: + int *operator()(); // { dg-error "is private" } +}; + +struct container9 +{ + private_callable begin; + private_callable end; +}; + +struct container10 +{ + typedef int *(*function)(); + + function begin; + static function end; +}; + +void test1() +{ + for (int x : container1()); // { dg-error "member but not" } + for (int x : container2()); // { dg-error "member but not" } + for (int x : container3()); // { dg-error "within this context" } + for (int x : container4()); // { dg-error "cannot be used as a function" } + for (int x : container5()); // { dg-error "invalid use of" } + for (int x : container6()); + for (int x : container7()); + for (int x : container8()); + for (int x : container9()); // { dg-error "within this context" } + for (int x : container10()); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for14.C b/gcc/testsuite/g++.dg/cpp0x/range-for14.C new file mode 100644 index 0000000000..26ae477d70 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for14.C @@ -0,0 +1,95 @@ +// Test for other range-based for loops with +// begin/end member functions + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +//These should not be used +template<typename T> int *begin(T &t) +{ + T::fail; +} +template<typename T> int *end(T &t) +{ + T::fail; +} + +//Test for defaults + +struct default1 +{ + int *begin(int x); // { dg-message "note" } + int *end(); +}; + +struct default2 +{ + int *begin(int x=0); + int *end(); +}; + +struct default3 +{ + template <typename T> T *begin(); // { dg-message "note" } + int *end(); +}; + +struct default4 +{ + template <typename T=int> T *begin(); + int *end(); +}; + +struct default5 +{ + template <typename T=int> T *begin(int x=0); + int *end(); +}; + +void test1() +{ + for (int x : default1()); // { dg-error "no matching function|note" } + for (int x : default2()); + for (int x : default3()); // { dg-error "no matching function|note" } + for (int x : default4()); + for (int x : default5()); +} + +//Inheritance tests + +struct base_begin +{ + int *begin(); // { dg-error "" } +}; + +struct base_end +{ + int *end(); +}; + +struct derived1 : base_begin, base_end +{ +}; + +struct base_begin2 : base_begin +{ +}; + +struct derived2 : base_begin, base_end, base_begin2 // { dg-warning "" } +{ +}; + +struct base_begin3 : virtual base_begin +{ +}; + +struct derived3 : virtual base_begin, base_end, base_begin3 +{ +}; + +void test2() +{ + for (int x : derived1()); + for (int x : derived2()); // { dg-error "is ambiguous" } + for (int x : derived3()); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for15.C b/gcc/testsuite/g++.dg/cpp0x/range-for15.C new file mode 100644 index 0000000000..38f330771e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for15.C @@ -0,0 +1,59 @@ +// Test for range-based for loop with templates +// and begin/end as member (non-)virtual functions + +// { dg-do run } +// { dg-options "-std=c++0x" } + +unsigned int g; + +struct A +{ + virtual int *begin() + { + g |= 1; + return 0; + } + int *end() + { + g |= 2; + return 0; + } +}; + +struct B : A +{ + virtual int *begin() + { + g |= 4; + return 0; + } + int *end() + { + g |= 8; + return 0; + } +}; + +extern "C" void abort(void); + +int main () +{ + A a; + B b; + A &aa = b; + + g = 0; + for (int x : a); + if (g != (1 | 2)) + abort(); + + g = 0; + for (int x : b); + if (g != (4 | 8)) + abort(); + + g = 0; + for (int x : aa); + if (g != (4 | 2)) + abort(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for16.C b/gcc/testsuite/g++.dg/cpp0x/range-for16.C new file mode 100644 index 0000000000..86cc2a828b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for16.C @@ -0,0 +1,21 @@ +// Test for range-based for loop with arrays of +// incomplete type or unknown size + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +extern int a[10]; +extern int b[]; + +struct S; +extern S c[10]; +extern S d[]; + +void test() +{ + for (int n : a); + for (int n : b); // { dg-error "incomplete type" } + for (S &n : c); // { dg-error "incomplete type" } + for (S &n : d); // { dg-error "incomplete type" } + for (int n : *c); // { dg-error "incomplete type" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for17.C b/gcc/testsuite/g++.dg/cpp0x/range-for17.C new file mode 100644 index 0000000000..eb888d9ab6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for17.C @@ -0,0 +1,17 @@ +// { dg-options -std=c++0x } + +extern "C" int printf (const char *, ...); + +enum E { e1, e2, e3, X }; +E operator*(E e) { return e; } +E begin(E e) { return e; } +E end(E e) { return X; }; +E operator++(E& e) { return e = E(e+1); } + +int main() +{ + for (auto e: e1) + { + printf ("%d ", e); + } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for18.C b/gcc/testsuite/g++.dg/cpp0x/range-for18.C new file mode 100644 index 0000000000..386d73d181 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for18.C @@ -0,0 +1,17 @@ +// PR c++/48994 + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <typename T> +struct myvec +{ + T* begin() const; + T* end() const; +}; + +void f(const myvec<int>& v) +{ + for (int i : v) + ; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for19.C b/gcc/testsuite/g++.dg/cpp0x/range-for19.C new file mode 100644 index 0000000000..4306fbda6c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for19.C @@ -0,0 +1,11 @@ +// PR c++/49838 + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +int main() +{ + auto a; // { dg-error "no initializer" } + for(auto i: a) // { dg-error "deduce" } + ; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for2.C b/gcc/testsuite/g++.dg/cpp0x/range-for2.C index bfab37673a..17eb41dba7 100644 --- a/gcc/testsuite/g++.dg/cpp0x/range-for2.C +++ b/gcc/testsuite/g++.dg/cpp0x/range-for2.C @@ -8,7 +8,7 @@ struct iterator { int x; - iterator(int v) :x(v) {} + explicit iterator(int v) :x(v) {} iterator &operator ++() { ++x; return *this; } int operator *() { return x; } bool operator != (const iterator &o) { return x != o.x; } @@ -36,6 +36,6 @@ namespace foo int main() { foo::container c(1,4); - for (iterator it : c) + for (int it : c) ; } diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for20.C b/gcc/testsuite/g++.dg/cpp0x/range-for20.C new file mode 100644 index 0000000000..890eb0aeaf --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for20.C @@ -0,0 +1,36 @@ +// PR c++/49834 +// PR c++/50020 +// { dg-options -std=c++0x } + +struct A +{ + template <typename T> T get_value() const; +}; + +struct B { + A first, second; +}; + +struct C +{ + B* begin() const; + B* end() const; +}; + +template <typename Ret> +struct D +{ + Ret f(const C &p) + { + for (const B &i: p) // OK + i.second.get_value<int>(); + for (const auto &i: p) // ERROR + i.second.get_value<int>(); + return Ret(0); + } +}; + +void g() +{ + D<int>().f(C()); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for21.C b/gcc/testsuite/g++.dg/cpp0x/range-for21.C new file mode 100644 index 0000000000..07bb95fbf2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for21.C @@ -0,0 +1,8 @@ +// PR c++/49983 +// { dg-options -std=c++0x } + +template <class T> +void f(T t) +{ + for (auto v : t); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for22.C b/gcc/testsuite/g++.dg/cpp0x/range-for22.C new file mode 100644 index 0000000000..5fef5e6acc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for22.C @@ -0,0 +1,5 @@ +// { dg-options -std=c++0x } + +template<int I> void f() { + for (auto i: {I} ); +} 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 0000000000..b4a5b185bd --- /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/range-for3.C b/gcc/testsuite/g++.dg/cpp0x/range-for3.C index 947f01ced7..85115a38f5 100644 --- a/gcc/testsuite/g++.dg/cpp0x/range-for3.C +++ b/gcc/testsuite/g++.dg/cpp0x/range-for3.C @@ -8,7 +8,7 @@ struct iterator { int x; - iterator(int v) :x(v) {} + explicit iterator(int v) :x(v) {} iterator &operator ++() { ++x; return *this; } int operator *() { return x; } bool operator != (const iterator &o) { return x != o.x; } @@ -36,7 +36,7 @@ namespace std int main() { container c(1,4); - for (iterator it : c) + for (int it : c) { } } diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for5.C b/gcc/testsuite/g++.dg/cpp0x/range-for5.C index 9c97ad5faf..fd6f7618f9 100644 --- a/gcc/testsuite/g++.dg/cpp0x/range-for5.C +++ b/gcc/testsuite/g++.dg/cpp0x/range-for5.C @@ -47,8 +47,8 @@ void test1() //Check the correct scopes int i; - for (int i : a) + for (int i : a) // { dg-error "previously declared" } { - int i; + int i; // { dg-error "redeclaration" } } } diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for9.C b/gcc/testsuite/g++.dg/cpp0x/range-for9.C index 96e9cb61fd..c51cbf9946 100644 --- a/gcc/testsuite/g++.dg/cpp0x/range-for9.C +++ b/gcc/testsuite/g++.dg/cpp0x/range-for9.C @@ -6,6 +6,6 @@ void test() { int a[] = {0,1,2}; - for (int x : a) // { dg-error "range-based-for" } + for (int x : a) // { dg-error "range-based 'for'" } ; } diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/49290.C b/gcc/testsuite/g++.dg/cpp0x/regress/49290.C deleted file mode 100644 index 71e46c5796..0000000000 --- a/gcc/testsuite/g++.dg/cpp0x/regress/49290.C +++ /dev/null @@ -1,12 +0,0 @@ -typedef unsigned T; -struct S -{ - T foo (void); - static unsigned s1[16]; -}; -T -S::foo () -{ - T u = *(T *) (s1 + 10); - return u; -} diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/ctor1.C b/gcc/testsuite/g++.dg/cpp0x/regress/ctor1.C new file mode 100644 index 0000000000..c35d6011f3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/ctor1.C @@ -0,0 +1,21 @@ +// PR c++/49569 +// { dg-options -std=c++0x } + +struct A +{ + virtual void f() = 0; +}; + +struct B: A +{ + int i; + virtual void f() { } +}; + +struct C +{ + B b; + C(): b() { } + C(const B& b): b(b) { } +}; + diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/error-recovery1.C b/gcc/testsuite/g++.dg/cpp0x/regress/error-recovery1.C index 2094d3e3eb..cdf9940847 100644 --- a/gcc/testsuite/g++.dg/cpp0x/regress/error-recovery1.C +++ b/gcc/testsuite/g++.dg/cpp0x/regress/error-recovery1.C @@ -5,5 +5,7 @@ template < bool > void foo () { const bool b =; // { dg-error "" } - foo < b > (); // { dg-error "constant expression" } + foo < b > (); // { dg-error "constant expression" "const expr" } }; + +// { dg-error "no match" "no match" { target *-*-* } 8 } diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/regress4.C b/gcc/testsuite/g++.dg/cpp0x/regress/regress4.C new file mode 100644 index 0000000000..b56263ae5a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/regress4.C @@ -0,0 +1,62 @@ +// PR c++/49663 +// { dg-options -std=c++0x } + +struct Nosm +{ + int m_R; +}; + +namespace dx { + + struct onc + { + typedef void(*Cb)(); + + onc(Cb cb); + }; + + struct grac + { + template<class Derived> static void once(); + }; + + template<class Derived> + struct tonc : onc + { + tonc() : onc(&grac::once<Derived>) {} + + static Derived& get(); + }; + + template<class Derived> void grac::once() + { + tonc<Derived>::get().h(); + } +} + +namespace +{ + template<typename T, int = sizeof(&T::m_R)> + struct has_R { }; + + template<typename T> + inline void + setR(T* m, has_R<T>* = 0) + { } + + inline void setR(...) { } +} + +template<typename M> + struct Qmi + : dx::tonc<Qmi<M> > + { + void h() + { + setR(&msg); + } + + M msg; + }; + +Qmi<Nosm> x; diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/regress6.C b/gcc/testsuite/g++.dg/cpp0x/regress/regress6.C new file mode 100644 index 0000000000..6de64c0b34 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/regress6.C @@ -0,0 +1,11 @@ +// PR c++/49691 +// { dg-options -std=c++0x } + +struct A { int x; }; +A* f(); +struct B { + void g() + { + int(f()->x); + } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-bitfield.C b/gcc/testsuite/g++.dg/cpp0x/rv-bitfield.C new file mode 100644 index 0000000000..ed866f9e1f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-bitfield.C @@ -0,0 +1,12 @@ +// { dg-options -std=c++0x } + +struct A +{ + int i : 1; +}; + +int main() +{ + A a; + static_cast<int&&>(a.i); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-bitfield2.C b/gcc/testsuite/g++.dg/cpp0x/rv-bitfield2.C new file mode 100644 index 0000000000..e054151b05 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-bitfield2.C @@ -0,0 +1,17 @@ +// PR c++/51868 +// { dg-options -std=c++0x } + +struct A { + A() {} + A(const A&) {} + A(A&&) {} +}; + +struct B { + A a; + int f : 1; +}; + +B func() { + return B(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-cast3.C b/gcc/testsuite/g++.dg/cpp0x/rv-cast3.C new file mode 100644 index 0000000000..6c70324aa8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-cast3.C @@ -0,0 +1,17 @@ +// PR c++/51406 +// { dg-do run { target c++11 } } + +extern "C" int printf(const char *,...); +extern "C" void abort(); + +struct A { int a; A() : a(1) {} }; +struct B { int b; B() : b(2) {} }; +struct X : A, B {}; + +int main() { + X x; + int a=static_cast<A&&>(x).a; + int b=static_cast<B&&>(x).b; + // printf ("%d %d\n", a, b); + if (a!=1 || b!=2) abort(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-cast4.C b/gcc/testsuite/g++.dg/cpp0x/rv-cast4.C new file mode 100644 index 0000000000..13f369d610 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-cast4.C @@ -0,0 +1,13 @@ +// PR c++/51161 +// { dg-do compile { target c++11 } } + +struct A{}; +struct B : A{}; +struct C : A{}; +struct D : B, C{}; + +int main() +{ + D d; + static_cast<A &&>(d); // { dg-error "ambiguous" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-conv1.C b/gcc/testsuite/g++.dg/cpp0x/rv-conv1.C new file mode 100644 index 0000000000..38529913f8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-conv1.C @@ -0,0 +1,9 @@ +// PR c++/49267 +// { dg-options -std=c++0x } + +struct X { + operator int&(); + operator int&&(); +}; + +int&&x = X(); diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-dotstar.C b/gcc/testsuite/g++.dg/cpp0x/rv-dotstar.C new file mode 100644 index 0000000000..65aac8da2a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-dotstar.C @@ -0,0 +1,13 @@ +// PR c++/49389 +// { dg-options -std=c++0x } + +template<class T> T&& val(); + +struct A {}; + +typedef decltype(val<A>().*val<int A::*>()) type; + +template<class> struct assert_type; +template<> struct assert_type<int&&> {}; + +assert_type<type> test; diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-func.C b/gcc/testsuite/g++.dg/cpp0x/rv-func.C new file mode 100644 index 0000000000..db14296112 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-func.C @@ -0,0 +1,22 @@ +// PR c++/48457, Core 1238 +// { dg-options -std=c++0x } + +template<class T> +T&& create(); + +template<class T, class Arg> +void test() { + T t(create<Arg>()); + (void) t; +} + +void f (void (&)()); +void f (void (&&)()); + +int main() { + test<void(&)(), void()>(); + test<void(&&)(), void()>(); + // This call should choose the lvalue reference overload. + // { dg-final { scan-assembler-not "_Z1fOFvvE" } } + f(create<void()>()); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-func2.C b/gcc/testsuite/g++.dg/cpp0x/rv-func2.C new file mode 100644 index 0000000000..b792342dad --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-func2.C @@ -0,0 +1,10 @@ +// PR c++/49458 +// { dg-options -std=c++0x } + +typedef void ftype(); + +struct A { + operator ftype&(void); +}; + +ftype &&frvref = A(); diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-func3.C b/gcc/testsuite/g++.dg/cpp0x/rv-func3.C new file mode 100644 index 0000000000..8504682d79 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-func3.C @@ -0,0 +1,10 @@ +// DR 1328 +// { dg-options -std=c++0x } + +template <class T> struct A { + operator T&(); // #1 + operator T&&(); // #2 +}; +typedef int Fn(); +A<Fn> a; +Fn&& f = a; diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-return.C b/gcc/testsuite/g++.dg/cpp0x/rv-return.C index e52101feae..3ab659833e 100644 --- a/gcc/testsuite/g++.dg/cpp0x/rv-return.C +++ b/gcc/testsuite/g++.dg/cpp0x/rv-return.C @@ -7,12 +7,12 @@ 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(f()), int> 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(g<int>()), int> s3; same_type<decltype(0,g<int>()), int> s4; diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-template1.C b/gcc/testsuite/g++.dg/cpp0x/rv-template1.C new file mode 100644 index 0000000000..11f53bd1c0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-template1.C @@ -0,0 +1,11 @@ +// PR c++/44870 +// { dg-options -std=c++0x } + +void foo(int&& data); + +template <typename T> +void bar(T t) +{ foo(int()); } + +void baz() +{ bar(0); } diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-trivial-bug.C b/gcc/testsuite/g++.dg/cpp0x/rv-trivial-bug.C index 2765b5f3c3..cbce7c4ddd 100644 --- a/gcc/testsuite/g++.dg/cpp0x/rv-trivial-bug.C +++ b/gcc/testsuite/g++.dg/cpp0x/rv-trivial-bug.C @@ -5,22 +5,22 @@ int move_construct = 0; int move_assign = 0; -struct base2 +struct base2 // { dg-message "declares a move" } { base2() {} - base2(base2&&) {++move_construct;} // { dg-error "argument 1" } - base2& operator=(base2&&) {++move_assign; return *this;} // { dg-error "argument 1" } + base2(base2&&) {++move_construct;} + base2& operator=(base2&&) {++move_assign; return *this;} }; int test2() { base2 b; - base2 b2(b); // { dg-error "lvalue" } + base2 b2(b); // { dg-error "deleted" } assert(move_construct == 0); base2 b3(static_cast<base2&&>(b)); base2 b4 = static_cast<base2&&>(b); assert(move_construct == 2); - b = b2; // { dg-error "lvalue" } + b = b2; // { dg-error "deleted" } assert(move_assign == 0); b = static_cast<base2&&>(b2); assert(move_assign == 1); diff --git a/gcc/testsuite/g++.dg/cpp0x/rv1n.C b/gcc/testsuite/g++.dg/cpp0x/rv1n.C index 5224d3eb70..68305ebc9b 100644 --- a/gcc/testsuite/g++.dg/cpp0x/rv1n.C +++ b/gcc/testsuite/g++.dg/cpp0x/rv1n.C @@ -20,7 +20,7 @@ struct eight {char x[8];}; struct A { A(); - A(const volatile A&&); // { dg-error "argument 1" } + A(const volatile A&&); }; A source(); @@ -35,9 +35,9 @@ one sink_1_1( A&); // { dg-error "" } int test1_1() { A a; - const A ca = a; // { dg-error "cannot bind" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "cannot bind" } + const volatile A cva = a; // { dg-error "deleted" } sink_1_1(ca); // { dg-error "invalid initialization" } sink_1_1(va); // { dg-error "invalid initialization" } sink_1_1(cva); // { dg-error "invalid initialization" } @@ -53,9 +53,9 @@ two sink_1_2(const A&); // { dg-error "" } int test1_2() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_1_2(va); // { dg-error "invalid initialization" } sink_1_2(cva); // { dg-error "invalid initialization" } sink_1_2(v_source()); // { dg-error "invalid initialization" } @@ -68,9 +68,9 @@ three sink_1_3(volatile A&); // { dg-error "" } int test1_3() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_1_3(ca); // { dg-error "invalid initialization" } sink_1_3(cva); // { dg-error "invalid initialization" } sink_1_3(source()); // { dg-error "invalid initialization" } @@ -85,9 +85,9 @@ four sink_1_4(const volatile A&); // { dg-error "" } int test1_4() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_1_4(source()); // { dg-error "invalid initialization" } sink_1_4(c_source()); // { dg-error "invalid initialization" } sink_1_4(v_source()); // { dg-error "invalid initialization" } @@ -100,9 +100,9 @@ five sink_1_5( A&&); // { dg-error "" } int test1_5() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_1_5(a); // { dg-error "lvalue" } sink_1_5(ca); // { dg-error "invalid initialization" } sink_1_5(va); // { dg-error "invalid initialization" } @@ -118,9 +118,9 @@ six sink_1_6(const A&&); // { dg-error "" } int test1_6() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_1_6(a); // { dg-error "lvalue" } sink_1_6(ca); // { dg-error "lvalue" } sink_1_6(va); // { dg-error "invalid initialization" } @@ -135,9 +135,9 @@ seven sink_1_7(volatile A&&); // { dg-error "" } int test1_7() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_1_7(a); // { dg-error "lvalue" } sink_1_7(ca); // { dg-error "invalid initialization" } sink_1_7(va); // { dg-error "lvalue" } @@ -152,9 +152,9 @@ eight sink_1_8(const volatile A&&); // { dg-error "" } int test1_8() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_1_8(a); // { dg-error "lvalue" } sink_1_8(ca); // { dg-error "lvalue" } sink_1_8(va); // { dg-error "lvalue" } diff --git a/gcc/testsuite/g++.dg/cpp0x/rv2n.C b/gcc/testsuite/g++.dg/cpp0x/rv2n.C index 2b3a9c06ae..a9d37415e0 100644 --- a/gcc/testsuite/g++.dg/cpp0x/rv2n.C +++ b/gcc/testsuite/g++.dg/cpp0x/rv2n.C @@ -20,7 +20,7 @@ struct eight {char x[8];}; struct A { A(); - A(const volatile A&&); // { dg-error "argument 1" } + A(const volatile A&&); }; A source(); @@ -36,9 +36,9 @@ two sink_2_12(const A&); // { dg-message "note|argument" } int test2_12() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_2_12(va); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 42 } sink_2_12(cva); // { dg-error "no match" } @@ -56,9 +56,9 @@ three sink_2_13(volatile A&); // { dg-message "note|argument" } int test2_13() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_2_13(ca); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 62 } sink_2_13(cva); // { dg-error "no match" } @@ -80,9 +80,9 @@ four sink_2_14(const volatile A&); // { dg-message "note|argument" } int test2_14() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_2_14(source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 86 } sink_2_14(c_source()); // { dg-error "no match" } @@ -100,9 +100,9 @@ five sink_2_15( A&&); // { dg-message "note|argument" } int test2_15() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_2_15(ca); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 106 } sink_2_15(va); // { dg-error "no match" } @@ -124,9 +124,9 @@ six sink_2_16(const A&&); // { dg-message "note|argument" } int test2_16() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_2_16(ca); // { dg-error "lvalue" } sink_2_16(va); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 131 } @@ -145,9 +145,9 @@ seven sink_2_17(volatile A&&); // { dg-message "note|argument" } int test2_17() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_2_17(ca); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 151 } sink_2_17(va); // { dg-error "lvalue" } @@ -166,9 +166,9 @@ eight sink_2_18(const volatile A&&); // { dg-error "argument" } int test2_18() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_2_18(ca); // { dg-error "lvalue" } sink_2_18(va); // { dg-error "lvalue" } sink_2_18(cva); // { dg-error "lvalue" } @@ -180,9 +180,9 @@ three sink_2_23(volatile A&); // { dg-message "note|argument" } int test2_23() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_2_23(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 186 } sink_2_23(cva); // { dg-error "no match" } @@ -200,9 +200,9 @@ four sink_2_24(const volatile A&); // { dg-message "note|argument" } int test2_24() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_2_24(v_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 206 } sink_2_24(cv_source()); // { dg-error "no match" } @@ -216,9 +216,9 @@ four sink_2_34(const volatile A&); // { dg-message "note|argument" } int test2_34() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_2_34(source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 222 } sink_2_34(c_source()); // { dg-error "no match" } @@ -236,9 +236,9 @@ five sink_2_25( A&&); // { dg-message "note|argument" } int test2_25() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_2_25(va); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 242 } sink_2_25(cva); // { dg-error "no match" } @@ -256,9 +256,9 @@ six sink_2_26(const A&&); // { dg-message "note|argument" } int test2_26() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_2_26(va); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 262 } sink_2_26(cva); // { dg-error "no match" } @@ -276,9 +276,9 @@ seven sink_2_27(volatile A&&); // { dg-message "note|argument" } int test2_27() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_2_27(va); // { dg-error "lvalue" } sink_2_27(cva); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 283 } @@ -293,9 +293,9 @@ eight sink_2_28(const volatile A&&); // { dg-error "argument" } int test2_28() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_2_28(va); // { dg-error "lvalue" } sink_2_28(cva); // { dg-error "lvalue" } } @@ -306,9 +306,9 @@ five sink_2_35( A&&); // { dg-message "note|argument" } int test2_35() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_2_35(ca); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 312 } sink_2_35(cva); // { dg-error "no match" } @@ -328,9 +328,9 @@ six sink_2_36(const A&&); // { dg-message "note|argument" } int test2_36() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_2_36(ca); // { dg-error "lvalue" } sink_2_36(cva); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 335 } @@ -347,9 +347,9 @@ seven sink_2_37(volatile A&&); // { dg-message "note|argument" } int test2_37() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_2_37(ca); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 353 } sink_2_37(cva); // { dg-error "no match" } @@ -367,9 +367,9 @@ eight sink_2_38(const volatile A&&); // { dg-error "argument" } int test2_38() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_2_38(ca); // { dg-error "lvalue" } sink_2_38(cva); // { dg-error "lvalue" } } @@ -380,9 +380,9 @@ five sink_2_45( A&&); // { dg-message "note|argument" } int test2_45() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_2_45(c_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 386 } sink_2_45(v_source()); // { dg-error "no match" } @@ -398,9 +398,9 @@ six sink_2_46(const A&&); // { dg-message "note|argument" } int test2_46() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_2_46(v_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 404 } sink_2_46(cv_source()); // { dg-error "no match" } @@ -414,9 +414,9 @@ seven sink_2_47(volatile A&&); // { dg-message "note|argument" } int test2_47() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_2_47(c_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 420 } sink_2_47(cv_source()); // { dg-error "no match" } @@ -430,9 +430,9 @@ six sink_2_56(const A&&); // { dg-message "note|argument" } int test2_56() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_2_56(a); // { dg-error "lvalue" } sink_2_56(ca); // { dg-error "lvalue" } sink_2_56(va); // { dg-error "no match" } @@ -452,9 +452,9 @@ seven sink_2_57(volatile A&&); // { dg-message "note|argument" } int test2_57() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_2_57(a); // { dg-error "lvalue" } sink_2_57(va); // { dg-error "lvalue" } sink_2_57(ca); // { dg-error "no match" } @@ -474,9 +474,9 @@ eight sink_2_58(const volatile A&&); // { dg-error "argument" } int test2_58() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_2_58(a); // { dg-error "lvalue" } sink_2_58(ca); // { dg-error "lvalue" } sink_2_58(va); // { dg-error "lvalue" } @@ -489,9 +489,9 @@ seven sink_2_67(volatile A&&); // { dg-message "note|argument" } int test2_67() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_2_67(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 495 } sink_2_67(ca); // { dg-error "lvalue" } @@ -511,9 +511,9 @@ eight sink_2_68(const volatile A&&); // { dg-error "argument" } int test2_68() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_2_68(a); // { dg-error "lvalue" } sink_2_68(ca); // { dg-error "lvalue" } sink_2_68(va); // { dg-error "lvalue" } @@ -526,9 +526,9 @@ eight sink_2_78(const volatile A&&); // { dg-error "argument" } int test2_78() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_2_78(a); // { dg-error "lvalue" } sink_2_78(ca); // { dg-error "lvalue" } sink_2_78(va); // { dg-error "lvalue" } diff --git a/gcc/testsuite/g++.dg/cpp0x/rv3n.C b/gcc/testsuite/g++.dg/cpp0x/rv3n.C index 637716f9b4..14b810ae68 100644 --- a/gcc/testsuite/g++.dg/cpp0x/rv3n.C +++ b/gcc/testsuite/g++.dg/cpp0x/rv3n.C @@ -20,7 +20,7 @@ struct eight {char x[8];}; struct A { A(); - A(const volatile A&&); // { dg-error "argument 1" } + A(const volatile A&&); }; A source(); @@ -37,9 +37,9 @@ three sink_3_123(volatile A&); // { dg-message "three sink_3_123|no known int test3_123() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_123(cva); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 43 } sink_3_123(v_source()); // { dg-error "no match" } @@ -60,9 +60,9 @@ four sink_3_124(const volatile A&); // { dg-message "four sink_3_124|no known int test3_124() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_124(v_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 66 } sink_3_124(cv_source()); // { dg-error "no match" } @@ -73,9 +73,9 @@ int test3_124() int test3_125() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_125(va); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 79 } sink_3_125(cva); // { dg-error "no match" } @@ -94,9 +94,9 @@ six sink_3_126(const A&&); // { dg-message "six sink_3_126|no known int test3_126() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_126(va); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 100 } sink_3_126(cva); // { dg-error "no match" } @@ -115,9 +115,9 @@ seven sink_3_127(volatile A&&); // { dg-message "seven sink_3_127|no know int test3_127() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_127(va); // { dg-error "lvalue" } sink_3_127(cva); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 122 } @@ -133,9 +133,9 @@ eight sink_3_128(const volatile A&&); // { dg-message "" } int test3_128() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_128(va); // { dg-error "lvalue" } sink_3_128(cva); // { dg-error "lvalue" } @@ -148,9 +148,9 @@ four sink_3_134(const volatile A&); // { dg-message "four sink_3_134|no known int test3_134() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_134(source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 154 } sink_3_134(c_source()); // { dg-error "no match" } @@ -169,9 +169,9 @@ five sink_3_135( A&&); // { dg-message "five sink_3_135|no known int test3_135() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_135(ca); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 175 } sink_3_135(cva); // { dg-error "no match" } @@ -192,9 +192,9 @@ six sink_3_136(const A&&); // { dg-message "" } int test3_136() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_136(ca); // { dg-error "lvalue" } sink_3_136(cva); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 199 } @@ -212,9 +212,9 @@ seven sink_3_137(volatile A&&); // { dg-message "note" } int test3_137() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_137(ca); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 218 } sink_3_137(cva); // { dg-error "no match" } @@ -233,9 +233,9 @@ eight sink_3_138(const volatile A&&); // { dg-message "" } int test3_138() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_138(ca); // { dg-error "lvalue" } sink_3_138(cva); // { dg-error "lvalue" } return 0; @@ -248,9 +248,9 @@ five sink_3_145( A&&); // { dg-message "note" } int test3_145() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_145(c_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 254 } sink_3_145(v_source()); // { dg-error "no match" } @@ -267,9 +267,9 @@ six sink_3_146(const A&&); // { dg-message "note" } int test3_146() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_146(v_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 273 } sink_3_146(cv_source()); // { dg-error "no match" } @@ -284,9 +284,9 @@ seven sink_3_147(volatile A&&); // { dg-message "note" } int test3_147() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_147(c_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 290 } sink_3_147(cv_source()); // { dg-error "no match" } @@ -301,9 +301,9 @@ six sink_3_156(const A&&); // { dg-message "" } int test3_156() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_156(ca); // { dg-error "lvalue" } sink_3_156(va); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 308 } @@ -323,9 +323,9 @@ seven sink_3_157(volatile A&&); // { dg-message "" } int test3_157() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_157(ca); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 329 } sink_3_157(va); // { dg-error "lvalue" } @@ -345,9 +345,9 @@ eight sink_3_158(const volatile A&&); // { dg-message "" } int test3_158() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_158(ca); // { dg-error "lvalue" } sink_3_158(va); // { dg-error "lvalue" } sink_3_158(cva); // { dg-error "lvalue" } @@ -361,9 +361,9 @@ seven sink_3_167(volatile A&&); // { dg-message "" } int test3_167() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_167(ca); // { dg-error "lvalue" } sink_3_167(va); // { dg-error "lvalue" } sink_3_167(cva); // { dg-error "no match" } @@ -382,9 +382,9 @@ eight sink_3_168(const volatile A&&); // { dg-message "" } int test3_168() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_168(ca); // { dg-error "lvalue" } sink_3_168(va); // { dg-error "lvalue" } sink_3_168(cva); // { dg-error "lvalue" } @@ -398,9 +398,9 @@ eight sink_3_178(const volatile A&&); // { dg-message "" } int test3_178() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_178(ca); // { dg-error "lvalue" } sink_3_178(va); // { dg-error "lvalue" } sink_3_178(cva); // { dg-error "lvalue" } @@ -414,9 +414,9 @@ four sink_3_234(const volatile A&); // { dg-message "note" } int test3_234() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_234(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 420 } sink_3_234(v_source()); // { dg-error "no match" } @@ -433,9 +433,9 @@ five sink_3_235( A&&); // { dg-message "note" } int test3_235() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_235(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 439 } sink_3_235(cva); // { dg-error "no match" } @@ -454,9 +454,9 @@ six sink_3_236(const A&&); // { dg-message "note" } int test3_236() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_236(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 460 } sink_3_236(cva); // { dg-error "no match" } @@ -475,9 +475,9 @@ seven sink_3_237(volatile A&&); // { dg-message "note" } int test3_237() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_237(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 481 } sink_3_237(cva); // { dg-error "no match" } @@ -494,9 +494,9 @@ eight sink_3_238(const volatile A&&); // { dg-message "eight sink_3_238|no know int test3_238() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_238(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 500 } sink_3_238(cva); // { dg-error "lvalue" } @@ -510,9 +510,9 @@ five sink_3_245( A&&); // { dg-message "five sink_3_245|no known int test3_245() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_245(v_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 516 } sink_3_245(cv_source()); // { dg-error "no match" } @@ -527,9 +527,9 @@ six sink_3_246(const A&&); // { dg-message "six sink_3_246|no known int test3_246() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_246(v_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 533 } sink_3_246(cv_source()); // { dg-error "no match" } @@ -544,9 +544,9 @@ seven sink_3_247(volatile A&&); // { dg-message "seven sink_3_247|no know int test3_247() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_247(cv_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 550 } return 0; @@ -559,9 +559,9 @@ six sink_3_256(const A&&); // { dg-message "six sink_3_256|no known int test3_256() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_256(va); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 565 } sink_3_256(cva); // { dg-error "no match" } @@ -580,9 +580,9 @@ seven sink_3_257(volatile A&&); // { dg-message "seven sink_3_257|no know int test3_257() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_257(va); // { dg-error "lvalue" } sink_3_257(cva); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 587 } @@ -598,9 +598,9 @@ eight sink_3_258(const volatile A&&); // { dg-message "" } int test3_258() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_258(va); // { dg-error "lvalue" } sink_3_258(cva); // { dg-error "lvalue" } return 0; @@ -613,9 +613,9 @@ seven sink_3_267(volatile A&&); // { dg-message "seven sink_3_267|no know int test3_267() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_267(va); // { dg-error "lvalue" } sink_3_267(cva); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 620 } @@ -633,9 +633,9 @@ eight sink_3_268(const volatile A&&); // { dg-message "" } int test3_268() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_268(va); // { dg-error "lvalue" } sink_3_268(cva); // { dg-error "lvalue" } return 0; @@ -648,9 +648,9 @@ eight sink_3_278(const volatile A&&); // { dg-message "" } int test3_278() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_278(va); // { dg-error "lvalue" } sink_3_278(cva); // { dg-error "lvalue" } return 0; @@ -663,9 +663,9 @@ five sink_3_345( A&&); // { dg-message "five sink_3_345|no known int test3_345() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_345(c_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 669 } sink_3_345(v_source()); // { dg-error "no match" } @@ -682,9 +682,9 @@ six sink_3_346(const A&&); // { dg-message "six sink_3_346|no known int test3_346() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_346(v_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 688 } sink_3_346(cv_source()); // { dg-error "no match" } @@ -699,9 +699,9 @@ seven sink_3_347(volatile A&&); // { dg-message "seven sink_3_347|no know int test3_347() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_347(c_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 705 } sink_3_347(cv_source()); // { dg-error "no match" } @@ -716,9 +716,9 @@ six sink_3_356(const A&&); // { dg-message "six sink_3_356|no known int test3_356() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_356(ca); // { dg-error "lvalue" } sink_3_356(cva); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 723 } @@ -736,9 +736,9 @@ seven sink_3_357(volatile A&&); // { dg-message "seven sink_3_357|no know int test3_357() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_357(ca); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 742 } sink_3_357(cva); // { dg-error "no match" } @@ -757,9 +757,9 @@ eight sink_3_358(const volatile A&&); // { dg-message "" } int test3_358() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_358(ca); // { dg-error "lvalue" } sink_3_358(cva); // { dg-error "lvalue" } return 0; @@ -772,9 +772,9 @@ seven sink_3_367(volatile A&&); // { dg-message "seven sink_3_367|no know int test3_367() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_367(ca); // { dg-error "lvalue" } sink_3_367(cva); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 779 } @@ -792,9 +792,9 @@ eight sink_3_368(const volatile A&&); // { dg-message "" } int test3_368() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_368(ca); // { dg-error "lvalue" } sink_3_368(cva); // { dg-error "lvalue" } return 0; @@ -807,9 +807,9 @@ eight sink_3_378(const volatile A&&); // { dg-message "" } int test3_378() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_378(ca); // { dg-error "lvalue" } sink_3_378(cva); // { dg-error "lvalue" } return 0; @@ -822,9 +822,9 @@ six sink_3_456(const A&&); // { dg-message "note" } int test3_456() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_456(v_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 828 } sink_3_456(cv_source()); // { dg-error "no match" } @@ -839,9 +839,9 @@ seven sink_3_457(volatile A&&); // { dg-message "note" } int test3_457() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_457(c_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 845 } sink_3_457(cv_source()); // { dg-error "no match" } @@ -856,9 +856,9 @@ seven sink_3_467(volatile A&&); // { dg-message "note" } int test3_467() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_467(source()); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 862 } sink_3_467(cv_source()); // { dg-error "no match" } @@ -873,9 +873,9 @@ seven sink_3_567(volatile A&&); // { dg-message "seven sink_3_567|no know int test3_567() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_567(a); // { dg-error "lvalue" } sink_3_567(ca); // { dg-error "lvalue" } sink_3_567(va); // { dg-error "lvalue" } @@ -893,9 +893,9 @@ eight sink_3_568(const volatile A&&); // { dg-message "" } int test3_568() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_568(a); // { dg-error "lvalue" } sink_3_568(ca); // { dg-error "lvalue" } sink_3_568(va); // { dg-error "lvalue" } @@ -910,9 +910,9 @@ eight sink_3_578(const volatile A&&); // { dg-message "" } int test3_578() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_578(a); // { dg-error "lvalue" } sink_3_578(ca); // { dg-error "lvalue" } sink_3_578(va); // { dg-error "lvalue" } @@ -927,9 +927,9 @@ eight sink_3_678(const volatile A&&); // { dg-message "eight sink_3_678|no know int test3_678() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_3_678(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 933 } sink_3_678(ca); // { dg-error "lvalue" } diff --git a/gcc/testsuite/g++.dg/cpp0x/rv4n.C b/gcc/testsuite/g++.dg/cpp0x/rv4n.C index daff307985..076e9a0488 100644 --- a/gcc/testsuite/g++.dg/cpp0x/rv4n.C +++ b/gcc/testsuite/g++.dg/cpp0x/rv4n.C @@ -20,7 +20,7 @@ struct eight {char x[8];}; struct A { A(); - A(const volatile A&&); // { dg-error "argument 1" } + A(const volatile A&&); }; A source(); @@ -38,9 +38,9 @@ four sink_4_1234(const volatile A&); // { dg-message "note" } int test4_1234() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1234(v_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 44 } sink_4_1234(cv_source()); // { dg-error "no match" } @@ -56,9 +56,9 @@ five sink_4_1235( A&&); // { dg-message "note" } int test4_1235() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1235(cva); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 62 } sink_4_1235(v_source()); // { dg-error "no match" } @@ -76,9 +76,9 @@ six sink_4_1236(const A&&); // { dg-message "note" } int test4_1236() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1236(cva); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 82 } sink_4_1236(v_source()); // { dg-error "no match" } @@ -96,9 +96,9 @@ seven sink_4_1237(volatile A&&); // { dg-message "note" } int test4_1237() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1237(cva); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 102 } sink_4_1237(cv_source()); // { dg-error "no match" } @@ -114,9 +114,9 @@ eight sink_4_1238(const volatile A&&); // { dg-message "" } int test4_1238() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1238(cva); // { dg-error "lvalue" } return 0; } @@ -129,9 +129,9 @@ five sink_4_1245( A&&); // { dg-message "note" } int test4_1245() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1245(v_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 135 } sink_4_1245(cv_source()); // { dg-error "no match" } @@ -147,9 +147,9 @@ six sink_4_1246(const A&&); // { dg-message "note" } int test4_1246() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1246(v_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 153 } sink_4_1246(cv_source()); // { dg-error "no match" } @@ -165,9 +165,9 @@ seven sink_4_1247(volatile A&&); // { dg-message "note" } int test4_1247() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1247(cv_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 171 } return 0; @@ -181,9 +181,9 @@ six sink_4_1256(const A&&); // { dg-message "note" } int test4_1256() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1256(va); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 187 } sink_4_1256(cva); // { dg-error "no match" } @@ -203,9 +203,9 @@ seven sink_4_1257(volatile A&&); // { dg-message "" } int test4_1257() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1257(va); // { dg-error "lvalue" } sink_4_1257(cva); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 210 } @@ -222,9 +222,9 @@ eight sink_4_1258(const volatile A&&); // { dg-message "" } int test4_1258() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1258(va); // { dg-error "lvalue" } sink_4_1258(cva); // { dg-error "lvalue" } return 0; @@ -238,9 +238,9 @@ seven sink_4_1267(volatile A&&); // { dg-message "" } int test4_1267() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1267(va); // { dg-error "lvalue" } sink_4_1267(cva); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 245 } @@ -259,9 +259,9 @@ eight sink_4_1268(const volatile A&&); // { dg-message "" } int test4_1268() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1268(va); // { dg-error "lvalue" } sink_4_1268(cva); // { dg-error "lvalue" } return 0; @@ -275,9 +275,9 @@ eight sink_4_1278(const volatile A&&); // { dg-message "" } int test4_1278() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1278(va); // { dg-error "lvalue" } sink_4_1278(cva); // { dg-error "lvalue" } return 0; @@ -291,9 +291,9 @@ five sink_4_1345( A&&); // { dg-message "note" } int test4_1345() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1345(c_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 297 } sink_4_1345(v_source()); // { dg-error "no match" } @@ -311,9 +311,9 @@ six sink_4_1346(const A&&); // { dg-message "note" } int test4_1346() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1346(v_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 317 } sink_4_1346(cv_source()); // { dg-error "no match" } @@ -329,9 +329,9 @@ seven sink_4_1347(volatile A&&); // { dg-message "note" } int test4_1347() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1347(c_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 335 } sink_4_1347(cv_source()); // { dg-error "no match" } @@ -347,9 +347,9 @@ six sink_4_1356(const A&&); // { dg-message "" } int test4_1356() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1356(ca); // { dg-error "lvalue" } sink_4_1356(cva); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 354 } @@ -368,9 +368,9 @@ seven sink_4_1357(volatile A&&); // { dg-message "note" } int test4_1357() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1357(ca); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 374 } sink_4_1357(cva); // { dg-error "no match" } @@ -390,9 +390,9 @@ eight sink_4_1358(const volatile A&&); // { dg-message "" } int test4_1358() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1358(ca); // { dg-error "lvalue" } sink_4_1358(cva); // { dg-error "lvalue" } return 0; @@ -406,9 +406,9 @@ seven sink_4_1367(volatile A&&); // { dg-message "note" } int test4_1367() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1367(ca); // { dg-error "lvalue" } sink_4_1367(cva); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 413 } @@ -427,9 +427,9 @@ eight sink_4_1368(const volatile A&&); // { dg-message "" } int test4_1368() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1368(ca); // { dg-error "lvalue" } sink_4_1368(cva); // { dg-error "lvalue" } return 0; @@ -443,9 +443,9 @@ eight sink_4_1378(const volatile A&&); // { dg-message "" } int test4_1378() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1378(ca); // { dg-error "lvalue" } sink_4_1378(cva); // { dg-error "lvalue" } return 0; @@ -459,9 +459,9 @@ six sink_4_1456(const A&&); // { dg-message "note" } int test4_1456() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1456(v_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 465 } sink_4_1456(cv_source()); // { dg-error "no match" } @@ -477,9 +477,9 @@ seven sink_4_1457(volatile A&&); // { dg-message "note" } int test4_1457() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1457(c_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 483 } sink_4_1457(cv_source()); // { dg-error "no match" } @@ -495,9 +495,9 @@ seven sink_4_1467(volatile A&&); // { dg-message "note" } int test4_1467() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1467(source()); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 501 } sink_4_1467(cv_source()); // { dg-error "no match" } @@ -513,9 +513,9 @@ seven sink_4_1567(volatile A&&); // { dg-message "" } int test4_1567() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1567(ca); // { dg-error "lvalue" } sink_4_1567(va); // { dg-error "lvalue" } sink_4_1567(cva); // { dg-error "no match" } @@ -533,9 +533,9 @@ eight sink_4_1568(const volatile A&&); // { dg-message "" } int test4_1568() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1568(ca); // { dg-error "lvalue" } sink_4_1568(va); // { dg-error "lvalue" } sink_4_1568(cva); // { dg-error "lvalue" } @@ -550,9 +550,9 @@ eight sink_4_1578(const volatile A&&); // { dg-message "" } int test4_1578() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1578(ca); // { dg-error "lvalue" } sink_4_1578(va); // { dg-error "lvalue" } sink_4_1578(cva); // { dg-error "lvalue" } @@ -567,9 +567,9 @@ eight sink_4_1678(const volatile A&&); // { dg-message "" } int test4_1678() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_1678(ca); // { dg-error "lvalue" } sink_4_1678(va); // { dg-error "lvalue" } sink_4_1678(cva); // { dg-error "lvalue" } @@ -586,9 +586,9 @@ five sink_4_2345( A&&); // { dg-message "note" } int test4_2345() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_2345(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 592 } sink_4_2345(v_source()); // { dg-error "no match" } @@ -606,9 +606,9 @@ six sink_4_2346(const A&&); // { dg-message "note" } int test4_2346() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_2346(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 612 } sink_4_2346(v_source()); // { dg-error "no match" } @@ -626,9 +626,9 @@ seven sink_4_2347(volatile A&&); // { dg-message "note" } int test4_2347() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_2347(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 632 } sink_4_2347(cv_source()); // { dg-error "no match" } @@ -644,9 +644,9 @@ eight sink_4_2348(const volatile A&&); // { dg-message "note" } int test4_2348() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_2348(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 650 } return 0; @@ -660,9 +660,9 @@ six sink_4_2356(const A&&); // { dg-message "note" } int test4_2356() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_2356(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 666 } sink_4_2356(cva); // { dg-error "no match" } @@ -682,9 +682,9 @@ seven sink_4_2357(volatile A&&); // { dg-message "note" } int test4_2357() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_2357(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 688 } sink_4_2357(cva); // { dg-error "no match" } @@ -702,9 +702,9 @@ eight sink_4_2358(const volatile A&&); // { dg-message "" } int test4_2358() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_2358(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 708 } sink_4_2358(cva); // { dg-error "lvalue" } @@ -719,9 +719,9 @@ seven sink_4_2367(volatile A&&); // { dg-message "note" } int test4_2367() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_2367(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 725 } sink_4_2367(cva); // { dg-error "no match" } @@ -741,9 +741,9 @@ eight sink_4_2368(const volatile A&&); // { dg-message "" } int test4_2368() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_2368(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 747 } sink_4_2368(cva); // { dg-error "lvalue" } @@ -758,9 +758,9 @@ eight sink_4_2378(const volatile A&&); // { dg-message "" } int test4_2378() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_2378(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 764 } sink_4_2378(cva); // { dg-error "lvalue" } @@ -775,9 +775,9 @@ six sink_4_2456(const A&&); // { dg-message "note" } int test4_2456() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_2456(v_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 781 } sink_4_2456(cv_source()); // { dg-error "no match" } @@ -793,9 +793,9 @@ seven sink_4_2457(volatile A&&); // { dg-message "note" } int test4_2457() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_2457(cv_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 799 } return 0; @@ -809,9 +809,9 @@ seven sink_4_2467(volatile A&&); // { dg-message "note" } int test4_2467() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_2467(source()); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 815 } sink_4_2467(cv_source()); // { dg-error "no match" } @@ -827,9 +827,9 @@ seven sink_4_2567(volatile A&&); // { dg-message "" } int test4_2567() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_2567(va); // { dg-error "lvalue" } sink_4_2567(cva); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 834 } @@ -846,9 +846,9 @@ eight sink_4_2568(const volatile A&&); // { dg-message "" } int test4_2568() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_2568(va); // { dg-error "lvalue" } sink_4_2568(cva); // { dg-error "lvalue" } return 0; @@ -862,9 +862,9 @@ eight sink_4_2578(const volatile A&&); // { dg-message "" } int test4_2578() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_2578(va); // { dg-error "lvalue" } sink_4_2578(cva); // { dg-error "lvalue" } return 0; @@ -878,9 +878,9 @@ eight sink_4_2678(const volatile A&&); // { dg-message "" } int test4_2678() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_2678(va); // { dg-error "lvalue" } sink_4_2678(cva); // { dg-error "lvalue" } sink_4_2678(source()); // { dg-error "ambiguous" } @@ -896,9 +896,9 @@ six sink_4_3456(const A&&); // { dg-message "note" } int test4_3456() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_3456(v_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 902 } sink_4_3456(cv_source()); // { dg-error "no match" } @@ -914,9 +914,9 @@ seven sink_4_3457(volatile A&&); // { dg-message "note" } int test4_3457() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_3457(c_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 920 } sink_4_3457(cv_source()); // { dg-error "no match" } @@ -932,9 +932,9 @@ seven sink_4_3467(volatile A&&); // { dg-message "note" } int test4_3467() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_3467(source()); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 938 } sink_4_3467(cv_source()); // { dg-error "no match" } @@ -950,9 +950,9 @@ seven sink_4_3567(volatile A&&); // { dg-message "note" } int test4_3567() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_3567(ca); // { dg-error "lvalue" } sink_4_3567(cva); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 957 } @@ -969,9 +969,9 @@ eight sink_4_3568(const volatile A&&); // { dg-message "" } int test4_3568() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_3568(ca); // { dg-error "lvalue" } sink_4_3568(cva); // { dg-error "lvalue" } return 0; @@ -985,9 +985,9 @@ eight sink_4_3578(const volatile A&&); // { dg-message "" } int test4_3578() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_3578(ca); // { dg-error "lvalue" } sink_4_3578(cva); // { dg-error "lvalue" } return 0; @@ -1001,9 +1001,9 @@ eight sink_4_3678(const volatile A&&); // { dg-message "" } int test4_3678() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_3678(ca); // { dg-error "lvalue" } sink_4_3678(cva); // { dg-error "lvalue" } sink_4_3678(source()); // { dg-error "ambiguous" } @@ -1019,9 +1019,9 @@ seven sink_4_4567(volatile A&&); // { dg-message "note" } int test4_4567() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_4567(cv_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 1025 } return 0; @@ -1035,9 +1035,9 @@ eight sink_4_4678(const volatile A&&); // { dg-message "note" } int test4_4678() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_4678(source()); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 1041 } return 0; @@ -1051,9 +1051,9 @@ eight sink_4_5678(const volatile A&&); // { dg-message "" } int test4_5678() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_4_5678(a); // { dg-error "lvalue" } sink_4_5678(ca); // { dg-error "lvalue" } sink_4_5678(va); // { dg-error "lvalue" } diff --git a/gcc/testsuite/g++.dg/cpp0x/rv5n.C b/gcc/testsuite/g++.dg/cpp0x/rv5n.C index 660a68986a..d9b8cd2398 100644 --- a/gcc/testsuite/g++.dg/cpp0x/rv5n.C +++ b/gcc/testsuite/g++.dg/cpp0x/rv5n.C @@ -20,7 +20,7 @@ struct eight {char x[8];}; struct A { A(); - A(const volatile A&&); // { dg-error "argument 1" } + A(const volatile A&&); }; A source(); @@ -39,9 +39,9 @@ five sink_5_12345( A&&); // { dg-message "note" } int test5_12345() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_12345(v_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 45 } sink_5_12345(cv_source()); // { dg-error "no match" } @@ -58,9 +58,9 @@ six sink_5_12346(const A&&); // { dg-message "note" } int test5_12346() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_12346(v_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 64 } sink_5_12346(cv_source()); // { dg-error "no match" } @@ -77,9 +77,9 @@ seven sink_5_12347(volatile A&&); // { dg-message "note" } int test5_12347() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_12347(cv_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 83 } return 0; @@ -94,9 +94,9 @@ six sink_5_12356(const A&&); // { dg-message "note" } int test5_12356() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_12356(cva); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 100 } sink_5_12356(v_source()); // { dg-error "no match" } @@ -115,9 +115,9 @@ seven sink_5_12357(volatile A&&); // { dg-message "note" } int test5_12357() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_12357(cva); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 121 } sink_5_12357(cv_source()); // { dg-error "no match" } @@ -134,9 +134,9 @@ eight sink_5_12358(const volatile A&&); // { dg-message "" } int test5_12358() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_12358(cva); // { dg-error "lvalue" } return 0; } @@ -150,9 +150,9 @@ seven sink_5_12367(volatile A&&); // { dg-message "note" } int test5_12367() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_12367(cva); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 156 } sink_5_12367(source()); // { dg-error "ambiguous" } @@ -171,9 +171,9 @@ eight sink_5_12368(const volatile A&&); // { dg-message "" } int test5_12368() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_12368(cva); // { dg-error "lvalue" } return 0; } @@ -187,9 +187,9 @@ eight sink_5_12378(const volatile A&&); // { dg-message "" } int test5_12378() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_12378(cva); // { dg-error "lvalue" } return 0; } @@ -203,9 +203,9 @@ six sink_5_12456(const A&&); // { dg-message "note" } int test5_12456() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_12456(v_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 209 } sink_5_12456(cv_source()); // { dg-error "no match" } @@ -222,9 +222,9 @@ seven sink_5_12457(volatile A&&); // { dg-message "note" } int test5_12457() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_12457(cv_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 228 } return 0; @@ -239,9 +239,9 @@ seven sink_5_12467(volatile A&&); // { dg-message "note" } int test5_12467() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_12467(source()); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 245 } sink_5_12467(cv_source()); // { dg-error "no match" } @@ -258,9 +258,9 @@ seven sink_5_12567(volatile A&&); // { dg-message "" } int test5_12567() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_12567(va); // { dg-error "lvalue" } sink_5_12567(cva); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 265 } @@ -278,9 +278,9 @@ eight sink_5_12568(const volatile A&&); // { dg-message "" } int test5_12568() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_12568(va); // { dg-error "lvalue" } sink_5_12568(cva); // { dg-error "lvalue" } return 0; @@ -295,9 +295,9 @@ eight sink_5_12578(const volatile A&&); // { dg-message "" } int test5_12578() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_12578(va); // { dg-error "lvalue" } sink_5_12578(cva); // { dg-error "lvalue" } return 0; @@ -312,9 +312,9 @@ eight sink_5_12678(const volatile A&&); // { dg-message "" } int test5_12678() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_12678(va); // { dg-error "lvalue" } sink_5_12678(cva); // { dg-error "lvalue" } sink_5_12678(source()); // { dg-error "ambiguous" } @@ -331,9 +331,9 @@ six sink_5_13456(const A&&); // { dg-message "note" } int test5_13456() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_13456(v_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 337 } sink_5_13456(cv_source()); // { dg-error "no match" } @@ -350,9 +350,9 @@ seven sink_5_13457(volatile A&&); // { dg-message "note" } int test5_13457() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_13457(c_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 356 } sink_5_13457(cv_source()); // { dg-error "no match" } @@ -369,9 +369,9 @@ seven sink_5_13467(volatile A&&); // { dg-message "note" } int test5_13467() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_13467(source()); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 375 } sink_5_13467(cv_source()); // { dg-error "no match" } @@ -388,9 +388,9 @@ seven sink_5_13567(volatile A&&); // { dg-message "note" } int test5_13567() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_13567(ca); // { dg-error "lvalue" } sink_5_13567(cva); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 395 } @@ -408,9 +408,9 @@ eight sink_5_13568(const volatile A&&); // { dg-message "" } int test5_13568() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_13568(ca); // { dg-error "lvalue" } sink_5_13568(cva); // { dg-error "lvalue" } return 0; @@ -425,9 +425,9 @@ eight sink_5_13578(const volatile A&&); // { dg-message "" } int test5_13578() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_13578(ca); // { dg-error "lvalue" } sink_5_13578(cva); // { dg-error "lvalue" } return 0; @@ -442,9 +442,9 @@ eight sink_5_13678(const volatile A&&); // { dg-message "" } int test5_13678() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_13678(ca); // { dg-error "lvalue" } sink_5_13678(cva); // { dg-error "lvalue" } sink_5_13678(source()); // { dg-error "ambiguous" } @@ -461,9 +461,9 @@ seven sink_5_14567(volatile A&&); // { dg-message "note" } int test5_14567() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_14567(cv_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 467 } return 0; @@ -478,9 +478,9 @@ eight sink_5_14678(const volatile A&&); // { dg-message "note" } int test5_14678() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_14678(source()); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 484 } return 0; @@ -495,9 +495,9 @@ eight sink_5_15678(const volatile A&&); // { dg-message "" } int test5_15678() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_15678(ca); // { dg-error "lvalue" } sink_5_15678(va); // { dg-error "lvalue" } sink_5_15678(cva); // { dg-error "lvalue" } @@ -513,9 +513,9 @@ six sink_5_23456(const A&&); // { dg-message "note" } int test5_23456() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_23456(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 519 } sink_5_23456(v_source()); // { dg-error "no match" } @@ -534,9 +534,9 @@ seven sink_5_23457(volatile A&&); // { dg-message "note" } int test5_23457() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_23457(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 540 } sink_5_23457(cv_source()); // { dg-error "no match" } @@ -553,9 +553,9 @@ eight sink_5_23458(const volatile A&&); // { dg-message "note" } int test5_23458() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_23458(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 559 } return 0; @@ -570,9 +570,9 @@ seven sink_5_23467(volatile A&&); // { dg-message "note" } int test5_23467() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_23467(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 576 } sink_5_23467(source()); // { dg-error "ambiguous" } @@ -591,9 +591,9 @@ eight sink_5_23468(const volatile A&&); // { dg-message "note" } int test5_23468() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_23468(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 597 } return 0; @@ -608,9 +608,9 @@ eight sink_5_23478(const volatile A&&); // { dg-message "note" } int test5_23478() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_23478(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 614 } return 0; @@ -625,9 +625,9 @@ seven sink_5_23567(volatile A&&); // { dg-message "note" } int test5_23567() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_23567(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 631 } sink_5_23567(cva); // { dg-error "no match" } @@ -646,9 +646,9 @@ eight sink_5_23568(const volatile A&&); // { dg-message "" } int test5_23568() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_23568(cva); // { dg-error "lvalue" } sink_5_23568(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 653 } @@ -664,9 +664,9 @@ eight sink_5_23578(const volatile A&&); // { dg-message "" } int test5_23578() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_23578(cva); // { dg-error "lvalue" } sink_5_23578(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 671 } @@ -682,9 +682,9 @@ eight sink_5_23678(const volatile A&&); // { dg-message "" } int test5_23678() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_23678(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 688 } sink_5_23678(cva); // { dg-error "lvalue" } @@ -702,9 +702,9 @@ seven sink_5_24567(volatile A&&); // { dg-message "note" } int test5_24567() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_24567(cv_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 708 } return 0; @@ -719,9 +719,9 @@ eight sink_5_24678(const volatile A&&); // { dg-message "note" } int test5_24678() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_24678(source()); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 725 } return 0; @@ -736,9 +736,9 @@ eight sink_5_25678(const volatile A&&); // { dg-message "" } int test5_25678() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_25678(va); // { dg-error "lvalue" } sink_5_25678(cva); // { dg-error "lvalue" } return 0; @@ -753,9 +753,9 @@ seven sink_5_34567(volatile A&&); // { dg-message "note" } int test5_34567() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_34567(cv_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 759 } return 0; @@ -770,9 +770,9 @@ eight sink_5_34678(const volatile A&&); // { dg-message "note" } int test5_34678() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_34678(source()); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 776 } return 0; @@ -787,9 +787,9 @@ eight sink_5_35678(const volatile A&&); // { dg-message "" } int test5_35678() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_5_35678(ca); // { dg-error "lvalue" } sink_5_35678(cva); // { dg-error "lvalue" } return 0; diff --git a/gcc/testsuite/g++.dg/cpp0x/rv6n.C b/gcc/testsuite/g++.dg/cpp0x/rv6n.C index d0fdbb7e50..fbc932de1e 100644 --- a/gcc/testsuite/g++.dg/cpp0x/rv6n.C +++ b/gcc/testsuite/g++.dg/cpp0x/rv6n.C @@ -20,7 +20,7 @@ struct eight {char x[8];}; struct A { A(); - A(const volatile A&&); // { dg-error "argument 1" } + A(const volatile A&&); }; A source(); @@ -40,9 +40,9 @@ six sink_6_123456(const A&&); // { dg-message "note" } int test6_123456() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_6_123456(v_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 46 } sink_6_123456(cv_source()); // { dg-error "no match" } @@ -60,9 +60,9 @@ seven sink_6_123457(volatile A&&); // { dg-message "note" } int test6_123457() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_6_123457(cv_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 66 } return 0; @@ -78,9 +78,9 @@ eight sink_6_235678(const volatile A&&); // { dg-message "" } int test6_235678() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_6_235678(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 84 } sink_6_235678(cva); // { dg-error "lvalue" } @@ -97,9 +97,9 @@ eight sink_6_234678(const volatile A&&); // { dg-message "note" } int test6_234678() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_6_234678(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 103 } sink_6_234678(source()); // { dg-error "ambiguous" } @@ -117,9 +117,9 @@ eight sink_6_234578(const volatile A&&); // { dg-message "note" } int test6_234578() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_6_234578(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 123 } return 0; @@ -135,9 +135,9 @@ eight sink_6_234568(const volatile A&&); // { dg-message "note" } int test6_234568() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_6_234568(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 141 } return 0; @@ -153,9 +153,9 @@ seven sink_6_234567(volatile A&&); // { dg-message "note" } int test6_234567() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_6_234567(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 159 } sink_6_234567(cv_source()); // { dg-error "no match" } @@ -173,9 +173,9 @@ eight sink_6_134678(const volatile A&&); // { dg-message "note" } int test6_134678() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_6_134678(source()); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 179 } return 0; @@ -191,9 +191,9 @@ eight sink_6_124678(const volatile A&&); // { dg-message "note" } int test6_124678() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_6_124678(source()); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 197 } return 0; @@ -209,9 +209,9 @@ eight sink_6_123678(const volatile A&&); // { dg-message "" } int test6_123678() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_6_123678(cva); // { dg-error "lvalue" } sink_6_123678(source()); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 216 } @@ -228,9 +228,9 @@ seven sink_6_123567(volatile A&&); // { dg-message "note" } int test6_123567() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_6_123567(cva); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 234 } sink_6_123567(cv_source()); // { dg-error "no match" } @@ -248,9 +248,9 @@ eight sink_6_123568(const volatile A&&); // { dg-message "" } int test6_123568() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_6_123568(cva); // { dg-error "lvalue" } return 0; } @@ -265,9 +265,9 @@ eight sink_6_123578(const volatile A&&); // { dg-message "" } int test6_123578() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_6_123578(cva); // { dg-error "lvalue" } return 0; } @@ -282,9 +282,9 @@ seven sink_6_123467(volatile A&&); // { dg-message "note" } int test6_123467() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_6_123467(source()); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 288 } sink_6_123467(cv_source()); // { dg-error "no match" } @@ -302,9 +302,9 @@ seven sink_6_124567(volatile A&&); // { dg-message "note" } int test6_124567() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_6_124567(cv_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 308 } return 0; @@ -320,9 +320,9 @@ eight sink_6_125678(const volatile A&&); // { dg-message "" } int test6_125678() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_6_125678(va); // { dg-error "lvalue" } sink_6_125678(cva); // { dg-error "lvalue" } return 0; @@ -338,9 +338,9 @@ seven sink_6_134567(volatile A&&); // { dg-message "note" } int test6_134567() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_6_134567(cv_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 344 } return 0; @@ -356,9 +356,9 @@ eight sink_6_135678(const volatile A&&); // { dg-message "" } int test6_135678() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_6_135678(ca); // { dg-error "lvalue" } sink_6_135678(cva); // { dg-error "lvalue" } return 0; diff --git a/gcc/testsuite/g++.dg/cpp0x/rv7n.C b/gcc/testsuite/g++.dg/cpp0x/rv7n.C index 6071e05681..206cc79bb1 100644 --- a/gcc/testsuite/g++.dg/cpp0x/rv7n.C +++ b/gcc/testsuite/g++.dg/cpp0x/rv7n.C @@ -20,7 +20,7 @@ struct eight {char x[8];}; struct A { A(); - A(const volatile A&&); // { dg-error "argument 1" } + A(const volatile A&&); }; A source(); @@ -41,9 +41,9 @@ seven sink_7_1234567(volatile A&&); // { dg-message "note" } int test7_1234567() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_7_1234567(cv_source()); // { dg-error "no match" } // { dg-message "candidate" "candidate note" { target *-*-* } 47 } return 0; @@ -60,9 +60,9 @@ eight sink_7_1235678(const volatile A&&); // { dg-message "" } int test7_1235678() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_7_1235678(cva); // { dg-error "lvalue" } return 0; } @@ -78,9 +78,9 @@ eight sink_7_2345678(const volatile A&&); // { dg-message "note" } int test7_2345678() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_7_2345678(a); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 84 } return 0; @@ -97,9 +97,9 @@ eight sink_7_1234678(const volatile A&&); // { dg-message "note" } int test7_1234678() { A a; - const A ca = a; // { dg-error "lvalue" } + const A ca = a; // { dg-error "deleted" } volatile A va; - const volatile A cva = a; // { dg-error "lvalue" } + const volatile A cva = a; // { dg-error "deleted" } sink_7_1234678(source()); // { dg-error "ambiguous" } // { dg-message "candidate" "candidate note" { target *-*-* } 103 } return 0; diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae10.C b/gcc/testsuite/g++.dg/cpp0x/sfinae10.C index 72dbce080c..ede8b70424 100644 --- a/gcc/testsuite/g++.dg/cpp0x/sfinae10.C +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae10.C @@ -10,7 +10,9 @@ decltype(T(std::declval<Args>()...), char()) f(int); template<class, class...> char (&f(...))[2]; +struct A { virtual ~A() = 0; }; struct B {}; +static_assert(sizeof(f<A, int, int>(0)) != 1, "Error"); // a static_assert(sizeof(f<B, void, int>(0)) != 1, "Error"); // b static_assert(sizeof(f<void, int, int>(0)) != 1, "Error"); // c diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae11.C b/gcc/testsuite/g++.dg/cpp0x/sfinae11.C index a3ffc34f9a..2e8408d8f4 100644 --- a/gcc/testsuite/g++.dg/cpp0x/sfinae11.C +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae11.C @@ -6,13 +6,14 @@ template<class T> T&& declval() noexcept; template< class T > -inline void f1( T& x ) noexcept( noexcept( declval<T&>().foo() ) ) +inline void f1( T& x ) noexcept( noexcept( declval<T&>().foo() ) ) // { dg-error "Z" } { x.foo(); } template< class T, - bool Noexcept = noexcept( declval<T&>().foo() ) + bool Noexcept = noexcept( declval<T&>().foo() ) // { dg-error "no member|not convert" } + > inline void f2( T& x ) noexcept( Noexcept ) { @@ -21,7 +22,7 @@ inline void f2( T& x ) noexcept( Noexcept ) // a common and trivial mistake template< class T > -inline void f3( T& x ) noexcept( declval<T&>().foo() ) +inline void f3( T& x ) noexcept( declval<T&>().foo() ) // { dg-error "Z" } { x.foo(); } @@ -50,7 +51,7 @@ int main() static_assert( noexcept( f2(y) ), "OK." ); // static_assert( noexcept( f3(y) ), "shall be ill-formed(OK)." ); - static_assert( noexcept( f1(z) ), "shall be ill-formed." ); // { dg-error "no match" } + noexcept( f1(z) ); // { dg-message "required" } static_assert( noexcept( f2(z) ), "shall be ill-formed." ); // { dg-error "no match" } - static_assert( !noexcept( f3(z) ), "shall be ill-formed." ); // { dg-error "no match" } + noexcept( f3(z) ); // { dg-message "required" } } diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae12.C b/gcc/testsuite/g++.dg/cpp0x/sfinae12.C new file mode 100644 index 0000000000..114f1b42da --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae12.C @@ -0,0 +1,18 @@ +// PR c++/48535 +// { dg-options -std=c++0x } + +template<class T, + class = decltype(T{}) +> +char f(int); + +template<class> +char (&f(...))[2]; + +struct A { virtual ~A() = 0; }; + +static_assert(sizeof(f<A>(0)) != 1, "Error"); // (a) +static_assert(sizeof(f<void()>(0)) != 1, "Error"); // (b) +static_assert(sizeof(f<int&>(0)) != 1, "Error"); // (d) +static_assert(sizeof(f<const int&>(0)) == 1, "Error"); // (e) +static_assert(sizeof(f<int[]>(0)) != 1, "Error"); // (f) diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae13.C b/gcc/testsuite/g++.dg/cpp0x/sfinae13.C new file mode 100644 index 0000000000..465df2d8b8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae13.C @@ -0,0 +1,20 @@ +// PR c++/48581 +// { dg-options -std=c++0x } + +template<class T> +T&& create(); + +template<class T, + class = decltype(foo(create<T>())) +> +auto f(int) -> char; + +template<class> +auto f(...) -> char (&)[2]; + +struct S {}; +void foo(S); + +static_assert(sizeof(f<S>(0)) == 1, "Error"); // (#) + +int main() {} diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae14.C b/gcc/testsuite/g++.dg/cpp0x/sfinae14.C new file mode 100644 index 0000000000..305f96eddc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae14.C @@ -0,0 +1,27 @@ +// PR c++/48557 +// { dg-options -std=c++0x } + +template<class T> +struct add_rval_ref +{ + typedef T&& type; +}; + +template<> +struct add_rval_ref<void> +{ + typedef void type; +}; + +template<class T> +typename add_rval_ref<T>::type create(); + +template<class T, class U, + class = decltype(create<T>() + create<U>()) +> +char f(int); + +template<class, class> +char (&f(...))[2]; + +static_assert(sizeof(f<void, int>(0)) != 1, "Error"); // (a) diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae15.C b/gcc/testsuite/g++.dg/cpp0x/sfinae15.C new file mode 100644 index 0000000000..595ca40b55 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae15.C @@ -0,0 +1,12 @@ +// PR c++/48531 +// { dg-options -std=c++0x } + +template<class T, + class = decltype(T()) +> +char f(int); + +template<class> +char (&f(...))[2]; + +static_assert(sizeof(f<int[]>(0)) != 1, "Error"); diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae16.C b/gcc/testsuite/g++.dg/cpp0x/sfinae16.C new file mode 100644 index 0000000000..6470567b7a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae16.C @@ -0,0 +1,17 @@ +// PR c++/48531 +// { dg-options -std=c++0x } + +template<class T, + class = decltype(T()) +> +char f(int); + +template<class> +double f(...); + +struct B2 { + B2(...); +}; + +#define SA(X) static_assert ((X), #X); +SA(sizeof(f<B2[2]>(0)) != 1); diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae17.C b/gcc/testsuite/g++.dg/cpp0x/sfinae17.C new file mode 100644 index 0000000000..dbbd9efe41 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae17.C @@ -0,0 +1,31 @@ +// PR c++/48530 +// { dg-options -std=c++0x } + +template<class T, + class = decltype(T{}) +> +char f(int); + +template<class> +char (&f(...))[2]; + +struct DelDtor { + ~DelDtor() = delete; +}; + +static_assert(sizeof(f<DelDtor[2]>(0)) != 1, "Error"); + +struct A +{ + static DelDtor *p; +}; + +template<class T, + class = decltype(delete T::p, (T*)0) +> +char g(int); + +template<class> +char (&g(...))[2]; + +static_assert(sizeof(g<DelDtor>(0)) != 1, "Error"); diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae18.C b/gcc/testsuite/g++.dg/cpp0x/sfinae18.C new file mode 100644 index 0000000000..bb54335e6c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae18.C @@ -0,0 +1,17 @@ +// PR c++/48530 +// { dg-options -std=c++0x } + +template<class T, + class = decltype(T()) +> +char f(int); + +template<class> +char (&f(...))[2]; + +struct DelDtor { + DelDtor() = default; + ~DelDtor() = delete; +}; + +static_assert(sizeof(f<DelDtor>(0)) != 1, "Error"); diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae19.C b/gcc/testsuite/g++.dg/cpp0x/sfinae19.C new file mode 100644 index 0000000000..be96983bf3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae19.C @@ -0,0 +1,13 @@ +// PR c++/48737 +// { dg-options "-std=c++0x" } + +template<class T> +T&& create(); + +template<class T, class... Args> +decltype(T{create<Args>()...}, char()) f(int); + +template<class, class...> +char (&f(...))[2]; + +static_assert(sizeof(f<int[1], int, int>(0)) != 1, "Error"); diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae20.C b/gcc/testsuite/g++.dg/cpp0x/sfinae20.C new file mode 100644 index 0000000000..486064c3af --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae20.C @@ -0,0 +1,23 @@ +// PR c++/48744 +// { dg-options "-std=c++0x" } + +template<class T> +struct add_rval_ref { + typedef T&& type; +}; + +template<> +struct add_rval_ref<void> { + typedef void type; +}; + +template<class T> +typename add_rval_ref<T>::type create(); + +template<class T, class Arg> +decltype(T{create<Arg>()}, char()) f(int); + +template<class, class> +char (&f(...))[2]; + +static_assert(sizeof(f<int, void>(0)) != 1, "Error"); diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae21.C b/gcc/testsuite/g++.dg/cpp0x/sfinae21.C new file mode 100644 index 0000000000..4fba6eb82a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae21.C @@ -0,0 +1,14 @@ +// PR c++/48735 +// { dg-options "-std=c++0x" } + +template<class T, + class = decltype(T{}) +> +char f(int); + +template<class> +char (&f(...))[2]; + +struct ND { ND() = delete; }; + +static_assert(sizeof(f<ND[1]>(0)) != 1, "Error"); diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae22.C b/gcc/testsuite/g++.dg/cpp0x/sfinae22.C index 2b9351a97f..1c3efd2e07 100644 --- a/gcc/testsuite/g++.dg/cpp0x/sfinae22.C +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae22.C @@ -20,4 +20,4 @@ decltype(T{create<Args>()...}, char()) f(int); template<class, class...> char (&f(...))[2]; -static_assert(sizeof(f<int, void>(0)) != 1, "Error"); // { dg-bogus "void value" "" { xfail *-*-* } } +static_assert(sizeof(f<int, void>(0)) != 1, "Error"); // # diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae24.C b/gcc/testsuite/g++.dg/cpp0x/sfinae24.C new file mode 100644 index 0000000000..3e1d2e725b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae24.C @@ -0,0 +1,29 @@ +// PR c++/49058 +// This error is not subject to SFINAE because it doesn't happen in the +// deduction context. +// { dg-options -std=c++0x } +// { dg-prune-output "note" } + +template<typename T> T val(); + +struct F1 +{ + void operator()(); +}; + +template<typename F> +struct Bind +{ + template<typename R + = decltype( val<F>()( ) )> + R f(); + + template<typename R + = decltype( val<const F>()( ) )> + R f() const; // { dg-error "no match" } +}; + +int main() +{ + Bind<F1> b; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae25.C b/gcc/testsuite/g++.dg/cpp0x/sfinae25.C new file mode 100644 index 0000000000..7bdc8f88e5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae25.C @@ -0,0 +1,10 @@ +// PR c++/49105 +// { dg-options -std=c++0x } + +template<class T, class = decltype(T{})> +char f(int); + +template<class T> +auto f(...) -> char(&)[2]; + +static_assert(sizeof(f<const int&&>(0)) == 1, "Error"); // # diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae26.C b/gcc/testsuite/g++.dg/cpp0x/sfinae26.C index 6a4f679ce9..374f9976b2 100644 --- a/gcc/testsuite/g++.dg/cpp0x/sfinae26.C +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae26.C @@ -30,11 +30,9 @@ struct is_same<T, T> { template<class... T> struct S { template<class... U, - typename enable_if<and_<is_same<T, U>...>::value>::type*& = enabler + typename enable_if<and_<is_same<T, U>...>::value>::type*& = enabler // { dg-error "no type" } > - S(U...){} // # + S(U...){} }; S<bool> s(0); // { dg-error "no match" } - -// { dg-prune-output "note" } diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae28.C b/gcc/testsuite/g++.dg/cpp0x/sfinae28.C new file mode 100644 index 0000000000..da64f413c7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae28.C @@ -0,0 +1,16 @@ +// PR c++/50324 +// { dg-options -std=c++0x } + +struct complete { }; +struct incomplete; + +template<class T> auto f(T *) -> decltype(T{}) *; +template<class T> char f(T); + +int main() +{ + complete *p = 0; + static_assert(sizeof(f(p)) == sizeof(void*), ""); + incomplete *q = 0; + static_assert(sizeof(f(q)) == 1u, ""); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae29.C b/gcc/testsuite/g++.dg/cpp0x/sfinae29.C new file mode 100644 index 0000000000..a2e10b41d3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae29.C @@ -0,0 +1,17 @@ +// PR c++/51047 +// { dg-options -std=c++0x } + +template<typename T> T &&declval(); +template<class T> decltype(declval<T>().x) f(T *); +template<class T> char f(T); +struct B1{ int x; }; +struct B2{ int x; }; +struct D : public B1, B2{}; +struct S { int x; }; +int main() +{ + S *p = nullptr; + static_assert(sizeof(f(p)) == sizeof(int), ""); + D *q = nullptr; + static_assert(sizeof(f(q)) == 1u, ""); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae30.C b/gcc/testsuite/g++.dg/cpp0x/sfinae30.C new file mode 100644 index 0000000000..6fcf5f7560 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae30.C @@ -0,0 +1,25 @@ +// { dg-do compile { target c++11 } } + +template <class... T> struct tuple; +template <class T> struct tuple<T> { T t; }; + +template <class T, class U> struct pair; +template<> struct pair<int,double> { }; + +template <class... Ts> +struct A +{ + template <class... Us, + class V = tuple<pair<Ts,Us>...> > + static void f(Us...) + { + V v; + } + template <class U> + static void f(bool); +}; + +int main() +{ + A<int,float>::f<double>(1.0); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae31.C b/gcc/testsuite/g++.dg/cpp0x/sfinae31.C new file mode 100644 index 0000000000..ea151fe649 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae31.C @@ -0,0 +1,13 @@ +// PR c++/51973 +// { dg-options -std=c++0x } + +template <class T> +void f(T t) { }; + +template <class T> decltype(f<T>(0)) g(); +template <class T> decltype(f<T*>(0)) g(); + +int main() +{ + g<void>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae8.C b/gcc/testsuite/g++.dg/cpp0x/sfinae8.C new file mode 100644 index 0000000000..7f3012f94d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae8.C @@ -0,0 +1,14 @@ +// PR c++/48449 +// { dg-options -std=c++0x } + +template<class T, class = decltype(T())> +char f(int); + +template<class> +char (&f(...))[2]; + +struct A { virtual ~A() = 0; }; + +static_assert(sizeof(f<int&>(0)) != 1, "Error"); +static_assert(sizeof(f<void()>(0)) != 1, "Error"); +static_assert(sizeof(f<A>(0)) != 1, "Error"); diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae9.C b/gcc/testsuite/g++.dg/cpp0x/sfinae9.C new file mode 100644 index 0000000000..6f1de21d51 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae9.C @@ -0,0 +1,24 @@ +// PR c++/48450 +// { dg-options -std=c++0x } + +namespace std { + template <class T> T&& declval(); +}; + +template<class To, class From, + class = decltype(static_cast<To>(std::declval<From>())) +> +char f(int); + +template<class, class> +char (&f(...))[2]; + +struct A { virtual ~A() = 0; }; +struct B {}; +struct D : B {}; + +static_assert(sizeof(f<A, int>(0)) != 1, "Error"); // a +static_assert(sizeof(f<int*, const void*>(0)) != 1, "Error"); // b +static_assert(sizeof(f<D*, const B*>(0)) != 1, "Error"); // c +static_assert(sizeof(f<int B::*, const int D::*>(0)) != 1, "Error"); // d +static_assert(sizeof(f<B, void>(0)) != 1, "Error"); // e diff --git a/gcc/testsuite/g++.dg/cpp0x/static_assert3.C b/gcc/testsuite/g++.dg/cpp0x/static_assert3.C index 1ff2ffc94f..0a4cbc98af 100644 --- a/gcc/testsuite/g++.dg/cpp0x/static_assert3.C +++ b/gcc/testsuite/g++.dg/cpp0x/static_assert3.C @@ -1,4 +1,4 @@ // { dg-options "-std=c++0x" } -static_assert(7 / 0, "X"); // { dg-error "non-constant condition" } -// { dg-warning "division by zero" "" { target *-*-* } 2 } -// { dg-error "7 / 0.. is not a constant expression" "" { target *-*-* } 2 } +static_assert(7 / 0, "X"); // { dg-error "non-constant condition" "non-constant" } +// { dg-warning "division by zero" "zero" { target *-*-* } 2 } +// { dg-error "7 / 0.. is not a constant expression" "not a constant" { target *-*-* } 2 } diff --git a/gcc/testsuite/g++.dg/cpp0x/static_assert5.C b/gcc/testsuite/g++.dg/cpp0x/static_assert5.C new file mode 100644 index 0000000000..b918796220 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/static_assert5.C @@ -0,0 +1,21 @@ +// PR c++/50837 +// { dg-options "-std=c++0x" } + +template<class T> +struct z +{ + static constexpr bool test_constexpr() + { + return true; + } + + static void test() + { + static_assert(test_constexpr(), "test1"); + } +}; + +int main() +{ + z<int>::test(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/static_assert6.C b/gcc/testsuite/g++.dg/cpp0x/static_assert6.C new file mode 100644 index 0000000000..d1ab0dded9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/static_assert6.C @@ -0,0 +1,4 @@ +// PR c++/51397 +// { dg-options "-std=c++0x" } + +static_assert('X' != '\130', "'X' has the wrong value"); // { dg-error "'X' has the wrong value" } diff --git a/gcc/testsuite/g++.dg/cpp0x/temp_default2.C b/gcc/testsuite/g++.dg/cpp0x/temp_default2.C index fa2bb6aed8..dab1650e44 100644 --- a/gcc/testsuite/g++.dg/cpp0x/temp_default2.C +++ b/gcc/testsuite/g++.dg/cpp0x/temp_default2.C @@ -8,7 +8,7 @@ void g() f(1, 'c'); // f<int,char>(1,'c') f(1); // f<int,double>(1,0) f(); // { dg-error "no matching function" } - // { dg-message "candidate" "candidate note" { target *-*-* } 10 } + // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 10 } f<int>(); // f<int,double>(0,0) f<int,char>(); // f<int,char>(0,0) } diff --git a/gcc/testsuite/g++.dg/cpp0x/trailing2.C b/gcc/testsuite/g++.dg/cpp0x/trailing2.C index e45204fe71..5f5af22947 100644 --- a/gcc/testsuite/g++.dg/cpp0x/trailing2.C +++ b/gcc/testsuite/g++.dg/cpp0x/trailing2.C @@ -3,14 +3,14 @@ // { dg-options "-std=c++0x" } auto f1 () -> int; -auto f2 (); // { dg-error "without late return type" } -int f3 () -> int; // { dg-error "late return type" } -auto *f4 () -> int; // { dg-error "late return type" } +auto f2 (); // { dg-error "without trailing return type" } +int f3 () -> int; // { dg-error "trailing return type" } +auto *f4 () -> int; // { dg-error "trailing return type" } struct A { auto f5 () const -> int; - auto f6 (); // { dg-error "without late return type" } - int f7 () -> int; // { dg-error "late return type" } - auto *f8 () -> int; // { dg-error "late return type" } + auto f6 (); // { dg-error "without trailing return type" } + int f7 () -> int; // { dg-error "trailing return type" } + auto *f8 () -> int; // { dg-error "trailing return type" } }; diff --git a/gcc/testsuite/g++.dg/cpp0x/trailing3.C b/gcc/testsuite/g++.dg/cpp0x/trailing3.C index 82d36f0d0d..1c64f45731 100644 --- a/gcc/testsuite/g++.dg/cpp0x/trailing3.C +++ b/gcc/testsuite/g++.dg/cpp0x/trailing3.C @@ -1,5 +1,5 @@ // More auto/decltype mangling tests. -// { dg-options "-std=c++0x" } +// { dg-options "-std=c++0x -fabi-version=0" } template <class T> struct B @@ -58,6 +58,6 @@ int main() A<int>().h(1); // { dg-final { scan-assembler "_ZN1AIiE1jIiEEDTplfp_clL_Z1xvEEET_" } } A<int>().j(1); - // { dg-final { scan-assembler "_Z1gIIidEEDTcl1fspplfp_Li1EEEDpT_" } } + // { dg-final { scan-assembler "_Z1gIJidEEDTcl1fspplfp_Li1EEEDpT_" } } g(42, 1.0); } diff --git a/gcc/testsuite/g++.dg/cpp0x/trailing4.C b/gcc/testsuite/g++.dg/cpp0x/trailing4.C index d67b3b6115..8d4baa97e5 100644 --- a/gcc/testsuite/g++.dg/cpp0x/trailing4.C +++ b/gcc/testsuite/g++.dg/cpp0x/trailing4.C @@ -8,5 +8,5 @@ auto f(T,U) -> decltype(T() + U()) template<class T> void g(T){} // { dg-message "note" } int main() { g(f); } // { dg-error "no matching function" } -// { dg-message "candidate" "candidate note" { target *-*-* } 10 } +// { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 10 } diff --git a/gcc/testsuite/g++.dg/cpp0x/trailing6.C b/gcc/testsuite/g++.dg/cpp0x/trailing6.C new file mode 100644 index 0000000000..3476e90e58 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/trailing6.C @@ -0,0 +1,6 @@ +// PR c++/49003 +// { dg-options -std=c++0x } + +struct A { + auto a() const -> decltype(this) { return this; } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/trailing7.C b/gcc/testsuite/g++.dg/cpp0x/trailing7.C new file mode 100644 index 0000000000..c4db10ec80 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/trailing7.C @@ -0,0 +1,14 @@ +// PR c++/50365 +// { dg-options -std=c++0x } + +struct A { int i; }; + +struct B { + B(); + A* f(); +}; + +B::B() +{ + int(f()->i); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/trailing9.C b/gcc/testsuite/g++.dg/cpp0x/trailing9.C new file mode 100644 index 0000000000..d7895b38e3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/trailing9.C @@ -0,0 +1,12 @@ +// PR c++/56646 +// { dg-require-effective-target c++11 } + +struct A { + void f(); +}; + +void A::f() { + struct B { + auto g() -> void { } + }; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-addr.C b/gcc/testsuite/g++.dg/cpp0x/udlit-addr.C new file mode 100644 index 0000000000..7d3286e007 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-addr.C @@ -0,0 +1,10 @@ +// { dg-options "-std=c++0x" } + +#include <cstddef> + +bool operator"" _yn(const char*, size_t); + +typedef bool (*pfunk)(const char*, size_t); +pfunk p = &operator"" _yn; + +bool tf = p("Hello,\0 World!", 14); diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-args-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-args-neg.C new file mode 100644 index 0000000000..df7b7281c3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-args-neg.C @@ -0,0 +1,41 @@ +// { dg-options -std=c++0x } + +#include <cstddef> + +class Foo { }; + +int +operator"" _Foo(); // { dg-error "has invalid argument list" } + +Foo +operator"" _Foo(int *); // { dg-error "has invalid argument list" } + +Foo +operator"" _Foo(unsigned long int); // { dg-error "has invalid argument list" } + +Foo +operator"" _Foo(double); // { dg-error "has invalid argument list" } + +Foo +operator"" _Foo(const float *, std::size_t); // { dg-error "has invalid argument list" } + +Foo +operator"" _Foo(const wchar_t *, int); // { dg-error "has invalid argument list" } + +Foo +operator"" _Foo(const char16_t *); // { dg-error "has invalid argument list" } + +Foo +operator"" _Foo(char...); // { dg-error "has invalid argument list" } + +Foo +operator"" _Foo(unsigned long long int, char); // { dg-error "has invalid argument list" } + +Foo +operator"" _Foo(const char *, std::size_t, int); // { dg-error "has invalid argument list" } + +Foo +operator"" _Foo(long double &); // { dg-error "has invalid argument list" } + +Foo +operator"" _Foo(std::size_t, const char16_t *); // { dg-error "has invalid argument list" } diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-args.C b/gcc/testsuite/g++.dg/cpp0x/udlit-args.C new file mode 100644 index 0000000000..ca2039c59d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-args.C @@ -0,0 +1,38 @@ +// { dg-options -std=c++0x } + +#include <cstddef> + +class Foo { }; + +Foo +operator"" _Foo(const char *); + +Foo +operator"" _Foo(unsigned long long int); + +Foo +operator"" _Foo(long double); + +Foo +operator"" _Foo(char); + +Foo +operator"" _Foo(wchar_t); + +Foo +operator"" _Foo(char16_t); + +Foo +operator"" _Foo(char32_t); + +Foo +operator"" _Foo(const char *, std::size_t); + +Foo +operator"" _Foo(const wchar_t *, std::size_t); + +Foo +operator"" _Foo(const char16_t *, std::size_t); + +Foo +operator"" _Foo(const char32_t *, std::size_t); diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-args2.C b/gcc/testsuite/g++.dg/cpp0x/udlit-args2.C new file mode 100644 index 0000000000..1e7190fc8f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-args2.C @@ -0,0 +1,15 @@ +// PR c++/52521 +// { dg-do compile } +// { dg-options -std=c++11 } + +#include <cstddef> + +int operator "" _a (const char *); +int operator "" _a (const char *, std::size_t); +int a = 123_a; +int a2 = "abc"_a; + +int operator "" _b (const char *, std::size_t); +int operator "" _b (const char *); +int b = 123_b; +int b2 = "abc"_b; diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-clink-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-clink-neg.C new file mode 100644 index 0000000000..a80e7244af --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-clink-neg.C @@ -0,0 +1,8 @@ +// { dg-options -std=c++0x } + +extern "C" { + +int +operator"" _badclinkage(unsigned long long); // { dg-error "operator with C linkage" } + +} diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-concat-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-concat-neg.C new file mode 100644 index 0000000000..61dc2ab02c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-concat-neg.C @@ -0,0 +1,9 @@ +// { dg-options "-std=c++0x" } + +#include <string> + +std::string operator"" _xxx(const char*, size_t); + +std::string operator"" _yyy(const char*, size_t); + +std::string concat = "Hello, "_xxx "World!"_yyy; // { dg-error "inconsistent user-defined literal suffixes" } diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-concat.C b/gcc/testsuite/g++.dg/cpp0x/udlit-concat.C new file mode 100644 index 0000000000..612bc1d111 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-concat.C @@ -0,0 +1,24 @@ +// { dg-options "-std=c++0x" } + +#include <string> + +std::string operator"" _www(const char*, size_t); + +std::string concat01 = "Hello, " "World!"_www; + +std::string concat10 = "Hello, "_www "World!"; + +std::string concat11 = "Hello, "_www "World!"_www; + + +class Tachyon { }; + +Tachyon operator"" _fast(const char*, size_t); + +int operator"" _fast(const char32_t*, size_t); + +int speedy01 = "Hello, " U"World!"_fast; + +int speedy10 = "Hello, "_fast U"World!"; + +int speedy11 = "Hello, "_fast U"World!"_fast; diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-constexpr.C b/gcc/testsuite/g++.dg/cpp0x/udlit-constexpr.C new file mode 100644 index 0000000000..40b0dfac53 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-constexpr.C @@ -0,0 +1,7 @@ +// { dg-options -std=c++0x } + +constexpr unsigned long long +operator"" _grow(unsigned long long n) +{ return 2 * n; } + +double buffer[25_grow]; diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-cpp98-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-cpp98-neg.C new file mode 100644 index 0000000000..cb4c359658 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-cpp98-neg.C @@ -0,0 +1,17 @@ +// { dg-options "-std=c++98" } + +#include <cstddef> + +int +operator"" _mm(long double m) // { dg-warning "user-defined literals only available with" } +{ return int(1000.0L * m); } + +int in = 0.0254_mm; // { dg-error "invalid suffix" } + +int +operator"" _Q(const char *, std::size_t) // { dg-warning "user-defined literals only available with" } +{ return 42; } + +int x = "Hello"_Q; // { dg-error "invalid conversion from" "invalid" } + +// { dg-error "expected" "expected" { target *-*-* } 15 } diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-declare-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-declare-neg.C new file mode 100644 index 0000000000..9060abba49 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-declare-neg.C @@ -0,0 +1,15 @@ +// { dg-options "-std=c++0x" } + +// Check that undeclared literal operator calls and literals give appropriate errors. + +int i = operator"" _Bar('x'); // { dg-error "was not declared in this scope" } +int j = 'x'_Bar; // { dg-error "unable to find character literal operator|with|argument" } + +int ii = operator"" _BarCharStr("Howdy, Pardner!"); // { dg-error "was not declared in this scope" } +int jj = "Howdy, Pardner!"_BarCharStr; // { dg-error "unable to find string literal operator|Possible missing length argument" } + +unsigned long long iULL = operator"" _BarULL(666ULL); // { dg-error "was not declared in this scope" } +unsigned long long jULL = 666_BarULL; // { dg-error "unable to find numeric literal operator" } + +long double iLD = operator"" _BarLD(666.0L); // { dg-error "was not declared in this scope" } +long double jLD = 666.0_BarLD; // { dg-error "unable to find numeric literal operator" } diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-embed-quote.C b/gcc/testsuite/g++.dg/cpp0x/udlit-embed-quote.C new file mode 100644 index 0000000000..48a2a1b171 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-embed-quote.C @@ -0,0 +1,34 @@ +// { dg-do run } +// { dg-options "-std=c++0x" } + +// Make sure embedded quotes are not a problem for string and char literals. + +#include <cstdint> +#include <cassert> + +int operator"" _embedchar(char) +{ return 41; }; + +int operator"" _embedstr(const char*, std::size_t len) +{ return 42 + len; }; + +void +test() +{ + int i = '\''_embedchar; + + int j = "\""_embedstr; + assert(j == 43); + + int k = "foo\""_embedstr; + assert(k == 46); + + int l = "\"bar"_embedstr; + assert(l == 46); +} + +int +main() +{ + test(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-friend.C b/gcc/testsuite/g++.dg/cpp0x/udlit-friend.C new file mode 100644 index 0000000000..b3f3ef8a60 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-friend.C @@ -0,0 +1,28 @@ +// { dg-options -std=c++0x } + +long double +operator"" _Hertz(long double); + +class Foo +{ +public: + Foo() { } + + friend Foo operator"" _Bar(char); + + friend long double + operator"" _Hertz(long double omega) + { return omega / 6.28318530717958648; } +}; + +Foo +operator"" _Bar(char) +{ return Foo(); } + +Foo f1 = operator"" _Bar('x'); + +Foo f2 = 'x'_Bar; + +long double fm1 = operator"" _Hertz(552.92L); + +long double fm2 = 552.92_Hertz; diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-general.C b/gcc/testsuite/g++.dg/cpp0x/udlit-general.C new file mode 100644 index 0000000000..9e448ac805 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-general.C @@ -0,0 +1,52 @@ +// { dg-do run } +// { dg-options "-std=c++0x" } + +// Test user-defined literals. +// Test simple operator declaration and definition. + +#include <cstring> +#include <string> +#include <complex> +#include <cassert> + +long double operator"" _v(long double); +std::string operator"" _w(const char16_t*, size_t); +unsigned operator"" _w(const char*); + +std::complex<double> +operator"" _i(long double y) +{ return std::complex<double>(0.0L, y); } + +void +test1() +{ + long double x = operator"" _v(1.2L); + assert(x == 2.2L); + + std::string s = operator"" _w(u"one", 3); + assert(s == "boo"); + + unsigned u = operator"" _w("Hello, World!"); + assert(u == 13U); + + std::complex<double> i = operator"" _i(2.0); + assert(i == std::complex<double>(0.0, 2.0)); +} + +int +main() +{ + test1(); +} + +long double +operator"" _v(long double x) +{ return x + 1.0L; } + +std::string +operator"" _w(const char16_t*, size_t) +{ return std::string("boo"); } + +unsigned +operator"" _w(const char* str) +{ return strlen(str); } diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-implicit-conv-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-implicit-conv-neg.C new file mode 100644 index 0000000000..998ad155bf --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-implicit-conv-neg.C @@ -0,0 +1,63 @@ +// { dg-options -std=c++0x } + +#include <cstdint> + +int operator"" _bar (long double); + +double operator"" _foo (long long unsigned); + +int i = 12_bar; // { dg-error "unable to find numeric literal operator|with|argument" } + +double d = 1.2_foo; // { dg-error "unable to find numeric literal operator|with|argument" } + +int operator"" _char(char); + +int operator"" _wchar_t(wchar_t); + +int operator"" _char16_t(char16_t); + +int operator"" _char32_t(char32_t); + +int cwcx = 'c'_wchar_t; // { dg-error "unable to find character literal operator|with|argument" } +int cc16 = 'c'_char16_t; // { dg-error "unable to find character literal operator|with|argument" } +int cc32 = 'c'_char32_t; // { dg-error "unable to find character literal operator|with|argument" } + +int wccx = L'c'_char; // { dg-error "unable to find character literal operator|with|argument" } +int wcc16 = L'c'_char16_t; // { dg-error "unable to find character literal operator|with|argument" } +int wcc32 = L'c'_char32_t; // { dg-error "unable to find character literal operator|with|argument" } + +int c16c = u'c'_char; // { dg-error "unable to find character literal operator|with|argument" } +int c16wc = u'c'_wchar_t; // { dg-error "unable to find character literal operator|with|argument" } +int c16c32 = u'c'_char32_t; // { dg-error "unable to find character literal operator|with|argument" } + +int c32c = U'c'_char; // { dg-error "unable to find character literal operator|with|argument" } +int c32wc = U'c'_wchar_t; // { dg-error "unable to find character literal operator|with|argument" } +int c32c16 = U'c'_char16_t; // { dg-error "unable to find character literal operator|with|argument" } + +int operator"" _char_str(const char*, std::size_t); + +int operator"" _wchar_t_str(const wchar_t*, std::size_t); + +int operator"" _char16_t_str(const char16_t*, std::size_t); + +int operator"" _char32_t_str(const char32_t*, std::size_t); + +int strwstr = "str"_wchar_t_str; // { dg-error "unable to find string literal operator|with|arguments" } +int strstr16 = "str"_char16_t_str; // { dg-error "unable to find string literal operator|with|arguments" } +int strstr32 = "str"_char32_t_str; // { dg-error "unable to find string literal operator|with|arguments" } + +int str8wstr = u8"str"_wchar_t_str; // { dg-error "unable to find string literal operator|with|arguments" } +int str8str16 = u8"str"_char16_t_str; // { dg-error "unable to find string literal operator|with|arguments" } +int str8str32 = u8"str"_char32_t_str; // { dg-error "unable to find string literal operator|with|arguments" } + +int wstrstr = L"str"_char_str; // { dg-error "unable to find string literal operator|with|arguments" } +int wstrstr16 = L"str"_char16_t_str; // { dg-error "unable to find string literal operator|with|arguments" } +int wstrstr32 = L"str"_char32_t_str; // { dg-error "unable to find string literal operator|with|arguments" } + +int str16str = u"str"_char_str; // { dg-error "unable to find string literal operator|with|arguments" } +int str16wstr = u"str"_wchar_t_str; // { dg-error "unable to find string literal operator|with|arguments" } +int str16str32 = u"str"_char32_t_str; // { dg-error "unable to find string literal operator|with|arguments" } + +int str32str = U"str"_char_str; // { dg-error "unable to find string literal operator|with|arguments" } +int str32wstr = U"str"_wchar_t_str; // { dg-error "unable to find string literal operator|with|arguments" } +int str32str16 = U"str"_char16_t_str; // { dg-error "unable to find string literal operator string operator|with|arguments" } diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-inline.C b/gcc/testsuite/g++.dg/cpp0x/udlit-inline.C new file mode 100644 index 0000000000..75032c5767 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-inline.C @@ -0,0 +1,22 @@ +// { dg-options "-std=c++0x" } + +// Literal operators can be inline. + +inline int +operator"" _thing1(char cc) +{ return 42 * cc; } + +int operator"" _thing2(char cc); + +class Foo +{ + int + friend operator"" _thing2(char cc) + { return 42 * cc; } +}; + +int i = operator"" _thing1('x'); +int j = 'x'_thing1; + +int iF = operator"" _thing2('x'); +int jF = 'x'_thing2; diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-linkage-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-linkage-neg.C new file mode 100644 index 0000000000..c2ecede8d4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-linkage-neg.C @@ -0,0 +1,7 @@ +// { dg-options -std=c++0x } + +extern "C"_badlinkage { // { dg-error "expected unqualified-id before" } + +int foo(); + +} diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-mangle.C b/gcc/testsuite/g++.dg/cpp0x/udlit-mangle.C new file mode 100644 index 0000000000..6de31b65ea --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-mangle.C @@ -0,0 +1,8 @@ +// PR c++/52521 +// { dg-options -std=c++0x } +// { dg-final { scan-assembler "_Zli2_wPKc" } } + +int operator "" _w(const char*); +int main() { + 123_w; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-member-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-member-neg.C new file mode 100644 index 0000000000..a6220c4c0f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-member-neg.C @@ -0,0 +1,15 @@ +// { dg-options -std=c++0x } + +class Foo +{ +public: + Foo() { } + int operator"" _Bar(char32_t); // { dg-error "must be a non-member function" } +}; + +int i = operator"" _Bar(U'x'); // { dg-error "was not declared in this scope" } +int j = U'x'_Bar; // { dg-error "unable to find character literal operator" } + +int +Foo::operator"" _Bar(char32_t) // { dg-error "must be a non-member function" } +{ return 42; } diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-namespace.C b/gcc/testsuite/g++.dg/cpp0x/udlit-namespace.C new file mode 100644 index 0000000000..e5d54e5190 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-namespace.C @@ -0,0 +1,43 @@ +// { dg-do run } +// { dg-options "-std=c++0x" } + +// Test user-defined literals. +// Test simple operator declaration and definition in namespaces. + +#include <cmath> +#include <limits> + +namespace Long +{ + long double operator"" _LL(long double); +} + +namespace Short +{ + short + operator"" _SS(long double x) + { return std::fmod(x, static_cast<long double>(std::numeric_limits<short>::max())); } +} + +void +test1() +{ + long double x = Long::operator "" _LL(1.2L); + + using namespace Short; + short s = operator"" _SS(1.2L); + short s2 = 1.2_SS; +} + +int +main() +{ + test1(); +} + +namespace Long +{ + long double + operator"" _LL(long double x) + { return x + 2.0L; } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-nofunc-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-nofunc-neg.C new file mode 100644 index 0000000000..6ad79b85b1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-nofunc-neg.C @@ -0,0 +1,9 @@ +// { dg-options "-std=c++0x" } + +// Test user-defined literals. +// Test error on non-function declaration. + +double operator"" _baddecl; // { dg-error "as non-function" } + +template<char...> + int operator"" _badtmpldecl; // { dg-error "as non-function" } diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-nonempty-str-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-nonempty-str-neg.C new file mode 100644 index 0000000000..981865f152 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-nonempty-str-neg.C @@ -0,0 +1,6 @@ +// { dg-options "-std=c++0x" } + +// Test user-defined literals. +// Test error on non-empty string after 'operator' keyword. + +double operator"hi" _badword(long double); // { dg-error "expected empty string after" } diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-nospace-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-nospace-neg.C new file mode 100644 index 0000000000..2b57637a91 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-nospace-neg.C @@ -0,0 +1,3 @@ +// { dg-options "-std=c++0x" } + +float operator ""_abc(const char*); // { dg-error "missing space between|and suffix identifier" } diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-nosuffix-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-nosuffix-neg.C new file mode 100644 index 0000000000..b90635cd0f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-nosuffix-neg.C @@ -0,0 +1,5 @@ +// { dg-options -std=c++0x } + +char32_t +operator"" (char32_t C) // { dg-error "expected suffix identifier" } +{ return C; } diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-nounder-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-nounder-neg.C new file mode 100644 index 0000000000..2067bbe561 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-nounder-neg.C @@ -0,0 +1,9 @@ +// { dg-options "-std=c++0x" } + +// Test user-defined literals. +// Test warning on declaration without leading underscore. + +long double operator"" nounder(long double); // { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" } + +template<char...> + int operator"" nounder(); // { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" } diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-operator-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-operator-neg.C new file mode 100644 index 0000000000..27fdedec76 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-operator-neg.C @@ -0,0 +1,42 @@ +// { dg-options "-std=c++0x" } + +// Can't have *both* literal operator template and raw literal operator. + +int +operator"" _abc(const char*) + { + return 42; + } + +template<char...> + int + operator"" _abc() // { dg-error "literal operator template|conflicts with raw literal operator" } + { + return 13; + } + +template<char...> + int + operator"" _def() + { + return 12; + } + +int +operator"" _def(const char*) // { dg-error "raw literal operator|conflicts with literal operator template" } + { + return 43; + } + +int +operator"" _ghi(long double) + { + return 42; + } + +template<char...> + int + operator"" _ghi() // OK + { + return 13; + } diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-preproc-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-preproc-neg.C new file mode 100644 index 0000000000..23633390cf --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-preproc-neg.C @@ -0,0 +1,9 @@ +// { dg-options "-std=c++0x" } + +int +operator"" _badpreproc(const char *str) +{ return 0; } + +#if 123_badpreproc // { dg-error "user-defined literal in preprocessor expression" } +# error ("user-defined literal in preprocessor expression") // { dg-error "user-defined literal in preprocessor expression" } +#endif diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-raw-length.C b/gcc/testsuite/g++.dg/cpp0x/udlit-raw-length.C new file mode 100644 index 0000000000..2d910624a7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-raw-length.C @@ -0,0 +1,27 @@ +// { dg-options "-std=c++0x" } +// PR c++/50958 + +typedef decltype(sizeof(0)) size_type; + +constexpr size_type +cstrlen_impl(const char* s, size_type i) +{ + return s[i] ? cstrlen_impl(s, i + 1) : i; +} + +constexpr size_type +cstrlen(const char* s) +{ + return s ? cstrlen_impl(s, 0) : throw 0; +} + +constexpr size_type +operator "" _lenraw(const char* digits) +{ + return cstrlen(digits); +} + +static_assert(123_lenraw == 3, "Ouch"); +static_assert(1_lenraw == 1, "Ouch"); +static_assert(012_lenraw == 3, "Ouch"); +static_assert(0_lenraw == 1, "Ouch"); diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-raw-op-string-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-raw-op-string-neg.C new file mode 100644 index 0000000000..58ad0e609d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-raw-op-string-neg.C @@ -0,0 +1,8 @@ +// { dg-options "-std=c++0x" } + +// Make sure handing a string to a raw literal generates a sensible error message. + +int operator"" _embedraw(const char*) +{ return 41; }; + +int k = "Boo!"_embedraw; // { dg-error "unable to find string literal operator" } diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-raw-op.C b/gcc/testsuite/g++.dg/cpp0x/udlit-raw-op.C new file mode 100644 index 0000000000..a31ef9328d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-raw-op.C @@ -0,0 +1,21 @@ +// { dg-do run } +// { dg-options "-std=c++0x" } + +#include <cassert> +#include <cstring> + +int +operator"" _raw_umber(const char * str) +{ + return strlen(str); +} + +int +main() +{ + int i = 0123012301230123012301230123012301230123012301230123012301230123_raw_umber; + assert( i == 64 ); + + int j = 90123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789_raw_umber; + assert( j == 101 ); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-raw-str.C b/gcc/testsuite/g++.dg/cpp0x/udlit-raw-str.C new file mode 100644 index 0000000000..e94410fd06 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-raw-str.C @@ -0,0 +1,15 @@ +// { dg-options -std=c++0x } + +#include <string> + +std::string operator"" _i18n(const char*, std::size_t); + +std::string vogon_poem = R"V0G0N( + O freddled gruntbuggly thy micturations are to me + As plured gabbleblochits on a lurgid bee. + Groop, I implore thee my foonting turlingdromes. + And hooptiously drangle me with crinkly bindlewurdles, + Or I will rend thee in the gobberwarts with my blurlecruncheon, see if I don't. + + (by Prostetnic Vogon Jeltz; see p. 56/57) +)V0G0N"_i18n; diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-resolve.C b/gcc/testsuite/g++.dg/cpp0x/udlit-resolve.C new file mode 100644 index 0000000000..a25516220c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-resolve.C @@ -0,0 +1,40 @@ +// { dg-do run } +// { dg-options "-std=c++0x" } + +#include <cstdint> +#include <cassert> + +int operator"" _foo(const char*) { return 0; } +int operator"" _foo(unsigned long long int) { return 1; } +int operator"" _foo(long double) { return 2; } +int operator"" _foo(char) { return 3; } +int operator"" _foo(wchar_t) { return 4; } +int operator"" _foo(char16_t) { return 5; } +int operator"" _foo(char32_t) { return 6; } +int operator"" _foo(const char*, std::size_t) { return 7; } +int operator"" _foo(const wchar_t*, std::size_t) { return 8; } +int operator"" _foo(const char16_t*, std::size_t) { return 9; } +int operator"" _foo(const char32_t*, std::size_t) { return 10; } +template<char...> int operator"" _foo2() { return 20; } +int operator"" _foo2(unsigned long long int) { return 21; } + +namespace bar { +int operator"" _foo(unsigned long long int) { return 101; } +} +using namespace bar; + +int +main() +{ + assert(123_foo == 101); + assert(0.123_foo == 2); + assert('c'_foo == 3); + assert(L'c'_foo == 4); + assert(u'c'_foo == 5); + assert(U'c'_foo == 6); + assert("abc"_foo == 7); + assert(L"abc"_foo == 8); + assert(u"abc"_foo == 9); + assert(U"abc"_foo == 10); + assert(123_foo2 == 21); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-shadow-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-shadow-neg.C new file mode 100644 index 0000000000..994d58c1a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-shadow-neg.C @@ -0,0 +1,49 @@ +// { dg-options -std=c++0x } + +// Test that the standard suffixes shadow any user-defined suffixes of the same name. +long double +operator"" L(long double x) // { dg-warning "floating point suffix|shadowed by implementation" } +{ return x; } + +unsigned long long int +operator"" ULL(unsigned long long int k) // { dg-warning "integer suffix|shadowed by implementation" } +{ return k; } + +long double +operator"" l(long double x) // { dg-warning "floating point suffix|shadowed by implementation" } +{ return x; } + +unsigned long long int +operator"" ull(unsigned long long int k) // { dg-warning "integer suffix|shadowed by implementation" } +{ return k; } + +// Namespaces are no hiding place. +namespace Long +{ + +long double +operator"" L(long double x) // { dg-warning "integer suffix|shadowed by implementation" } +{ return x; } + +unsigned long long int +operator"" ULL(unsigned long long int k) // { dg-warning "integer suffix|shadowed by implementation" } +{ return k; } + +long double +operator"" l(long double x) // { dg-warning "integer suffix|shadowed by implementation" } +{ return x; } + +unsigned long long int +operator"" ull(unsigned long long int k) // { dg-warning "integer suffix|shadowed by implementation" } +{ return k; } + +} + +// { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 5 } +// { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 9 } +// { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 13 } +// { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 17 } +// { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 25 } +// { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 29 } +// { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 33 } +// { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" "reserved" { target *-*-* } 37 } diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-string-length.C b/gcc/testsuite/g++.dg/cpp0x/udlit-string-length.C new file mode 100644 index 0000000000..86903e8355 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-string-length.C @@ -0,0 +1,46 @@ +// { dg-options "-std=c++0x" } +// PR c++/50941 + +typedef decltype(sizeof(0)) size_type; + +constexpr size_type +operator"" _len(const char*, size_type len) +{ + return len; +} + +constexpr size_type +operator"" _len(const wchar_t*, size_type len) +{ + return len; +} + +constexpr size_type +operator"" _len(const char16_t*, size_type len) +{ + return len; +} + +constexpr size_type +operator"" _len(const char32_t*, size_type len) +{ + return len; +} + +static_assert( ""_len == 0, "Ouch"); +static_assert(u8""_len == 0, "Ouch"); +static_assert( L""_len == 0, "Ouch"); +static_assert( u""_len == 0, "Ouch"); +static_assert( U""_len == 0, "Ouch"); + +static_assert( "1"_len == 1, "Ouch"); +static_assert(u8"1"_len == 1, "Ouch"); +static_assert( L"1"_len == 1, "Ouch"); +static_assert( u"1"_len == 1, "Ouch"); +static_assert( U"1"_len == 1, "Ouch"); + +static_assert( "123"_len == 3, "Ouch"); +static_assert(u8"123"_len == 3, "Ouch"); +static_assert( L"123"_len == 3, "Ouch"); +static_assert( u"123"_len == 3, "Ouch"); +static_assert( U"123"_len == 3, "Ouch"); diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-suffix-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-suffix-neg.C new file mode 100644 index 0000000000..56eab01d73 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-suffix-neg.C @@ -0,0 +1,5 @@ +// { dg-options -std=c++0x } + +#include <string> + +std::string operator"" 5X(const char*, std::size_t); // { dg-error "expected suffix identifier" } diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-systemheader.C b/gcc/testsuite/g++.dg/cpp0x/udlit-systemheader.C new file mode 100644 index 0000000000..599c8652a1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-systemheader.C @@ -0,0 +1,3 @@ +// { dg-options -std=c++0x } + +#include "udlit_system_header" diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-template.C b/gcc/testsuite/g++.dg/cpp0x/udlit-template.C new file mode 100644 index 0000000000..6a28f74a22 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-template.C @@ -0,0 +1,51 @@ +// { dg-do run } +// { dg-options "-std=c++0x" } + +// Test user-defined literals. +// Test template operator declaration and definition. + +#include <cassert> + +template<char...> + int operator"" _abc(); + +template<> + int + operator"" _abc<>() + { return -1; } + +template<> + int + operator"" _abc<'L','U','E'>() + { return 42; } + +template<> + int + operator"" _abc<'6','6','6'>() + { return 21; } + +int +test1() +{ + int i = operator"" _abc<'1','2','3'>(); + assert(i == 45); + int universal_meaning = operator"" _abc<'L','U','E'>(); + assert(universal_meaning == 42); + int b = operator"" _abc<'6','6','6'>(); + int z = operator"" _abc<>(); + assert(z == -1); + int j = 123_abc; + assert(j == i); + int jb = 666_abc; + assert(jb == b); +} + +int +main() +{ + test1(); +} + +template<char... Chars> + int operator"" _abc() + { return 42 + sizeof...(Chars); } diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg-neg.C new file mode 100644 index 0000000000..e8ccb6f545 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg-neg.C @@ -0,0 +1,4 @@ +// { dg-options -std=c++0x } + +template<char...> + int operator"" _xyz(unsigned long long); // { dg-error "has invalid argument list" } diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg.C new file mode 100644 index 0000000000..6324823fab --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg.C @@ -0,0 +1,4 @@ +// { dg-options -std=c++0x } + +template<char...> + int operator"" _abc(); diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms-neg.C new file mode 100644 index 0000000000..4dab4d2f6f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms-neg.C @@ -0,0 +1,12 @@ +// { dg-options -std=c++0x } + +class Foo { }; + +template<wchar_t...> + Foo operator"" _Foo(); // { dg-error "literal operator template|has invalid parameter list" } + +template<char> + Foo operator"" _Bar(); // { dg-error "literal operator template|has invalid parameter list" } + +template<typename... Type> + Foo operator"" _Bar(); // { dg-error "literal operator template|has invalid parameter list" } diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms.C b/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms.C new file mode 100644 index 0000000000..77456737c7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms.C @@ -0,0 +1,6 @@ +// { dg-options -std=c++0x } + +class Foo { }; + +template<char...> + Foo operator"" _Foo(); diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit_system_header b/gcc/testsuite/g++.dg/cpp0x/udlit_system_header new file mode 100644 index 0000000000..d541f24f62 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit_system_header @@ -0,0 +1,6 @@ + +#pragma GCC system_header + +char +operator"" stdsuffix(char __c) +{ return __c/2; } diff --git a/gcc/testsuite/g++.dg/cpp0x/union1.C b/gcc/testsuite/g++.dg/cpp0x/union1.C index 291853d5aa..cb0f01719c 100644 --- a/gcc/testsuite/g++.dg/cpp0x/union1.C +++ b/gcc/testsuite/g++.dg/cpp0x/union1.C @@ -14,8 +14,8 @@ union B A a; // { dg-error "union member" } }; -B b; // { dg-error "B::B\\(\\)" } -B b2(b); // { dg-error "B::B\\(const B&\\)" } +B b; // { dg-error "B::B\\(\\)" "B::B" } +B b2(b); // { dg-error "B::B\\(const B&\\)" "B::B" } struct C { @@ -25,10 +25,10 @@ struct C }; }; -C c; // { dg-error "C::C\\(\\)" } -C c2(c); // { dg-error "C::C\\(const C&\\)" } +C c; // { dg-error "C::C\\(\\)" "C::C" } +C c2(c); // { dg-error "C::C\\(const C&\\)" "C::C" } -// { dg-error "B::~B" "" { target *-*-* } 17 } -// { dg-error "B::~B" "" { target *-*-* } 18 } -// { dg-error "C::~C" "" { target *-*-* } 28 } -// { dg-error "C::~C" "" { target *-*-* } 29 } +// { dg-error "B::~B" "B::~B" { target *-*-* } 17 } +// { dg-error "B::~B" "B::~B" { target *-*-* } 18 } +// { dg-error "C::~C" "C::~C" { target *-*-* } 28 } +// { dg-error "C::~C" "C::~C" { target *-*-* } 29 } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-default.C b/gcc/testsuite/g++.dg/cpp0x/variadic-default.C new file mode 100644 index 0000000000..2625e259f7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-default.C @@ -0,0 +1,12 @@ +// PR c++/49205 +// { dg-options -std=c++0x } + +#include <initializer_list> + +struct A { + template<typename ...T> A(T...); + A(std::initializer_list<short>); + A(std::initializer_list<long>); +}; + +A a{}; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-ex10.C b/gcc/testsuite/g++.dg/cpp0x/variadic-ex10.C index a392bd7d43..e8b6b72214 100644 --- a/gcc/testsuite/g++.dg/cpp0x/variadic-ex10.C +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-ex10.C @@ -4,6 +4,6 @@ template<typename... Types> struct Tuple { }; Tuple<> t0; // Types contains no arguments Tuple<int> t1; // Types contains one argument: int Tuple<int, float> t2; // Types contains two arguments: int and float -Tuple<0> error; // { dg-error "mismatch" } -// { dg-error "expected a type" "" { target *-*-* } 7 } -// { dg-error "in declaration" "" { target *-*-* } 7 } +Tuple<0> error; // { dg-error "mismatch" "mismatch" } +// { dg-error "expected a type" "expected a type" { target *-*-* } 7 } +// { dg-error "in declaration" "in declaration" { target *-*-* } 7 } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-ex14.C b/gcc/testsuite/g++.dg/cpp0x/variadic-ex14.C index f33ca0e861..105096a78b 100644 --- a/gcc/testsuite/g++.dg/cpp0x/variadic-ex14.C +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-ex14.C @@ -8,12 +8,12 @@ template<template<class> class P> class X { /* ... */ }; template<template<class...> class Q> class Y { /* ... */ }; X<A> xA; // okay -X<B> xB; // { dg-error "mismatch" } -// { dg-error "expected a template" "" { target *-*-* } 11 } -// { dg-error "invalid type" "" { target *-*-* } 11 } -X<C> xC; // { dg-error "mismatch" } -// { dg-error "expected a template" "" { target *-*-* } 14 } -// { dg-error "invalid type" "" { target *-*-* } 14 } +X<B> xB; // { dg-error "mismatch" "mismatch" } +// { dg-error "expected a template" "expected" { target *-*-* } 11 } +// { dg-error "invalid type" "invalid" { target *-*-* } 11 } +X<C> xC; // { dg-error "mismatch" "mismatch" } +// { dg-error "expected a template" "expected" { target *-*-* } 14 } +// { dg-error "invalid type" "invalid" { target *-*-* } 14 } Y<A> yA; Y<B> yB; Y<C> yC; // okay diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-ex3.C b/gcc/testsuite/g++.dg/cpp0x/variadic-ex3.C index bd973055d0..018eaa3ed8 100644 --- a/gcc/testsuite/g++.dg/cpp0x/variadic-ex3.C +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-ex3.C @@ -4,8 +4,8 @@ void g() { int i = f<int>(5.6); int j = f(5.6); // { dg-error "no matching" } - // { dg-message "candidate" "candidate note" { target *-*-* } 6 } + // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 6 } f<void>(f<int, bool>); f<void>(f<int>); // { dg-error "no matching" } - // { dg-message "candidate" "candidate note" { target *-*-* } 9 } + // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 9 } } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-ex4.C b/gcc/testsuite/g++.dg/cpp0x/variadic-ex4.C index 5bf211696a..0a777c4853 100644 --- a/gcc/testsuite/g++.dg/cpp0x/variadic-ex4.C +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-ex4.C @@ -8,6 +8,6 @@ void g() f<int>("aa",3.0); // Y is deduced to be char*, and // Z is deduced to be double f("aa",3.0); // { dg-error "no matching" } - // { dg-message "candidate" "candidate note" { target *-*-* } 10 } + // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 10 } f2<char, short, int, long>(); // okay } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-explicit1.C b/gcc/testsuite/g++.dg/cpp0x/variadic-explicit1.C new file mode 100644 index 0000000000..a097f43d21 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-explicit1.C @@ -0,0 +1,11 @@ +// { dg-options -std=c++0x } + +template<class T, class U> struct A { }; +template<class... T, class ... U> void f( A<T,U>... p); + +void g() { + f<int>( + A<int,unsigned>(), + A<short,unsigned short>() + ); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-explicit2.C b/gcc/testsuite/g++.dg/cpp0x/variadic-explicit2.C new file mode 100644 index 0000000000..4a80745293 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-explicit2.C @@ -0,0 +1,14 @@ +// PR c++/56774 +// { dg-require-effective-target c++11 } + +template <class ... Args> +struct mytype {}; + +template <class T, class ... Args> +void something( mytype<T, Args...> ) +{ } + +int main() +{ + something<int, char, bool>( mytype<int, char, bool>() ); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-nondeduce1.C b/gcc/testsuite/g++.dg/cpp0x/variadic-nondeduce1.C new file mode 100644 index 0000000000..a64d7971c6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-nondeduce1.C @@ -0,0 +1,12 @@ +// { dg-options -std=c++0x } + +template <class... T> +void f(T..., int, T...) { } + +int main() +{ + f(0); + f<int>(0,0,0); + f<int,int>(0,0,0,0,0); + f(0,0,0); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-value1.C b/gcc/testsuite/g++.dg/cpp0x/variadic-value1.C new file mode 100644 index 0000000000..179919a5bc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-value1.C @@ -0,0 +1,24 @@ +// PR c++/52796 +// { dg-do run { target c++11 } } + +inline void *operator new(__SIZE_TYPE__ s, void *p) { return p; } + +struct A +{ + int i; + template<class... Ts> + A(Ts&&... ts): i(ts...) { } +}; + +static union { + unsigned char c[sizeof(A)]; + int i; +}; + +int main() +{ + i = 0xdeadbeef; + new(c) A; + if (i != 0) + __builtin_abort(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic103.C b/gcc/testsuite/g++.dg/cpp0x/variadic103.C index 6d12331d00..9d6b5ea20b 100644 --- a/gcc/testsuite/g++.dg/cpp0x/variadic103.C +++ b/gcc/testsuite/g++.dg/cpp0x/variadic103.C @@ -5,7 +5,7 @@ T&& create(); template<class T, class... Args> void test() { - T t(create<Args>()...); // { dg-error "unknown bound" } + T t(create<Args>()...); // { dg-error "incomplete" } (void) t; } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic105.C b/gcc/testsuite/g++.dg/cpp0x/variadic105.C index 24d7e15be2..66d24a7efe 100644 --- a/gcc/testsuite/g++.dg/cpp0x/variadic105.C +++ b/gcc/testsuite/g++.dg/cpp0x/variadic105.C @@ -20,5 +20,6 @@ struct call_sum { int main() { // This shouldn't be an error; this is bug 35722. - reverse<call_sum>(1,2); // { dg-bogus "no match" "" { xfail *-*-* } } + reverse<call_sum>(1,2); // { dg-bogus "no match" "" } + // { dg-bogus "sorry, unimplemented" "candidate explanation" { target *-*-* } 6 } } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic107.C b/gcc/testsuite/g++.dg/cpp0x/variadic107.C new file mode 100644 index 0000000000..5c3f468515 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic107.C @@ -0,0 +1,15 @@ +// PR c++/48451 +// { dg-options -std=c++0x } + +namespace std { + template <class T> T&& declval(); +} + +template<class T, class... Args, + class = decltype(T(std::declval<Args>()...)) + > +char f(int); + +struct From2Ints { From2Ints(int, int); }; + +static_assert(sizeof(f<From2Ints, int, int>(0)) == 1, "Error"); // b diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic111.C b/gcc/testsuite/g++.dg/cpp0x/variadic111.C index 378162e162..cb94ce6975 100644 --- a/gcc/testsuite/g++.dg/cpp0x/variadic111.C +++ b/gcc/testsuite/g++.dg/cpp0x/variadic111.C @@ -1,5 +1,5 @@ // PR c++/48424 -// { dg-options -std=c++0x } +// { dg-options "-std=c++0x -fabi-version=0" } template<typename... Args1> struct S @@ -16,4 +16,4 @@ int main() s.f(1,2.0,false,'a'); } -// { dg-final { scan-assembler "_ZN1SIIidEE1fIIbcEEEvidDpOT_" } } +// { dg-final { scan-assembler "_ZN1SIJidEE1fIJbcEEEvidDpOT_" } } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic112.C b/gcc/testsuite/g++.dg/cpp0x/variadic112.C new file mode 100644 index 0000000000..1640657d95 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic112.C @@ -0,0 +1,19 @@ +// PR c++/49420 +// { dg-options -std=c++0x } + +struct A { }; + +template <class T> struct B +{ + typedef typename T::type type ; // { dg-error "no type" } +}; + +template <typename Array, typename... Args> +typename B<Array>::type +get(const Array& a, Args... args); + +int main() +{ + A a; + int x = get(a, 1, 2, 3); // { dg-error "no match" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic117.C b/gcc/testsuite/g++.dg/cpp0x/variadic117.C new file mode 100644 index 0000000000..22f2fc5ae2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic117.C @@ -0,0 +1,11 @@ +// { dg-options -std=c++0x } + +template <class T> struct A { typedef T type; }; + +template <template <class...> class T, class... U> +void f(typename T<U...>::type); + +int main() +{ + f<A,int>(42); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic118.C b/gcc/testsuite/g++.dg/cpp0x/variadic118.C new file mode 100644 index 0000000000..43bf9bab21 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic118.C @@ -0,0 +1,11 @@ +// This should fail deduction, before it produces a candidate. +// { dg-options -std=c++0x } + +template <class... T> +void f(T... ts); // { dg-message "deduction" } + +struct B { }; +int main() +{ + f<int>(B(), 1); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic119.C b/gcc/testsuite/g++.dg/cpp0x/variadic119.C new file mode 100644 index 0000000000..78cd23e205 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic119.C @@ -0,0 +1,13 @@ +// PR c++/51046 +// { dg-do compile { target c++11 } } + +template<int... IS> +void f() +{ + for (int i : IS); // { dg-error "not expanded" } +} + +int main() +{ + f<0, 1, 2>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic120.C b/gcc/testsuite/g++.dg/cpp0x/variadic120.C new file mode 100644 index 0000000000..e26ee4e9ab --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic120.C @@ -0,0 +1,24 @@ +// PR c++/48322 +// { dg-do compile { target c++11 } } + +template <class... T> struct tuple; +template <class T> struct tuple<T> { T t; }; + +template <class T, class U> struct pair; +template<> struct pair<int,double> { }; + +template <class... Ts> +struct A +{ + template <class... Us, + class V = tuple<pair<Ts,Us>...> > + static void f() + { + V v; + } +}; + +int main() +{ + A<int>::f<double>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic121.C b/gcc/testsuite/g++.dg/cpp0x/variadic121.C new file mode 100644 index 0000000000..805c0065fe --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic121.C @@ -0,0 +1,12 @@ +// PR c++/51507 +// { dg-options -std=c++0x } + +template<typename ...> +struct foo { typedef void type; }; +template<typename ...Ts> +auto g(Ts ...ts)-> + typename foo<decltype(ts)...>::type +{} +int main() { + g(42); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic122.C b/gcc/testsuite/g++.dg/cpp0x/variadic122.C new file mode 100644 index 0000000000..7f03c107c3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic122.C @@ -0,0 +1,22 @@ +// PR c++/52043 +// { dg-options "-std=c++11 -Wreturn-type" } + +template < class T > struct Container +{ + T f (); +}; + +template < class T > +T deref (T) +{} // { dg-warning "no return" } + +template < class T, class ... Args > +auto deref (T u, int, Args ... args)->decltype (deref (u.f (), args ...)) +{} // { dg-warning "no return" } + +void +foo () +{ + Container < Container < int > > v; + deref (v, 2); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic123.C b/gcc/testsuite/g++.dg/cpp0x/variadic123.C new file mode 100644 index 0000000000..f0ab9fc22a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic123.C @@ -0,0 +1,14 @@ +// PR c++/52824 +// { dg-do compile { target c++11 } } + +template<typename G, typename H> +struct foo +{}; + +template<typename... G> +struct bar : foo<G...> +{}; + +int main() { + bar<int, float> f; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic124.C b/gcc/testsuite/g++.dg/cpp0x/variadic124.C new file mode 100644 index 0000000000..8ddc810b31 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic124.C @@ -0,0 +1,29 @@ +// PR c++/52292 +// { dg-options -std=c++11 } + +template <template <typename...> class T> +struct foo { + template <typename... U> + foo(T<U...> x) { } +}; + +template <typename T> +struct bar { + bar(T x) : value(x) { } + + T value; +}; + +struct generic : private foo<bar> { + template <typename T> + generic(bar<T> x) : foo(x) + { + } + +}; + +int main() +{ + bar<int> x(32); + generic y(x); // FAILS +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic125.C b/gcc/testsuite/g++.dg/cpp0x/variadic125.C new file mode 100644 index 0000000000..89fd6b00d1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic125.C @@ -0,0 +1,25 @@ +// PR c++/52380 +// { dg-do compile { target c++11 } } + +template<typename T> +struct S +{ + template<typename U> + struct Unary // Line 5 + {}; + + template<unsigned, typename... Args> + struct Dispatch // Line 9 + : public Unary<Args...> + {}; + + template<typename... Args> + struct Variadic + : public Dispatch<sizeof...(Args), Args...> + {}; +}; + +int main() +{ + S<void>::Variadic<void> z; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic128.C b/gcc/testsuite/g++.dg/cpp0x/variadic128.C new file mode 100644 index 0000000000..8c2d3b2335 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic128.C @@ -0,0 +1,16 @@ +// PR c++/50303 +// { dg-do compile { target c++11 } } + +template<typename Interface> +struct A1 { +}; + +template<template<class I> class... Actions> +void g2() { + g2<Actions...>(); +} + +int main() +{ + g2<A1>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic129.C b/gcc/testsuite/g++.dg/cpp0x/variadic129.C new file mode 100644 index 0000000000..7118301418 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic129.C @@ -0,0 +1,19 @@ +// PR c++/50830 +// { dg-do compile { target c++11 } } + +template<template<class> class...> +struct list_templates {}; + +template<class> +struct aa {}; + +template<class... T> +struct test {}; + +template<template<class> class... F, class T> +struct test<list_templates<F...>, T> +{ + struct inner {}; +}; + +test<list_templates<aa>, int> a4; // error diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic131.C b/gcc/testsuite/g++.dg/cpp0x/variadic131.C new file mode 100644 index 0000000000..3006f87ed2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic131.C @@ -0,0 +1,11 @@ +// PR c++/38543 +// { dg-do compile { target c++11 } } + +template< typename ... T > void foo( T ... args ); +template<> void foo( ){} +template<> void foo(int,double){} +int main() +{ + foo( 0, 0.0 ); + return 55; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic132.C b/gcc/testsuite/g++.dg/cpp0x/variadic132.C new file mode 100644 index 0000000000..1b9c286868 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic132.C @@ -0,0 +1,27 @@ +// PR c++/53305 +// { dg-do compile { target c++11 } } + +template<class... Ts> struct tuple { }; + +struct funct +{ + template<class... argTs> + int operator()(argTs...); +}; + +template<class...> struct test; + +template<template <class...> class tp, + class... arg1Ts, class... arg2Ts> +struct test<tp<arg1Ts...>, tp<arg2Ts...>> +{ + template<class func, class...arg3Ts> + auto test2(func fun, arg1Ts... arg1s, arg3Ts... arg3s) + -> decltype(fun(arg1s..., arg3s...)); +}; + +int main() +{ + test<tuple<>, tuple<char,int>> t2; + t2.test2(funct(), 'a', 2); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic133.C b/gcc/testsuite/g++.dg/cpp0x/variadic133.C new file mode 100644 index 0000000000..0265f0991c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic133.C @@ -0,0 +1,46 @@ +// PR c++/53039 +// { dg-do compile { target c++11 } } + +template <class, class> +struct is_convertible +{ + static const bool value = true; +}; + +template<bool, class T> +struct enable_if +{ + typedef T type; +}; + +template <bool...> +struct Xs +{ + static const bool value = true; +}; + +template<typename... BTs> + class BType + { + template <typename... BUs, + typename enable_if< + Xs<is_convertible<BUs, BTs>::value...>::value, + bool>::type = false> + void fooX(BUs&&...); + }; + +template <typename... ATs> + struct AType + { + template <typename... AUs, + typename enable_if< + Xs<is_convertible<AUs, ATs>::value...>::value, + bool>::type = false> + void foo(AUs&&...); + }; + +int main() +{ + AType<int, int> t; + t.foo(1, 1); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic134.C b/gcc/testsuite/g++.dg/cpp0x/variadic134.C new file mode 100644 index 0000000000..d4181b02c8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic134.C @@ -0,0 +1,17 @@ +// PR c++/53862 +// { dg-do compile { target c++11 } } + +typedef unsigned long size_t; + +template<typename> struct is_scalar { static const bool value = true; }; +template<bool, typename T> struct enable_if { typedef T type; }; + +template <size_t N, typename... Args> +void f(Args...) {} + +template <size_t N, typename T, typename... Args> +typename enable_if<is_scalar<T>::value, void>::type f(T, Args...) {} + +int main() { + f<1>(1); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic2.C b/gcc/testsuite/g++.dg/cpp0x/variadic2.C index d62a54245e..207a80648f 100644 --- a/gcc/testsuite/g++.dg/cpp0x/variadic2.C +++ b/gcc/testsuite/g++.dg/cpp0x/variadic2.C @@ -8,8 +8,8 @@ class tuple3; template<typename T1, typename T2, typename... Rest> struct two_or_more {}; // { dg-error "provided for" } -typedef two_or_more<int> bad; // { dg-error "2 or more" } -// { dg-error "invalid type" "" { target *-*-* } 11 } +typedef two_or_more<int> bad; // { dg-error "2 or more" "2 or more" } +// { dg-error "invalid type" "invalid type" { target *-*-* } 11 } void f() { diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic20.C b/gcc/testsuite/g++.dg/cpp0x/variadic20.C index 7f2446e558..bfb42bea09 100644 --- a/gcc/testsuite/g++.dg/cpp0x/variadic20.C +++ b/gcc/testsuite/g++.dg/cpp0x/variadic20.C @@ -37,11 +37,11 @@ struct metatuple<First, Second, Metafunctions...> { // { dg-error "struct" } int a0[metatuple<>::value == 0? 1 : -1]; int a1[metatuple<add_pointer>::value == 1? 1 : -1]; -int a2a[metatuple<add_pointer, add_pointer>::value == 2? 1 : -1]; // { dg-error "ambiguous|array bound" } +int a2a[metatuple<add_pointer, add_pointer>::value == 2? 1 : -1]; // { dg-error "ambiguous|array bound" "bound" } int a2b[metatuple<add_reference, add_reference>::value == 2? 1 : -1]; -int a3[metatuple<add_pointer, add_reference>::value == 3? 1 : -1]; // { dg-error "ambiguous|array bound" } +int a3[metatuple<add_pointer, add_reference>::value == 3? 1 : -1]; // { dg-error "ambiguous|array bound" "bound" } int a4[metatuple<add_reference>::value == 4? 1 : -1]; int a5[metatuple<add_reference, add_pointer>::value == 5? 1 : -1]; -// { dg-error "incomplete" "" { target *-*-* } 40 } -// { dg-error "incomplete" "" { target *-*-* } 42 } +// { dg-error "incomplete" "incomplete" { target *-*-* } 40 } +// { dg-error "incomplete" "incomplete" { target *-*-* } 42 } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic35.C b/gcc/testsuite/g++.dg/cpp0x/variadic35.C index 1f21976e86..666a1f5d03 100644 --- a/gcc/testsuite/g++.dg/cpp0x/variadic35.C +++ b/gcc/testsuite/g++.dg/cpp0x/variadic35.C @@ -5,6 +5,5 @@ void get_ith(const Args&... args); // { dg-message "note" } void f() { get_ith<1, float>(1, 2.0, 'x'); - get_ith<1, int, double, char, int>(1, 2.0, 'x'); // { dg-error "no matching function" } - // { dg-message "candidate" "candidate note" { target *-*-* } 8 } + get_ith<1, int, double, char, int>(1, 2.0, 'x'); // { dg-error "too few arguments" } } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic4.C b/gcc/testsuite/g++.dg/cpp0x/variadic4.C index 9257a92d5b..1bdad3256f 100644 --- a/gcc/testsuite/g++.dg/cpp0x/variadic4.C +++ b/gcc/testsuite/g++.dg/cpp0x/variadic4.C @@ -1,4 +1,4 @@ -// { dg-options "-std=gnu++0x" } +// { dg-options "-std=gnu++0x -fabi-version=0" } // { dg-do compile } template<typename... Args> class tuple {}; @@ -9,7 +9,7 @@ void f_two(tuple<int, float>) {} void f_nested(tuple<int, tuple<double, char>, float>) { } -// { dg-final { scan-assembler "_Z6f_none5tupleIIEE" } } -// { dg-final { scan-assembler "_Z5f_one5tupleIIiEE" } } -// { dg-final { scan-assembler "_Z5f_two5tupleIIifEE" } } -// { dg-final { scan-assembler "_Z8f_nested5tupleIIiS_IIdcEEfEE" } } +// { dg-final { scan-assembler "_Z6f_none5tupleIJEE" } } +// { dg-final { scan-assembler "_Z5f_one5tupleIJiEE" } } +// { dg-final { scan-assembler "_Z5f_two5tupleIJifEE" } } +// { dg-final { scan-assembler "_Z8f_nested5tupleIJiS_IJdcEEfEE" } } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic42.C b/gcc/testsuite/g++.dg/cpp0x/variadic42.C index 47d9b66da5..3ec68e8b1f 100644 --- a/gcc/testsuite/g++.dg/cpp0x/variadic42.C +++ b/gcc/testsuite/g++.dg/cpp0x/variadic42.C @@ -1,4 +1,4 @@ -// { dg-options "-std=gnu++0x" } +// { dg-options "-std=gnu++0x -fabi-version=5" } // { dg-do compile } template<typename... Args> void f(Args...) { } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic60.C b/gcc/testsuite/g++.dg/cpp0x/variadic60.C index b86711ff66..8e1681eecc 100644 --- a/gcc/testsuite/g++.dg/cpp0x/variadic60.C +++ b/gcc/testsuite/g++.dg/cpp0x/variadic60.C @@ -1 +1 @@ -template<typename... Args> class tuple; // { dg-error "variadic templates" } +template<typename... Args> class tuple; // { dg-error "variadic templates" "" { target c++98 } } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic65.C b/gcc/testsuite/g++.dg/cpp0x/variadic65.C index 1c815d1d90..77be10676a 100644 --- a/gcc/testsuite/g++.dg/cpp0x/variadic65.C +++ b/gcc/testsuite/g++.dg/cpp0x/variadic65.C @@ -5,4 +5,9 @@ template<typename T1 = unused, typename T2 = unused, typename T3 = unused, struct tuple {}; template<typename... Args> -void foo(tuple<Args...>) { } // { dg-bogus "cannot expand" "" { xfail *-*-* } } +tuple<Args...> foo() { } // { dg-bogus "cannot expand" "" } + +int main() +{ + foo<int,int,int,int,int,int>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic74.C b/gcc/testsuite/g++.dg/cpp0x/variadic74.C index 19b6b11d8e..312fe9d704 100644 --- a/gcc/testsuite/g++.dg/cpp0x/variadic74.C +++ b/gcc/testsuite/g++.dg/cpp0x/variadic74.C @@ -1,8 +1,8 @@ -// { dg-options "-std=gnu++0x" } +// { dg-do compile { target c++11 } } template <class... Types> class A { public: - template <Types... Values> class X { /* ... */ }; // { dg-error "not a valid type for a template constant parameter" } + template <Types... Values> class X { /* ... */ }; // { dg-error "not a valid type for a template non-type parameter" } }; template<class... Types> class B @@ -19,8 +19,8 @@ float f; A<int*, float*>::X<&i, &f> apple1; B<int, float>::X<&i, &f> banana1; -A<int*, float*>::X<&i> apple2; // { dg-error "wrong number of template arguments" } -// { dg-error "invalid type" "" { target *-*-* } 22 } -A<int*, float*>::X<&i, &f, &f> apple3; // { dg-error "wrong number of template arguments" } -// { dg-error "invalid type" "" { target *-*-* } 24 } +A<int*, float*>::X<&i> apple2; // { dg-error "wrong number of template arguments" "wrong number" } +// { dg-error "invalid type" "invalid" { target *-*-* } 22 } +A<int*, float*>::X<&i, &f, &f> apple3; // { dg-error "wrong number of template arguments" "wrong number" } +// { dg-error "invalid type" "invalid" { target *-*-* } 24 } A<int, float> apple4; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic82.C b/gcc/testsuite/g++.dg/cpp0x/variadic82.C index fb3ddb3c9b..03aec80211 100644 --- a/gcc/testsuite/g++.dg/cpp0x/variadic82.C +++ b/gcc/testsuite/g++.dg/cpp0x/variadic82.C @@ -3,9 +3,9 @@ template<typename> struct A; -template<typename... T> struct A<T*...> // { dg-bogus "cannot expand" "" { xfail *-*-* } } +template<typename... T> struct A<T*...> // { dg-bogus "cannot expand" "" } { struct B; }; -A<void*> a; // { dg-bogus "incomplete type" "" { xfail *-*-* } } +A<void*> a; // { dg-bogus "incomplete type" "" } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic83.C b/gcc/testsuite/g++.dg/cpp0x/variadic83.C index 2613d625f0..c446e69742 100644 --- a/gcc/testsuite/g++.dg/cpp0x/variadic83.C +++ b/gcc/testsuite/g++.dg/cpp0x/variadic83.C @@ -3,6 +3,6 @@ template<typename> struct A; -template<typename... T> struct A<T...> { }; // { dg-bogus "cannot expand" "" { xfail *-*-* } } +template<typename... T> struct A<T...> { }; // { dg-bogus "cannot expand" "" } -A<int> a; // { dg-bogus "incomplete type" "" { xfail *-*-* } } +A<int> a; // { dg-bogus "incomplete type" "" } diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-37737-2.C b/gcc/testsuite/g++.dg/cpp0x/vt-37737-2.C index 2ff7e5b0b5..5514259ec3 100644 --- a/gcc/testsuite/g++.dg/cpp0x/vt-37737-2.C +++ b/gcc/testsuite/g++.dg/cpp0x/vt-37737-2.C @@ -4,7 +4,7 @@ template<class U, class... T> void f() // { dg-message "note" } { f<T...>(); // { dg-error "no matching" } - // { dg-message "candidate" "candidate note" { target *-*-* } 6 } + // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 6 } } template<> diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-55542.C b/gcc/testsuite/g++.dg/cpp0x/vt-55542.C new file mode 100644 index 0000000000..3d5efee87d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-55542.C @@ -0,0 +1,22 @@ +// PR c++/55542 +// { dg-options "-std=c++11" } + +template <typename ... P> +struct B +{ + template <typename O> + B (O *o, void (O::*f) (P ... p)) {} +}; +class C +{ + void foo (void *, int); + template <typename ... A> + void bar (A ... a); + B <void *> c; + B <void *, int> d; + C (int) : c (this, &C::bar), d (this, &C::foo) {} +}; +template <typename ... A> +void C::bar (A ...) +{ +} diff --git a/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x.C b/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x.C index 5ad9b61b83..5c5eeffb35 100644 --- a/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x.C +++ b/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x.C @@ -1,6 +1,6 @@ -// { dg-options "-std=gnu++98 -Wc++0x-compat" } -int static_assert; // { dg-warning "will become a keyword" } -int nullptr; // { dg-warning "will become a keyword" } +// { dg-options "-std=gnu++98 -Wc++11-compat" } +int static_assert; // { dg-warning "is a keyword" } +int nullptr; // { dg-warning "is a keyword" } void foo() { diff --git a/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x2.C b/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x2.C new file mode 100644 index 0000000000..116b233176 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x2.C @@ -0,0 +1,4 @@ +// PR c++/50810 +// { dg-options "-std=gnu++98 -Wc++11-compat" } + +signed char data[] = { 0xff }; // { dg-warning "narrowing" } diff --git a/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x3.C b/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x3.C new file mode 100644 index 0000000000..c3df9d99ed --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x3.C @@ -0,0 +1,4 @@ +// PR c++/50810 +// { dg-options "-std=gnu++98 -Wc++11-compat -Wno-narrowing" } + +signed char data[] = { 0xff }; |