diff options
Diffstat (limited to 'gcc-4.9/gcc/testsuite/g++.dg/cpp0x')
1507 files changed, 43025 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/Wliteral-suffix.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/Wliteral-suffix.C new file mode 100644 index 0000000..b9b975b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/Wliteral-suffix.C @@ -0,0 +1,28 @@ +// { dg-do run { target c++11 } } + +// Make sure -Wliteral-suffix is enabled by default and +// triggers as expected. + +#define BAR "bar" +#define PLUS_ONE + 1 + +#include <cstdint> +#include <cassert> + + +void +test() +{ + char c = '3'PLUS_ONE; // { dg-warning "invalid suffix on literal" } + char s[] = "foo"BAR; // { dg-warning "invalid suffix on literal" } + + assert(c == '4'); + assert(s[3] != '\0'); + assert(s[3] == 'b'); +} + +int +main() +{ + test(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/Wunused-parm.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/Wunused-parm.C new file mode 100644 index 0000000..232e484 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/Wunused-parm.C @@ -0,0 +1,24 @@ +// PR c++/57211 +// { dg-do compile { target c++11 } } +// { dg-options "-Wunused-parameter" } + +template <class T> T&& move(T&); + +struct A +{ + struct B + { + B& operator=(B&&); + }; + + B f; + + A& operator=(A&& p) = default; +}; + +int main() +{ + A a; + A b; + b = move(a); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/Wzero-as-null-pointer-constant-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/Wzero-as-null-pointer-constant-1.C new file mode 100644 index 0000000..a9dd155 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/Wzero-as-null-pointer-constant-1.C @@ -0,0 +1,162 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-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-4.9/gcc/testsuite/g++.dg/cpp0x/Wzero-as-null-pointer-constant-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/Wzero-as-null-pointer-constant-2.C new file mode 100644 index 0000000..5cb4022 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/Wzero-as-null-pointer-constant-2.C @@ -0,0 +1,15 @@ +// PR c++/56373 +// { dg-do compile { target c++11 } } +// { dg-options "-Wzero-as-null-pointer-constant" } + +struct shared_ptr +{ + shared_ptr(decltype(nullptr)); +}; + +void f() +{ + shared_ptr a = 0; // { dg-warning "zero as null pointer" } + shared_ptr b(0); // { dg-warning "zero as null pointer" } + shared_ptr c{0}; // { dg-warning "zero as null pointer" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/__func__.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/__func__.C new file mode 100644 index 0000000..7c2a712 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/__func__.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-pedantic" } + +const char* foo() +{ + return __func__; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/access01.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/access01.C new file mode 100644 index 0000000..55c951f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/access01.C @@ -0,0 +1,15 @@ +// PR c++/49042 +// { dg-do compile { target c++11 } } + +template <class T> +class A +{ + T p; +public: + template <class U> auto f() -> decltype(+p) { } +}; + +int main() +{ + A<int>().f<int>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/access02.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/access02.C new file mode 100644 index 0000000..74960a6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/access02.C @@ -0,0 +1,39 @@ +// PR c++/58954 +// { dg-require-effective-target c++11 } + +template<class T> +T&& declval(); + +template<class T> +struct foo_argument +{ + template<class Ret, class C, class Arg> + static Arg test(Ret (C::*)(Arg)); + + typedef decltype(test(&T::template foo<>)) type; +}; + +template<class T, class> +struct dependent { typedef T type; }; + +template<class T> +struct base +{ + template<class Ignore = void> + auto foo(int i) -> decltype(declval< + typename dependent<T&, Ignore>::type + >().foo_impl(i)); +}; + +struct derived : base<derived> +{ + friend struct base<derived>; +private: + int foo_impl(int i); +}; + +int main() +{ + foo_argument<derived>::type var = 0; + return var; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-0.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-0.C new file mode 100644 index 0000000..bcefe3f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-0.C @@ -0,0 +1,36 @@ +// { dg-do compile { target c++11 } } + +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 have the same type (DR 1286) + X<Y> y; + X<Z> z; + + // ... So these must compile. + f(z); // { dg-bogus "" } + g(y); // { dg-bogus "" } +} + +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-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-1.C new file mode 100644 index 0000000..c52ab46 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-1.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } + +// 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 "specialization" } + +template <class U> using Ptr = U*; +template<class U> struct Ptr<U*> {}; // { dg-error "specialization" } + +struct A { + using A = int;//{ dg-error "nested|has|same name as|class|in which|declared" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-10.C new file mode 100644 index 0000000..7c8bad9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-10.C @@ -0,0 +1,26 @@ +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-11.C new file mode 100644 index 0000000..5457433 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-11.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-12.C new file mode 100644 index 0000000..df23e55 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-12.C @@ -0,0 +1,4 @@ +// Origin: PR c++/51027 +// { dg-do compile { target c++11 } } + +using INT = int // { dg-error "expected|;|at end of input" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-13.C new file mode 100644 index 0000000..368e5af --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-13.C @@ -0,0 +1,24 @@ +// Origin PR c++/51191 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-14.C new file mode 100644 index 0000000..52f2201 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-14.C @@ -0,0 +1,14 @@ +// Origin: PR c++/51145 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-15.C new file mode 100644 index 0000000..2d617ab --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-15.C @@ -0,0 +1,17 @@ +// Origin PR c++/51194 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-16.C new file mode 100644 index 0000000..d934a93 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-16.C @@ -0,0 +1,28 @@ +// Origin PR c++/51143 +// { dg-do compile { target 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; // { dg-error "'A3' does not name a type" } + +int main() { } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-17.C new file mode 100644 index 0000000..bf947fb --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-17.C @@ -0,0 +1,21 @@ +// Origin PR c++/51289 +// { dg-do compile { target 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-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-18.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-18.C new file mode 100644 index 0000000..199b054 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-18.C @@ -0,0 +1,9 @@ +// Origin: PR c++/51541 +// { dg-do compile { target 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-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-19.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-19.C new file mode 100644 index 0000000..b101cb3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-19.C @@ -0,0 +1,31 @@ +// PR c++/53567 +// { dg-do compile { target c++11 } } + +template <unsigned int, bool> struct IntegerType { typedef unsigned type; }; + +template <class EnumT> +using UnderlyingEnumType = typename IntegerType<sizeof(EnumT), (EnumT(-1) > EnumT(0))>::type; + +template <class EnumT, class UnderlyingT = UnderlyingEnumType<EnumT>> +struct EnumMask +{ + constexpr EnumMask(EnumT val) : m_val(val) {} + operator EnumT() { return m_val; } + + EnumT m_val; +}; + +enum class A : unsigned { x }; + +template <class EnumT> +EnumMask<EnumT> operator ~(EnumT lhs) +{ + return EnumT(~unsigned(lhs) & unsigned(EnumT::maskAll)); // { dg-error "not a member" } + +} + +int main() +{ + ~A::x; + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-2.C new file mode 100644 index 0000000..0204f64 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-2.C @@ -0,0 +1,33 @@ +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-20.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-20.C new file mode 100644 index 0000000..078d257 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-21.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-21.C new file mode 100644 index 0000000..463f539 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-21.C @@ -0,0 +1,23 @@ +// PR c++/54575 +// { dg-do compile { target c++11 } } + +template<typename _From, typename _To> +struct is_convertible { static const bool value = true; }; + +template<bool> struct enable_if { }; +template<> struct enable_if<true> { typedef int type; }; + +template<typename _InIter> +using _RequireInputIter += typename enable_if<is_convertible<_InIter,bool>::value>::type; + +template<typename _Tp> struct X { + template<typename _InputIterator, + typename = _RequireInputIter<_InputIterator>> + void insert(_InputIterator) {} +}; + +template<typename> void foo() { + X<int> subdomain_indices; + subdomain_indices.insert(0); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-22.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-22.C new file mode 100644 index 0000000..1f6cb8f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-22.C @@ -0,0 +1,12 @@ +// The standard is unclear about whether this testcase is well-formed. +// Clang considers it well-formed, EDG not. Let's go with EDG for now. +// { dg-do compile { target c++11 } } + +template <class T> +using foo = typename T::bar; // { dg-error "this context" } + +class B +{ + typedef int bar; // { dg-error "private" } + foo<B> f; // { dg-message "required" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-23.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-23.C new file mode 100644 index 0000000..0e4ba45 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-23.C @@ -0,0 +1,17 @@ +// PR c++/52233 +// { dg-do compile { target c++11 } } + +template <typename t> +struct foo +{ + template <template <typename...> class... xs> + using type = int; +}; + +template <typename t, template <typename...> class... xs> +struct bar +{ + using type = typename foo<t>::template type<xs...>; +}; + +bar<int, foo> x; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-24.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-24.C new file mode 100644 index 0000000..b68fa93 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-24.C @@ -0,0 +1,24 @@ +// Origin: PR c++/53540 +// { dg-do compile { target c++11 } } + +template <typename T> +struct context +{ + typedef int type; +}; + +template <typename T> +void function() +{ + using ctx1 = context<T>; + typename ctx1::type f1; + + typedef context<T> ctx2; + typename ctx2::type f2; +} + +int main() +{ + function<int>(); +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-25.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-25.C new file mode 100644 index 0000000..a388ae4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-25.C @@ -0,0 +1,10 @@ +// PR c++/54859 +// { dg-do compile { target c++11 } } + +template<unsigned N> + using Num = int; + +template<typename... Types> + using Count = Num<sizeof...(Types)>; + +Count<int, char, void> i; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-26.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-26.C new file mode 100644 index 0000000..dd4cc02 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-26.C @@ -0,0 +1,10 @@ +// Origin: PR c++/54466 +// { dg-do compile { target c++11 } } + +template<typename T> + struct X { }; + +template<typename T> + using Y = const X<T>; + +using Z = Y<int>; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-27.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-27.C new file mode 100644 index 0000000..91208ab --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-27.C @@ -0,0 +1,11 @@ +// Origin: PR c++/54875 +// { dg-do compile { target c++11 } } + +template<typename T> +using AddConst = T const; + +enum FwdEnum : int; + +int main() { + AddConst<FwdEnum> *ptr = nullptr; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-28.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-28.C new file mode 100644 index 0000000..086b5e5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-28.C @@ -0,0 +1,7 @@ +// Origin: PR c++/54401 +// { dg-do compile { target c++11 } } + +template<typename> +struct X { + using type = T; // { dg-error "expected type-specifier|does not name a type" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-29.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-29.C new file mode 100644 index 0000000..f6cc695 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-29.C @@ -0,0 +1,10 @@ +// Origin: PR c++/52343 +// { dg-do compile { target c++11 } } + +template<typename> +using A = int; + +template<template<class> class> +struct B {}; + +B<A> b; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-3.C new file mode 100644 index 0000000..2204c25 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-3.C @@ -0,0 +1,42 @@ +// { dg-do compile { target c++11 } } + +// 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-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-30.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-30.C new file mode 100644 index 0000000..7ad5e6d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-30.C @@ -0,0 +1,15 @@ +// Origin PR c++/55311 +// { dg-do compile { target c++11 } } + +template <const char *const C, typename T> +struct A +{}; + +struct B {}; + +extern constexpr char HELLO_WORLD[] = "hello world"; + +A<HELLO_WORLD, B> g; // <-- This works fine + +template <typename T> +using PartiallySpecialized = A<HELLO_WORLD, T>; // <-- This fails diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-31.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-31.C new file mode 100644 index 0000000..83eea47 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-31.C @@ -0,0 +1,20 @@ +// Origin: PR c++/55663 +// { dg-do compile { target c++11 } } + +template <typename> +constexpr bool the_truth () { return true; } + +template <bool> + struct Takes_bool { }; + +template<bool B> + using Alias = Takes_bool<B>; + +template<typename T> + struct test { using type = Alias<the_truth<T>()>; }; + +int main () { + test<int> a; + + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-32.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-32.C new file mode 100644 index 0000000..cb39edd --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-32.C @@ -0,0 +1,20 @@ +// PR c++/56611 +// { dg-do compile { target c++11 } } + +template<class T> struct remove_reference { typedef T type; }; +template<class T> struct remove_reference<T&> { typedef T type; }; +template<class T> T declval() { return T(); } + +int f(int, int){return 0;} +struct Func{}; + +template<class... Args> using result2 += decltype(f(declval<typename remove_reference<Args>::type>()...)); + +template<class Sig> struct R; +template<class This, class... Args> struct R< This(Args...) > +{ + typedef result2<Args...> type; +}; + +typedef R< Func(int, int) >::type R_type; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-33.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-33.C new file mode 100644 index 0000000..25781a4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-33.C @@ -0,0 +1,14 @@ +// PR c++/51239 +// { dg-require-effective-target c++11 } + +template<class... x> +class list{}; +template<class a, class... b> +using tail=list<b...>; +template <class...T> +void f(tail<T...>); // { dg-error "alias" } + +int main() +{ + f<int,int>({}); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-33a.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-33a.C new file mode 100644 index 0000000..a1c442e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-33a.C @@ -0,0 +1,15 @@ +// PR c++/51239 +// { dg-require-effective-target c++11 } +// This variant should work because tail is equivalent to list. + +template<class y, class... x> +class list{}; +template<class a, class... b> +using tail=list<a, b...>; +template <class...T> +void f(tail<T...>); + +int main() +{ + f<int,int>({}); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-34.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-34.C new file mode 100644 index 0000000..4306ab7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-34.C @@ -0,0 +1,23 @@ +// PR c++/57222 +// { dg-require-effective-target c++11 } + +template <template <typename T> class Templ> +using Bool = Templ<bool>; + +template <typename T> +class Foo { +private: +public: + template<template<typename U> class Templ> + void method(Bool<Templ> boolTempl); +}; + +template <typename T> +template <template <typename U> class Templ> +void Foo<T>::method(Bool<Templ> boolTempl) { +} + +int main() { + Foo<char> foo; + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-35.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-35.C new file mode 100644 index 0000000..f412b30 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-35.C @@ -0,0 +1,9 @@ +// PR c++/57279 +// { dg-require-effective-target c++11 } + +typedef void fc1() const; // OK +typedef void frr1() &&; // OK +typedef void fcr1() const &; +using fc2 = void() const; // #4 +using frr2 = void() &&; // OK +using fcr2 = void() const &; // #6 diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-36.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-36.C new file mode 100644 index 0000000..dd3a422 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-36.C @@ -0,0 +1,6 @@ +// PR c++/53658 +// { dg-do compile { target c++11 } } + +struct A; +template <typename> using Foo = const A; +template <typename Item> Foo <Item> bar(); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-37.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-37.C new file mode 100644 index 0000000..d6a3e12 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-37.C @@ -0,0 +1,21 @@ +// PR c++/57138 +// { dg-do compile { target c++11 } } + +template <template <typename ... X> class T, typename ... Y> +struct D +{ + template <typename ... Z> + using type = T <Y..., Z...>; // { dg-error "pack expansion" } +}; +template <typename T> +class A {}; +template <typename X, typename Y> +struct B; +template <typename T> +struct B <int, T> +{ + typedef A <T> type; +}; +template <typename X, typename Y> +using C = typename B <X, Y>::type; +struct E : public D <C> {}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-38.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-38.C new file mode 100644 index 0000000..bc98737 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-38.C @@ -0,0 +1,41 @@ +// PR c++/58435 +// { dg-do compile { target c++11 } } + +template<typename T, typename U> +struct same { static const bool value = false; }; +template<typename T> +struct same<T, T> { static const bool value = true; }; + +template <template <typename> class F, typename T> struct apply +{ typedef F<T> type; }; +template <template <typename> class F, typename T> struct applyc +{ typedef const F<T> type; }; +template <template <typename> class F, typename T> struct applyv +{ typedef volatile F<T> type; }; +template <template <typename> class F, typename T> struct applycv +{ typedef const volatile F<T> type; }; + +template <typename T> using map = T; +template <typename T> using mapc = const T; +template <typename T> using mapv = volatile T; +template <typename T> using mapcv = const volatile T; + +static_assert(same<apply<map, int>::type, int>::value, ""); +static_assert(same<apply<mapc, int>::type, const int>::value, ""); +static_assert(same<apply<mapv, int>::type, volatile int>::value, ""); +static_assert(same<apply<mapcv, int>::type, const volatile int>::value, ""); + +static_assert(same<applyc<map, int>::type, const int>::value, ""); +static_assert(same<applyc<mapc, int>::type, const int>::value, ""); +static_assert(same<applyc<mapv, int>::type, const volatile int>::value, ""); +static_assert(same<applyc<mapcv, int>::type, const volatile int>::value, ""); + +static_assert(same<applyv<map, int>::type, volatile int>::value, ""); +static_assert(same<applyv<mapc, int>::type, const volatile int>::value, ""); +static_assert(same<applyv<mapv, int>::type, volatile int>::value, ""); +static_assert(same<applyv<mapcv, int>::type, const volatile int>::value, ""); + +static_assert(same<applycv<map, int>::type, const volatile int>::value, ""); +static_assert(same<applycv<mapc, int>::type, const volatile int>::value, ""); +static_assert(same<applycv<mapv, int>::type, const volatile int>::value, ""); +static_assert(same<applycv<mapcv, int>::type, const volatile int>::value, ""); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-39.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-39.C new file mode 100644 index 0000000..9fe5538 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-39.C @@ -0,0 +1,11 @@ +// PR c++/58856 +// { dg-require-effective-target c++11 } + +template <typename T> +struct U1 {}; + +template <typename T1, typename... Ts> +using U2 = U1<T1>; + +template <typename T1, typename... Ts> +using U3 = U2<T1, Ts...>; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-4.C new file mode 100644 index 0000000..60edaf7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-4.C @@ -0,0 +1,14 @@ +// { dg-do compile { target c++11 } } + +// [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-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-40.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-40.C new file mode 100644 index 0000000..f8bff78 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-40.C @@ -0,0 +1,33 @@ +// PR c++/58170 +// { dg-require-effective-target c++11 } +// { dg-prune-output "not declared" } +// { dg-prune-output "expected" } + +template <typename T, typename U> +struct base { + template <typename V> + struct derived; +}; + +template <typename T, typename U> +template <typename V> +struct base<T, U>::derived : public base<T, V> { +}; + +// This (wrong?) alias declaration provokes the crash. +template <typename T, typename U, typename V> +using alias = base<T, U>::derived<V>; // { dg-error "template|typename" } + +// This one works: +// template <typename T, typename U, typename V> +// using alias = typename base<T, U>::template derived<V>; + +template <typename T> +void f() { + alias<T, bool, char> m{}; + (void) m; +} + +int main() { + f<int>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-41.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-41.C new file mode 100644 index 0000000..c444217 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-41.C @@ -0,0 +1,18 @@ +// PR c++/60182 +// { dg-require-effective-target c++11 } + +class B {}; +template <typename> using __allocator_base = B; +template <typename> class F : __allocator_base<int> {}; +class C {}; +template <typename, typename = F<int> > class G : C {}; +template <typename> class D; +class A { + using Container = G<D<char>>; + A(); + A(D<char> const &); + Container m_elements; +}; +template <template <class, class> class C, class A = F<D<int>>> +void doSomething(C<D<char>, A> &); +A::A(D<char> const &) : A() { doSomething(m_elements); } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-5.C new file mode 100644 index 0000000..559fc51 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-5.C @@ -0,0 +1,34 @@ +// { dg-do compile { target c++11 } } + +// 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-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-6.C new file mode 100644 index 0000000..e0faf2b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-6.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } + +// 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-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-7.C new file mode 100644 index 0000000..f5911d9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-7.C @@ -0,0 +1,23 @@ +// { dg-do compile { target c++11 } } + +// 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-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-8.C new file mode 100644 index 0000000..c40fbbb --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-8.C @@ -0,0 +1,32 @@ +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-9.C new file mode 100644 index 0000000..5794617 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-9.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +template <class T> +struct A { + using Result = T; +}; +template <class A> using Arg = typename A::Result; +Arg<A<int>> b; + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-debug-0.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-debug-0.C new file mode 100644 index 0000000..524216a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-debug-0.C @@ -0,0 +1,13 @@ +// Origin: PR c++/51032 +// { dg-do compile { target c++11 } } +// { dg-skip-if "No stabs" { aarch64*-*-* mmix-*-* *-*-aix* alpha*-*-* hppa*64*-*-* ia64-*-* *-*-vxworks* nios2-*-* } { "*" } { "" } } +// { dg-options "-gstabs+" } + +template <class C> +struct A { + template<class U> using B = U*; + int a; +}; + +A<int> a; + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1286.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1286.C new file mode 100644 index 0000000..0c545c7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1286.C @@ -0,0 +1,13 @@ +// DR 1286: An alias template can be equivalent to an underlying template. +// { dg-do compile { target c++11 } } + +template <class T, class U> struct same; +template <class T> struct same<T,T> {}; + +template <class T> struct A {}; +template <class T> using B = A<T>; + +template <template <class> class T> class C {}; + +void f(C<B>) { } // { dg-final { scan-assembler "_Z1f1CI1AE" } } +same<C<A>, C<B> > s; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1286a.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1286a.C new file mode 100644 index 0000000..1780c9a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1286a.C @@ -0,0 +1,60 @@ +// DR 1286 +// { dg-do compile { target c++11 } } + +template <class,class> struct same; +template <class T> struct same<T,T> {}; + +template <class,class> struct different {}; +template <class T> struct different<T,T>; + +template<typename T, typename U = T> struct A; +template<template <class...> class> struct X; + +// equivalent to A +template<typename V, typename W> +using B = A<V, W>; + +same<X<A>,X<B>> s1; + +// not equivalent to A: not all parameters used +template<typename V, typename W> +using C = A<V>; + +different<X<A>,X<C>> d1; + +// not equivalent to A: different number of parameters +template<typename V> +using D = A<V>; + +different<X<A>,X<D>> d2; + +// not equivalent to A: template-arguments in wrong order +template<typename V, typename W> +using E = A<W, V>; + +different<X<A>,X<E>> d3; + +// equivalent to A: default arguments not considered +template<typename V, typename W = int> +using F = A<V, W>; + +same<X<A>,X<F>> s2; + +// equivalent to A and B +template<typename V, typename W> +using G = A<V, W>; + +same<X<A>,X<G>> s3; +same<X<B>,X<G>> s3b; + +// equivalent to E +template<typename V, typename W> +using H = E<V, W>; + +same<X<E>,X<H>> s4; + +// not equivalent to A: argument not identifier +template<typename V, typename W> +using I = A<V, typename W::type>; + +different<X<A>,X<I>> d4; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1286b.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1286b.C new file mode 100644 index 0000000..fef9818 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1286b.C @@ -0,0 +1,12 @@ +// PR c++/60328 +// { dg-require-effective-target c++11 } + +template <class _T, class... _Rest> +struct Foo +{ + template <class _TT, class... _RR> + using Bar = Foo<_TT, _RR...>; + + using Normal = Foo<_Rest...>; + using Fail = Bar<_Rest...>; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-enum-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-enum-1.C new file mode 100644 index 0000000..260a193 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-enum-1.C @@ -0,0 +1,47 @@ +// PR c++/57734 +// { dg-do compile { target c++11 } } + +template<typename T, typename U> +struct same_type { static const bool value = false; }; + +template<typename T> +struct same_type<T, T> { static const bool value = true; }; + +enum e { zero }; +enum class eclass { one }; + +template<typename T> +using enum_alias = e; + +template<typename T> +using eclass_alias = eclass; + +typedef enum_alias<void> etest0; +typedef enum_alias<void> etest0; +typedef enum_alias<int> etest0; +typedef enum_alias<int> etest1; + +static_assert (same_type<etest0, etest1>::value, ""); + +typedef eclass_alias<void> ectest0; +typedef eclass_alias<void> ectest0; +typedef eclass_alias<int> ectest0; +typedef eclass_alias<int> ectest1; + +static_assert (same_type<ectest0, ectest1>::value, ""); + +template<typename T> +enum_alias<T> efoo(T f) { return enum_alias<T>::zero; } + +template<typename T> +constexpr enum_alias<T> cefoo(T f) { return enum_alias<T>::zero; } + +static_assert ( cefoo(1) == e::zero, ""); + +template<typename T> +eclass_alias<T> ecfoo(T f) { return eclass_alias<T>::one; } + +template<typename T> +constexpr eclass_alias<T> cecfoo(T f) { return eclass_alias<T>::one; } + +static_assert ( cecfoo(1) == eclass::one, ""); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alignof.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alignof.C new file mode 100644 index 0000000..92422f9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alignof.C @@ -0,0 +1,5 @@ +// { dg-do compile { target c++11 } } +int main(void) +{ + static_assert(alignof(int) == __alignof(int), "alignof(int) does not equal __alignof(int)"); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alignof2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alignof2.C new file mode 100644 index 0000000..d571d9d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alignof2.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-pedantic" } +int main(void) +{ + alignof(int); //ok with a type but not with an expression + alignof(3); // { dg-warning "alignof" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alignof3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alignof3.C new file mode 100644 index 0000000..c349cec --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alignof3.C @@ -0,0 +1,6 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-pedantic" } +int main(void) +{ + alignof(void (void)); // { dg-warning "function type" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alignof4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alignof4.C new file mode 100644 index 0000000..ca3c47a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alignof4.C @@ -0,0 +1,7 @@ +// PR c++/51316 +// { dg-do compile { target c++11 } } + +int main() +{ + alignof(int []); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto1.C new file mode 100644 index 0000000..b8d3905 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto1.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-std=c++98 -Wc++11-compat" } + +// Test warning for use of auto in C++98 mode with C++11 +// compatibility warnings +void f() +{ + auto int x = 5; // { dg-warning "changes meaning" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto10.C new file mode 100644 index 0000000..296873e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto10.C @@ -0,0 +1,21 @@ +// Positive test for auto +// { dg-do run { target c++11 } } + +#include <typeinfo> +extern "C" void abort(); + +int main() +{ + if (auto i = 42L) + { + if (typeid (i) != typeid (long int)) + abort (); + } + + while (auto i = 1) + { + if (typeid (i) != typeid (int)) + abort (); + break; + } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto11.C new file mode 100644 index 0000000..208f512 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto11.C @@ -0,0 +1,12 @@ +// PR c++/38256 +// { dg-do compile { target c++11 } } + +template<int> struct A +{ + template<typename T> operator T(); +}; + +void foo() +{ + A<0>().operator auto(); // { dg-error "auto" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto14.C new file mode 100644 index 0000000..0ada265 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto14.C @@ -0,0 +1,28 @@ +// PR c++/40306, c++/40307 +// { dg-do run { target c++11 } } + +template< typename T > +struct test { + test run() { + auto tmp = *this; + return tmp; + } + test run_pass() { + test tmp( *this ); + return tmp; + } + + test run_fail() { + auto tmp( *this ); + return tmp; + } +}; + +int main() +{ + test<int> x; + x.run(); + x.run_pass(); + x.run_fail(); + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto15.C new file mode 100644 index 0000000..ca5758d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto15.C @@ -0,0 +1,13 @@ +// { dg-do compile { target c++11 } } + +template< typename Fn > struct function; + +template< typename Result, typename ... ArgTypes > +struct function< auto (ArgTypes...)->Result > { +}; + +int main() +{ + function< auto(double)->int > y; + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto16.C new file mode 100644 index 0000000..e9754f3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto16.C @@ -0,0 +1,7 @@ +// PR c++/40619 +// { dg-do compile { target c++11 } } + +template<typename U> struct X {}; + +template<typename T> auto f(T t) -> X<decltype(t+1)> {} +template<typename T> auto g(T t) -> X<decltype(t+1)> {} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto17.C new file mode 100644 index 0000000..7f9529e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto17.C @@ -0,0 +1,10 @@ +// PR c++/42567 +// { dg-do compile { target c++11 } } + +template<typename B> +struct A { + template<typename C> + void fn(C c) { + auto& key = *c; + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto18.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto18.C new file mode 100644 index 0000000..e6ddf0c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto18.C @@ -0,0 +1,6 @@ +// { dg-do compile { target c++11 } } + +void f() +{ + auto val = val; // { dg-error "auto" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto19.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto19.C new file mode 100644 index 0000000..d27d437 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto19.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } + +struct Explicit { + Explicit() = default; // Line 2 + explicit Explicit(const Explicit&){} +} ex; + +auto ex2(ex); // Line 6 diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto2.C new file mode 100644 index 0000000..cff36d2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto2.C @@ -0,0 +1,73 @@ +// Positive test for auto +// { dg-do run { target c++11 } } + +#include <typeinfo> +extern "C" void abort(); + +int f() {} + +struct A +{ + int i; + int f() {} + A operator+(A a) { return a; } +}; + +template <class T> +void g(T t) +{ + auto x = t+t; + if (typeid(x) != typeid(t+t)) + abort(); + + auto p = new auto(&t); + if (typeid(p) != typeid(T**)) + abort(); +} + +int main() +{ + auto i = 42; + if (typeid (i) != typeid (int)) + abort(); + + auto *p = &i; + if (typeid (p) != typeid (int*)) + abort(); + + auto *p2 = &p; + if (typeid (p2) != typeid (int**)) + abort(); + + auto (*fp)() = f; + if (typeid (fp) != typeid (int (*)())) + abort(); + + auto A::* pm = &A::i; + if (typeid (pm) != typeid (int A::*)) + abort(); + + auto (A::*pmf)() = &A::f; + if (typeid (pmf) != typeid (int (A::*)())) + abort(); + + g(42); + g(10.f); + g(A()); + + auto *p3 = new auto (i); + if (typeid (p3) != typeid (int*)) + abort(); + + for (auto idx = i; idx != 0; idx = 0); + while (auto idx = 0); + if (auto idx = 1); + + switch (auto s = i) + { + case 42: + break; + } + + auto j = 42, k = 24; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto20.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto20.C new file mode 100644 index 0000000..fe9925d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto20.C @@ -0,0 +1,20 @@ +// Test for proper non-deduced context handling of the initializer +// for an auto declaration/new. +// { dg-do compile { target c++11 } } + +struct with_apply +{ + template <unsigned> + void apply(const double&){} +}; + +auto p = &with_apply::apply<0>; +auto pp = new auto(&with_apply::apply<0>); + +template <class T> +void f() +{ + auto p = &T::template apply<0>; +} + +template void f<with_apply>(); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto21.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto21.C new file mode 100644 index 0000000..a827b3d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto21.C @@ -0,0 +1,5 @@ +// Origin PR c++/47208 +// { dg-do compile { target c++11 } } + +constexpr auto list = { }; // { dg-error "deducing from brace-enclosed initializer list requires #include <initializer_list>" } +static const int l = list.size(); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto22.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto22.C new file mode 100644 index 0000000..4ae1d1c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto22.C @@ -0,0 +1,21 @@ +// PR c++/47999 +// { dg-do compile { target c++11 } } + +int& identity(int& i) +{ + return i; +} + +// In a function template, auto type deduction works incorrectly. +template <typename = void> +void f() +{ + int i = 0; + auto&& x = identity(i); // Type of x should be `int&`, but it is `int&&`. +} + +int main (int argc, char* argv[]) +{ + f(); + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto23.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto23.C new file mode 100644 index 0000000..f14c2b8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto23.C @@ -0,0 +1,4 @@ +// PR c++/46245 +// { dg-do compile { target c++11 } } + +template<auto f()->int> struct A { }; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto24.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto24.C new file mode 100644 index 0000000..d370cc6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto24.C @@ -0,0 +1,5 @@ +// PR c++/48599 +// { dg-do compile { target c++11 } } + +int v[1]; +auto (*p)[1] = &v; // { dg-error "array of .auto" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto25.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto25.C new file mode 100644 index 0000000..9e08a5b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto25.C @@ -0,0 +1,12 @@ +// PR c++/42056 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/auto26.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto26.C new file mode 100644 index 0000000..d355a63 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto26.C @@ -0,0 +1,21 @@ +// PR c++/43321 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/auto27.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto27.C new file mode 100644 index 0000000..f8e9097 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto27.C @@ -0,0 +1,6 @@ +// PR c++/51186 + +auto main()->int // { dg-error "std=" "std" { target { ! c++11 } } } + // { dg-error "auto" "auto" { target { ! c++11 } } 3 } + // { dg-error "no type" "no type" { target { ! c++11 } } 3 } +{ } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto28.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto28.C new file mode 100644 index 0000000..441d884 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto28.C @@ -0,0 +1,4 @@ +// PR c++/51404 +// { dg-do compile { target c++11 } } + +int i = auto().x; // { dg-error "invalid use of" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto29.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto29.C new file mode 100644 index 0000000..80fdc12 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto29.C @@ -0,0 +1,24 @@ +// PR c++/51401 +// { dg-do compile { target 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-4.9/gcc/testsuite/g++.dg/cpp0x/auto3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto3.C new file mode 100644 index 0000000..c2e5519 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto3.C @@ -0,0 +1,27 @@ +// Negative test for auto +// { dg-do compile { target c++11 } } + +#include <initializer_list> + +auto x; // { dg-error "auto" } + +// If the type deduced for the template parameter U is not the same in each +// deduction, the program is ill-formed. +auto i = 42, j = 42.0; // { dg-error "auto" } + +// New CWG issue +auto a[2] = { 1, 2 }; // { dg-error "auto|initializer_list" } + +template<class T> +struct A { }; + +A<int> A1; +// CWG issue 625 +A<auto> A2 = A1; // { dg-error "" } + +auto foo() { } // { dg-error "auto" "" { target { ! c++1y } } } + +void bar(auto i) // { dg-error "incomplete|auto" } +{ + (void)i; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto30.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto30.C new file mode 100644 index 0000000..cce67d5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto30.C @@ -0,0 +1,9 @@ +// Origin PR c++/51473 +// { dg-do compile { target 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-4.9/gcc/testsuite/g++.dg/cpp0x/auto31.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto31.C new file mode 100644 index 0000000..26a6560 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/auto32.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto32.C new file mode 100644 index 0000000..2aad34e --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/auto33.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto33.C new file mode 100644 index 0000000..dade5a8 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/auto34.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto34.C new file mode 100644 index 0000000..3682d60 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto34.C @@ -0,0 +1,18 @@ +// PR c++/51421 +// { dg-do compile { target c++11 } } + +int foo1(int); + +void bar1() +{ + auto i = foo1(i); // { dg-error "before deduction" } +} + +struct A {}; + +A foo2(A); + +void bar2() +{ + auto a = foo2(a); // { dg-error "before deduction" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto35.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto35.C new file mode 100644 index 0000000..55eebbe --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto35.C @@ -0,0 +1,11 @@ +// PR c++/53122 +// { dg-do compile { target c++11 } } + +template<typename... Args> + void foo(Args&&...) { } + +template<typename... Args> + void bar(Args&&...) +{ + auto fn = foo<Args...>; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto36.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto36.C new file mode 100644 index 0000000..586bc6e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto36.C @@ -0,0 +1,18 @@ +// PR c++/54903 +// { dg-do compile { target c++11 } } + +template<int N, int D> +struct Modulus +{ + static auto const value = N % D; +}; + +template<int N> +struct Angle +{ + static auto const value = Modulus<N, 360>::value; // ERROR + //static int const value = Modulus<N, 360>::value; // OK + //static auto const value = N % 360; // OK + + typedef Angle<value> type; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto37.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto37.C new file mode 100644 index 0000000..f4b2904 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto37.C @@ -0,0 +1,14 @@ +// PR c++/55003 +// { dg-do compile { target c++11 } } + +template<typename T> +struct A { + static const auto t + = (typename T::type)42; +}; + +struct X { + typedef int type; +}; + +A<X> a; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto38.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto38.C new file mode 100644 index 0000000..070a39b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto38.C @@ -0,0 +1,8 @@ +// PR c++/57183 +// { dg-do compile { target c++11 } } +// { dg-options "-Wunused-variable" } + +constexpr float PI_0 = 3.1415926F; +constexpr auto PI_1 = 3.1415926F; +const float PI_2 = 3.1415926F; +const auto PI_3 = 3.1415926F; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto39.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto39.C new file mode 100644 index 0000000..dfa1fb4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto39.C @@ -0,0 +1,6 @@ +// PR c++/58560 +// { dg-do compile { target c++11 } } + +typedef auto T; // { dg-error "typedef declared 'auto'" } + +void foo() { T(); } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto4.C new file mode 100644 index 0000000..36144fd --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto4.C @@ -0,0 +1,27 @@ +// Testcase for deduction of std::initializer_list for auto. +// { dg-do run { target c++11 } } + +#include <typeinfo> +#include <initializer_list> +extern "C" void abort(); + +template <class T> +void f (T t) +{ + auto ilt = { &t, &t }; + if (typeid(ilt) != typeid(std::initializer_list<T*>)) + abort(); + + auto il = { 1, 2, 3 }; + if (typeid(il) != typeid(std::initializer_list<int>)) + abort(); +} + +int main() +{ + auto il = { 1, 2, 3 }; + if (typeid(il) != typeid(std::initializer_list<int>)) + abort(); + + f('c'); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto40.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto40.C new file mode 100644 index 0000000..287191e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto40.C @@ -0,0 +1,11 @@ +// PR c++/58888 +// { dg-do compile { target c++11 } } + +#include <initializer_list> + +struct A +{ + static constexpr auto b{1.0}; +}; + +constexpr decltype(A::b) A::b; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto41.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto41.C new file mode 100644 index 0000000..b2a7755 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto41.C @@ -0,0 +1,5 @@ +// PR c++/58550 +// { dg-do compile { target c++11 } } + +auto foo(); // { dg-error "auto" "" { target { ! c++1y } } } +auto fp = foo; // { dg-error "auto" "" { target c++1y } } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto5.C new file mode 100644 index 0000000..8ed66d1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto5.C @@ -0,0 +1,22 @@ +// Testcase for non-dependent auto in templates +// { dg-do compile { target c++11 } } + +struct A +{ + template<class> void f(); +} a; + +template <class T> +void g() +{ + auto aa = a; + aa.f<int>(); + + auto p = new auto (a); + p->f<int>(); +} + +int main() +{ + g<double>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto7.C new file mode 100644 index 0000000..c213c74 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto7.C @@ -0,0 +1,13 @@ +// PR c++/37965 +// Negative test for auto +// { dg-do compile { target c++11 } } + +auto i = 6; +auto j; // { dg-error "has no initializer" } + +template<int> struct A +{ + static auto k = 7; // { dg-error "non-const" } + static auto l; // { dg-error "has no initializer" } + auto m; // { dg-error "non-static data member declared" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto9.C new file mode 100644 index 0000000..205bb96 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto9.C @@ -0,0 +1,123 @@ +// PR c++/37962 +// Negative test for auto +// { dg-do compile { target c++11 } } + +#include <typeinfo> +#include <stdarg.h> +#include <stddef.h> + +int i = *(auto *) 0; // { dg-error "auto" } +struct A *p = (auto *) 0; // { dg-error "auto" } +int *q = static_cast <auto *>(0); // { dg-error "auto" } +const int *r = const_cast <auto *>(q); // { dg-error "auto" } +const std::type_info &t1 = typeid (auto); // { dg-error "auto" } +const std::type_info &t2 = typeid (auto *); // { dg-error "auto" } + +struct A +{ + operator auto (); // { dg-error "auto" "" { target { ! c++1y } } } + operator auto *(); // { dg-error "auto" "" { target { ! c++1y } } } +}; + +struct A2 +{ + operator auto () -> int; // { dg-error "invalid use of" "" { target { ! c++1y } } } + operator auto *() -> int; // { dg-error "auto" } +}; + +template <typename> struct B +{ + enum { e }; +}; + +template <typename T> struct C +{ + C () : i () {} + int i; +}; + +bool d = (auto (A::*)()) 0; // { dg-error "auto" } + +void +foo () +{ + __extension__ (auto) { 0 }; // { dg-error "auto" } + C<int> c; + dynamic_cast<auto> (c); // { dg-error "auto" } + reinterpret_cast<auto> (c); // { dg-error "auto" } + int i = auto (0); // { dg-error "auto" } + auto p1 = new (auto); // { dg-error "auto" } + auto p2 = new (auto) (42); // { dg-error "invalid use of|deduce" } + offsetof (auto, fld); // { dg-error "auto" } + offsetof (auto *, fld); // { dg-error "auto" } + sizeof (auto); // { dg-error "auto" } + sizeof (auto *); // { dg-error "auto" } +} + +void +foo2 (void) +{ + __alignof__ (auto); // { dg-error "auto" } + __alignof__ (auto *); // { dg-error "auto" } + __typeof__ (auto) v1; // { dg-error "auto" } + __typeof__ (auto *) v2; // { dg-error "auto" } + __is_class (auto); // { dg-error "auto|expected" } + __is_pod (auto *); // { dg-error "auto|expected" } + __is_base_of (int, auto); // { dg-error "auto|expected" } + __is_base_of (auto, int); // { dg-error "auto|expected" } + __is_base_of (auto, auto *); // { dg-error "auto|expected" } +} + +B<auto> b; // { dg-error "auto|invalid" } +C<auto> c; // { dg-error "auto|invalid" } +C<auto *> c2; // { dg-error "auto|invalid" } + +enum : auto { EE = 0 }; // { dg-error "must be an integral type" } +enum struct D : auto * { FF = 0 }; // { dg-error "must be an integral type|declar|expected" } + +void +bar () +{ + try { } catch (auto i) { } // { dg-error "parameter" } + try { } catch (auto) { } // { dg-error "parameter" } + try { } catch (auto *i) { } // { dg-error "parameter" } + try { } catch (auto *) { } // { dg-error "parameter" } +} + +void +baz (int i, ...) +{ + va_list ap; + va_start (ap, i); + va_arg (ap, auto); // { dg-error "invalid use of" } + va_arg (ap, auto *); // { dg-error "invalid use of|expected" } + va_arg (ap, auto &); // { dg-error "invalid use of|expected" } + va_end (ap); +} + +template <typename T = auto> struct E {}; // { dg-error "invalid use of" } +template <class T = auto *> struct F {}; // { dg-error "invalid use of|expected" } + +auto fnlate () -> auto; // { dg-error "invalid use of" "" { target { ! c++1y } } } +auto fnlate2 () -> auto *; // { dg-error "invalid use of|expected" "" { target { ! c++1y } } } + +void +badthrow () throw (auto) // { dg-error "invalid use of" } +{ +} + +void +badthrow2 () throw (auto &) // { dg-error "invalid use of|expected" } +{ +} + +template <auto V = 4> struct G {}; // { dg-error "auto" } + +template <typename T> struct H { H (); ~H (); }; +H<auto> h; // { dg-error "invalid" } + +void qq (auto); // { dg-error "auto" } +void qr (auto*); // { dg-error "auto" } + +// PR c++/46145 +typedef auto autot; // { dg-error "auto" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bad_array_new1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bad_array_new1.C new file mode 100644 index 0000000..2052d39 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bad_array_new1.C @@ -0,0 +1,19 @@ +// Test for throwing bad_array_new_length on invalid array length +// { dg-do run { target c++11 } } + +#include <new> + +void * f(int i) +{ + return new int[i]; +} + +int main() +{ + try + { + f(-1); + } + catch (std::bad_array_new_length) { return 0; } + __builtin_abort (); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bad_array_new2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bad_array_new2.C new file mode 100644 index 0000000..bcc9b9a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bad_array_new2.C @@ -0,0 +1,20 @@ +// Test for throwing bad_array_new_length on invalid array length +// { dg-do run { target c++11 } } + +#include <new> + +void * f(int i) +{ + return new int[i]{1,2,3,4}; +} + +int main() +{ + f(4); // OK + try + { + f(3); + } + catch (std::bad_array_new_length) { return 0; } + __builtin_abort (); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bind.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bind.C new file mode 100644 index 0000000..9b7ce7d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bind.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } +struct S{}; +void f(S&&); + +int main() +{ + f(S()); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bracket1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bracket1.C new file mode 100644 index 0000000..6f5c29720 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bracket1.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } + +template<typename T> +struct list {}; + +template<typename T> +struct vector { + operator T() const; +}; + +void f() +{ + vector<vector<int>> v; + const vector<int> vi = static_cast<vector<int>>(v); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bracket2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bracket2.C new file mode 100644 index 0000000..35c8608 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bracket2.C @@ -0,0 +1,10 @@ +// { dg-do compile { target c++11 } } + +template<int i> class X { /* ... */ }; +X< 1>2 > x1; // // { dg-error "numeric constant" } +X<(1>2)> x2; // Okay. + +template<class T> class Y { /* ... */ }; +Y<X<1>> x3; // Okay, same as "Y<X<1> > x3;". +Y<X<6>>1>> x4; // { dg-error "numeric constant" } +Y<X<(6>>1)>> x5; // Okay diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bracket3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bracket3.C new file mode 100644 index 0000000..93c7148 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bracket3.C @@ -0,0 +1,11 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-std=c++98 -Wc++11-compat" } + +template<int N> struct X {}; + +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 "is treated as|suggest parentheses" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bracket4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bracket4.C new file mode 100644 index 0000000..256f4cb --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/bracket4.C @@ -0,0 +1,34 @@ +// { dg-do compile { target c++11 } } +template<typename T> +struct vector { +}; + +struct X { + template<typename T> + struct tmpl { + operator T() const; + }; +}; + +template<typename T> +void g() +{ + T::template tmpl<vector<int>>() + 2; +} + +template<typename T> +void operator+(vector<T>, int); + +void f() +{ + vector<vector<int>>() + 2; +} + +// PR c++/36460 +template <class a> +class A {}; +template <class b> +class B {}; + +A<B<void()>> x; + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/cast-bug.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/cast-bug.C new file mode 100644 index 0000000..2b8ef33 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/cast-bug.C @@ -0,0 +1,14 @@ +// { dg-do compile { target c++11 } } +struct S +{ + S(); + S(S &&); +private: + S(S &); +}; + +S f() +{ + S s; + return static_cast<S&&>(s); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/cast.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/cast.C new file mode 100644 index 0000000..d11d724 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/cast.C @@ -0,0 +1,30 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test cast from lvalue to rvalue + +// { dg-do compile { target c++11 } } +// { dg-skip-if "packed attribute missing for struct one" { "epiphany-*-*" } { "*" } { "" } } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {long x[1];}; +struct two {long x[2];}; + +struct A {}; + +one foo(const A&) {return one();} +two foo(A&&) {return two();} + +int test1() +{ + A a; + sa<sizeof(foo(a)) == 1 * sizeof(long)> t1; + sa<sizeof(foo(static_cast<A&&>(a))) == 2 * sizeof(long)> t2; + return 0; +} + +int main() +{ + return test1(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/catch1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/catch1.C new file mode 100644 index 0000000..81778ea --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/catch1.C @@ -0,0 +1,16 @@ +// PR c++/53371 +// { dg-do compile { target c++11 } } + +struct Abs +{ + virtual void a() = 0; +}; + +void foo() +{ + try { + } catch (Abs) { } // { dg-error "abstract class type" } + + try { + } catch (int&&) { } // { dg-error "rvalue reference type" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/collapse-bug.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/collapse-bug.C new file mode 100644 index 0000000..89fe031 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/collapse-bug.C @@ -0,0 +1,16 @@ +// { dg-do compile { target c++11 } } +template<typename T, typename U> struct same_type; +template<typename T> struct same_type<T, T> {}; + +template <typename T> +struct S +{ + typedef T const (&type)(); +}; + +void f() +{ + // initial implementation didn't ignore const qualifier on + // reference, resulting in a typedef of 'const int& (&)()' + same_type<S<int &>::type, int&(&)()>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/collapse.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/collapse.C new file mode 100644 index 0000000..b537bb5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/collapse.C @@ -0,0 +1,38 @@ +// { dg-do compile { target c++11 } } +template<typename T, typename U> struct same_type; +template<typename T> struct same_type<T, T> {}; + +typedef int & lref; +typedef int const & clref; +typedef int && rref; +typedef int const && crref; + +template<typename T> +struct S +{ + typedef T & lref; + typedef T const & clref; + typedef T && rref; + typedef T const && crref; +}; + +void f() +{ + same_type<lref &, int &>(); + same_type<lref &&, int &>(); + same_type<rref &, int &>(); + same_type<rref &&, int &&>(); + + same_type<rref const &, int &>(); + same_type<crref volatile &&, int const &&>(); + same_type<clref const &&, int const &>(); + + same_type<S<int &>::lref &, int &>(); + same_type<S<int &&>::lref &&, int &>(); + same_type<S<int &>::rref &, int &>(); + same_type<S<int &&>::rref &&, int &&>(); + + same_type<S<int const &>::rref, int const &>(); + same_type<S<int volatile &&>::crref, int volatile &&>(); + same_type<S<int const &&>::clref, int const &>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-46336.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-46336.C new file mode 100644 index 0000000..746a84e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-46336.C @@ -0,0 +1,14 @@ +// PR c++/46336 +// { dg-do compile { target c++11 } } + +extern "C" { + enum A { }; + inline constexpr A + f(A a, A b) // { dg-message "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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-46420.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-46420.C new file mode 100644 index 0000000..17a366e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-46420.C @@ -0,0 +1,13 @@ +// PR c++/46420 +// { dg-do compile { target c++11 } } + +template<typename> class vector { }; +struct A{}; +template <class T1> +void complete_test(vector<T1> data1){ + A drop=A(); +} +int main(){ + vector<double> vect1; + complete_test(vect1); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-47570.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-47570.C new file mode 100644 index 0000000..263a44b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-47570.C @@ -0,0 +1,25 @@ +// PR c++/47570 +// { dg-do compile { target c++11 } } + +unsigned int constexpr one() +{ return 1; } + +int constexpr one_B() +{ return 1; } + +int main() +{ + // FAIL TO COMPILE: + static bool constexpr SC_huh1 = ((unsigned int)one()) >= ((unsigned int)0); + static bool constexpr SC_huh2 = one() >= ((unsigned int)0); + static bool constexpr SC_huh3 = one() >= 0; + + // COMPILE OK: + static bool constexpr SC_huh4 = ((one() == 0) || (one() > 0)); + static bool constexpr SC_huh5 = one() == 0; + static bool constexpr SC_huh6 = one() > 0; + static bool constexpr SC_huh7 = one_B() >= 0; + static bool constexpr SC_huh8 = one() >= 1; + + return SC_huh3; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-47969.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-47969.C new file mode 100644 index 0000000..933831b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-47969.C @@ -0,0 +1,11 @@ +// PR c++/47969 +// { dg-do compile { target c++11 } } + +struct A +{ + // constexpr operator int () { return 1; } +}; + +constexpr A a = A(); + +int ar[a]; // { dg-error "has non-integral type" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-48089.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-48089.C new file mode 100644 index 0000000..88d4426 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-48089.C @@ -0,0 +1,50 @@ +// PR c++/48089 +// { dg-do compile { target c++11 } } + +// bang is ill-formed (diagnostic required) because its initializer is +// non-constant, because it uses the value of an uninitialized object. + +// s() is ill-formed (no diagnostic required) because there is no set of +// arguments that would produce a constant expression. + +// R() is well-formed because i is initialized before j. + +struct s { + constexpr s() : v(v) { } // { dg-message "" } + int v; +}; + +constexpr s bang; // { dg-message "" } + +struct R { + int i,j; + constexpr R() : i(42),j(i) { } // { dg-bogus "" "" { xfail *-*-* } } +}; + +constexpr R r; // { dg-bogus "" "" { xfail *-*-* } } + +// Ill-formed (no diagnostic required) +struct T { + int i; + constexpr int f() { return i; } + constexpr T(): i(0) { } + constexpr T(const T& t) : i(f()) { } // { dg-message "" } +}; + +constexpr T t1; +// Ill-formed (diagnostic required) +constexpr T t2(t1); // { dg-message "" } + +// Well-formed +struct U { + int i, j; + constexpr int f(int _i) { return _i; } + constexpr int g() { return i; } + constexpr U(): i(0), j(0) { } + constexpr U(const U& t) : i(f(t.i)),j(0) { } // { dg-bogus "" "" { xfail *-*-* } } + constexpr U(int _i) : i(_i),j(g()) { } // { dg-bogus "" "" { xfail *-*-* } } +}; + +constexpr U u1; +constexpr U u2(u1); // { dg-bogus "" "" { xfail *-*-* } } +constexpr U u3(1); // { dg-bogus "" "" { xfail *-*-* } } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-49776.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-49776.C new file mode 100644 index 0000000..c1d1c37 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-49776.C @@ -0,0 +1,17 @@ +// PR c++/49776 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-51369.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-51369.C new file mode 100644 index 0000000..413566f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-51369.C @@ -0,0 +1,11 @@ +// PR c++/51369 +// { dg-do compile { target c++11 } } + +constexpr int x[2][2] = {}; + +template<int> +void +foo () +{ + x[0][0]; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-52672.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-52672.C new file mode 100644 index 0000000..0ce07a5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-52672.C @@ -0,0 +1,7 @@ +// PR c++/52672 +// { dg-do compile { target c++11 } } + +__extension__ typedef __SIZE_TYPE__ * 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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-1.C new file mode 100644 index 0000000..c90fc76 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-1.C @@ -0,0 +1,5 @@ +// { dg-do compile { target c++11 } } + +typedef float __attribute__ ((vector_size (4 * sizeof (float)))) V4; +constexpr V4 v = { 1, 1, 1, 0 }; +constexpr V4 r = v[0] + v; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-2.C new file mode 100644 index 0000000..f34619a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-2.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } +// Ignore warning on some powerpc-ibm-aix configurations. +// { dg-prune-output "non-standard ABI extension" } +// { dg-prune-output "changes the ABI" } + +typedef float __attribute__ ((vector_size (4 * sizeof (float)))) V4; +constexpr V4 build (float x, float y, float z) { return __extension__ (V4){ x, y, z, 0 };} +constexpr V4 x = build (1, 0, 0); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-3.C new file mode 100644 index 0000000..58c00ed --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-53094-3.C @@ -0,0 +1,21 @@ +// { dg-do compile { target c++11 } } +// { dg-options "" } +// Ignore warning on some powerpc-ibm-aix configurations. +// { dg-prune-output "non-standard ABI extension" } + +typedef float __attribute__ ((vector_size (4 * sizeof (float)))) V4; + +struct Rot3 { + typedef float T; + typedef V4 Vec; + Vec axis[3]; + constexpr Rot3 (V4 ix, V4 iy, V4 iz) : axis {ix, iy, iz} {} + + constexpr Rot3(T xx, T xy, T xz, T yx, T yy, T yz, T zx, T zy, T zz) : + Rot3((Vec) { xx, xy, xz, 0 }, + (Vec) { yx, yy, yz, 0 }, + (Vec) { zx, zy, zz, 0 }) {} + +}; + +constexpr Rot3 r1( 0, 1 ,0, 0, 0, 1, 1, 0, 0); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-55432.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-55432.C new file mode 100644 index 0000000..56b09bd --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-55432.C @@ -0,0 +1,22 @@ +// PR c++/55432 +// { dg-do compile { target c++11 } } + +struct tag_t{} tag{}; + +constexpr tag_t const& pass(tag_t & t) +{ + return t; +} + +struct S +{ + constexpr S(tag_t) {}; +}; + +struct T +{ + S mem; + T( tag_t & args ) : mem(pass(args)) {} +}; + +T t(tag); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-55573.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-55573.C new file mode 100644 index 0000000..bec69c7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-55573.C @@ -0,0 +1,24 @@ +// PR c++/55573 +// { dg-do compile { target c++11 } } +// { dg-options "" } +// Ignore warning on some powerpc-ibm-aix configurations. +// { dg-prune-output "non-standard ABI extension" } + +template <typename T, int N> +struct ExtVecTraits { + typedef T __attribute__((vector_size (N * sizeof (T)))) type; +}; + +template <typename T> +using Vec4 = typename ExtVecTraits<T,4>::type; + +template <typename T> +struct Rot3 +{ + typedef Vec4<T> Vec; + Vec axis[3]; + constexpr Rot3 (Vec4<T> ix, Vec4<T> iy, Vec4<T> iz) : axis {ix, iy, iz} {} +}; + +typedef Vec4<float> Vec; +Rot3<float> r2 ((Vec) {0, 1, 0, 0}, (Vec){0, 0, 1, 0}, (Vec){1, 0, 0, 0}); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-55708.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-55708.C new file mode 100644 index 0000000..ffbefbb --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-55708.C @@ -0,0 +1,30 @@ +// PR c++/55708 +// { dg-do compile { target c++11 } } + +template<int N,int NNN> +struct AA { static constexpr int val = N; }; + +template<typename A,typename B> +//constexpr unsigned long long mymax(A a,B b){ // <-- compiles +constexpr unsigned long long mymax(A && a,const B& b){ + return a<b?b:a; +} + +template<char... List> +constexpr long long operator"" _y() noexcept +{ + return AA<1, mymax(1,2)>::val; // <-- crashes gcc + // return mymax(1,2); // <-- compiles + // return AA<1,2>::val; // <-- compiles +} + +template<char... List> +constexpr unsigned long long do_y() noexcept +{ + return AA<1, mymax(1,2)>::val; // <-- crashes gcc +} + +int main() +{ + return 1_y + do_y(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-56302.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-56302.C new file mode 100644 index 0000000..945bf02 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-56302.C @@ -0,0 +1,12 @@ +// PR c++/56302 +// { dg-do compile { target c++11 } } +// { dg-options "-O0" } + +constexpr int foo () { return 42; } +constexpr int x = foo () + 2; + +void +bar () +{ + __asm ("" : : "n" (x), "n" (foo () * 7 + x)); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-98.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-98.C new file mode 100644 index 0000000..1a0189b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-98.C @@ -0,0 +1,4 @@ +// { dg-options "-std=c++98" } + +constexpr int i = 42; // { dg-message "std=c\\+\\+11" } +// { dg-error "constexpr" "" { target *-*-* } 3 } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-99.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-99.C new file mode 100644 index 0000000..8d791dd --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-99.C @@ -0,0 +1,13 @@ +// Origin PR c++/51462 +// { dg-do compile { target c++11 } } + +struct A +{ + int i = 0; +}; + +struct B +{ + A a; + constexpr B() : a(0) {} // { dg-error "no matching function" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-abi1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-abi1.C new file mode 100644 index 0000000..418a202 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-abi1.C @@ -0,0 +1,17 @@ +// PR c++/47301 +// { dg-do compile { target c++11 } } +// { dg-options "-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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-access.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-access.C new file mode 100644 index 0000000..569824d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-access.C @@ -0,0 +1,14 @@ +// { dg-do compile { target c++11 } } + +class base +{ +protected: + constexpr base() { } +}; + +struct A : base { }; + +int main() +{ + A a; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-and.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-and.C new file mode 100644 index 0000000..ea86d7b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-and.C @@ -0,0 +1,20 @@ +// PR c++/56481 +// Non-linearity in potential_constant_expression_1 +// { dg-do compile { target c++11 } } + +struct S +{ + constexpr bool foo (); +#define A(n) , f##n##0, f##n##1, f##n##2, f##n##3 +#define B(n) A(n##0) A(n##1) A(n##2) A(n##3) +#define C B(0) B(1) B(2) B(3) + bool f C; +}; + +constexpr bool +S::foo () +{ +#undef A +#define A(n) && f##n##0 && f##n##1 && f##n##2 && f##n##3 + return f C; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr.C new file mode 100644 index 0000000..15d20f6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } + +template<class T> +constexpr T do_get(T* x, int n) { + return x[n - 1]; +} + +template<class T, int N> +constexpr T get(T (&x)[N]) { + return do_get(x, N); +} + +constexpr int arr_i[] = {1}; +constexpr auto var = get(arr_i); // #2 +static_assert(var == arr_i[0], "Error"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr2.C new file mode 100644 index 0000000..9218196 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr2.C @@ -0,0 +1,21 @@ +// { dg-do compile { target c++11 } } + +template<class T> +struct IsNegative { + int dummy; // Workaround for empty class problem + constexpr IsNegative() : dummy(0) {} + constexpr bool operator()(const T& x) { + return x < T(0); + } +}; + +template<class T, int N, class Pred> +constexpr bool has_neg(T (&x)[N], Pred p) { + return p(x[0]) || p(x[1]); +} + +constexpr int a[] = {1, -2}; + +constexpr auto answer = has_neg(a, IsNegative<int>{}); // #1 + +static_assert(answer, "Error"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr3.C new file mode 100644 index 0000000..2338f70 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr3.C @@ -0,0 +1,19 @@ +// { dg-do compile { target c++11 } } + +constexpr bool is_negative(int x) { + return x < 0; +} + +constexpr bool do_has_neg(const int* x, bool(*p)(int)) { + return p(x[0]) || p(x[1]); // Line 6 +} + +constexpr bool has_neg(const int (&x)[2], bool(*p)(int)) { + return do_has_neg(x, p); // Line 10 +} + +constexpr int a[] = {1, -2}; + +constexpr auto answer = has_neg(a, is_negative); // Line 15 + +static_assert(answer, "Error"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr4.C new file mode 100644 index 0000000..3dd3f34 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr4.C @@ -0,0 +1,23 @@ +// { dg-do compile { target c++11 } } + +constexpr const int do_last(const int* x, int n) { + return x[n - 1]; +} + +struct IsNegative { + constexpr bool operator()(const int& x) { + return x < 0; + } +}; + +template<int N, class Pred> +constexpr bool has_neg(const int (&x)[N], Pred p) { + return p(do_last(x, N)); // Line 13 +} + +constexpr int a[] = {1, -2}; + +constexpr auto answer = has_neg(a, IsNegative{}); // Line 18 + +static_assert(answer, "Error"); + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr5.C new file mode 100644 index 0000000..eec32d6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr5.C @@ -0,0 +1,32 @@ +// { dg-do compile { target c++11 } } + +template<class T> +constexpr T do_last(T* x, int n) { + return x[n - 1]; // +} + +template<class T, int N> +constexpr T last(T (&x)[N]) { + return do_last(x, N); +} + +constexpr bool is_negative(int x) { return x < 0; } + +template<class T> +struct IsNegative { + constexpr bool operator()(const T& x) { + return x < T(0); + } +}; + +template<class T, int N, class Pred> +constexpr bool has_neg(T (&x)[N], Pred p) { + return p(last(x)); // Line 22 +} + +constexpr int a[] = {1, -2}; + +constexpr auto answer1 = has_neg(a, IsNegative<int>{}); // Line 27 +constexpr auto answer2 = has_neg(a, is_negative); + +static_assert(answer2 == answer1, "Error"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr6.C new file mode 100644 index 0000000..3a48398 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr6.C @@ -0,0 +1,18 @@ +// { dg-do compile { target c++11 } } + +typedef decltype(sizeof(char)) size_type; + +template<class T, size_type N> +constexpr size_type size(T (&)[N]) { return N; } + +double array_double[] = { 1.0, 2.0, 3.0 }; + +constexpr auto sz_d = size(array_double); + +static_assert(sz_d == 3, "Array size failure"); + +void f(bool (¶m)[2]) { + static_assert(size(param) == 2, "Array size failure"); // Line 13 + short data[] = {-1, 2, -45, 6, 88, 99, -345}; + static_assert(size(data) == 7, "Array size failure"); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr7.C new file mode 100644 index 0000000..93f9141 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr7.C @@ -0,0 +1,20 @@ +// PR c++/49290 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr8.C new file mode 100644 index 0000000..ee425ea --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr8.C @@ -0,0 +1,54 @@ +// PR c++/57047 +// { dg-require-effective-target c++11 } + +template <typename> +struct A; +template <typename T> +struct A <T &> +{ + typedef T type; +}; +template <typename T> +constexpr T && foo (typename A <T>::type & __t) noexcept +{ + return static_cast <T &&>(__t); +} +template <class T1, class T2> +struct B +{ + T1 t1; + T2 t2; + template <class U> + constexpr B (U && __x, const T2 & __y) : t1 (foo <U> (__x)), t2 (__y) {} +}; +static inline constexpr bool +fn1 (const char c) +{ + return ('0' <= c) && (c <= '9'); +} +static inline constexpr bool +fn2 (const char c) +{ + return (('A' <= c) && (c <= 'Z')) || (('a' <= c) && (c <= 'z')); +} +static constexpr bool +fn3 (const char *const x) +{ + return (x[1] == '\0' && x[0] == ']') ? true : (!fn1 (x[0])) ? false : fn3 (&x[1]); +} +static constexpr bool +fn4 (const char *const x) +{ + return (x[0] == '\0') ? fn3 (&x[1]) : fn4 (&x[1]); +} +static inline constexpr bool +fn5 (const char *const x) +{ + return fn2 (x[0]) ? fn4 (x) : false; +} +struct C final +{ + constexpr C (const char *const t1) : c (fn5 (t1) ? 199 : 69) {} + unsigned c; +}; +B <C, C> p ("a", "b"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-tparm.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-tparm.C new file mode 100644 index 0000000..02fba95 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array-tparm.C @@ -0,0 +1,5 @@ +// { dg-do compile { target c++11 } } + +template <const int I[2]> struct A { int ir[I[0]]; }; +extern constexpr int ar[2] = { 1, 2 }; +A<ar> a; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array.C new file mode 100644 index 0000000..1614d6b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } +// { dg-final { scan-assembler-not "static_initialization" } } + +struct A +{ + int i; + constexpr A(): i(0) { } +}; + +struct B +{ + A a[4]; +}; + +extern const B b{}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array2.C new file mode 100644 index 0000000..ad6b121 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array2.C @@ -0,0 +1,19 @@ +// PR c++/46348 +// { dg-do compile { target c++11 } } + +template<__SIZE_TYPE__ _Nw> + struct _Base + { + typedef unsigned long _WordT; + + _WordT _M_w[_Nw]; + + constexpr + _Base() + : _M_w() { } + }; + +int main() +{ + _Base<256> bs; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array3.C new file mode 100644 index 0000000..12f42f1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array3.C @@ -0,0 +1,14 @@ +// PR c++/48132 +// { dg-do compile { target c++11 } } + +struct C +{ + constexpr C (int x) : c (x) {} + int c; +}; + +void +foo () +{ + C a[] = { C (0) }; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array4.C new file mode 100644 index 0000000..aa95264 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array4.C @@ -0,0 +1,14 @@ +// PR c++/49924 +// { dg-do compile { target c++11 } } + +struct A { constexpr A() { } }; + +struct B { + A array[1]; //non-static member array of a literal type w constexpr ctor + constexpr B() : array{} { } // here is the problem +}; + +int main() +{ + constexpr B b{}; // won't compile +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array5.C new file mode 100644 index 0000000..4605b4b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-array5.C @@ -0,0 +1,9 @@ +// PR c++/56582 +// { dg-do compile { target c++11 } } + +// Reliable ICE +constexpr int n[3] = {}; +constexpr int k = n[-1]; // { dg-error "negative" } + +// Some random byte +constexpr char c = "foo"[-1000]; // { dg-error "negative" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-attribute.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-attribute.C new file mode 100644 index 0000000..cda0e92 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-attribute.C @@ -0,0 +1,63 @@ +// { dg-do compile { target c++11 } } + +//A few constexpr's +constexpr int foo() { return __alignof__(int); } + +template<typename T> +constexpr int fooT() { return __alignof__(T); } + +template<int N> +constexpr int fooN() { return N; } + +//Now the attributes + +//with normal variables, +int a __attribute__((aligned(foo()))); +int b __attribute__((aligned(fooT<int>()))); +int c __attribute__((aligned(fooN<__alignof__(int)>()))); + +//with variables inside a template, +template <typename T> +void fun() +{ + T a __attribute__((aligned(foo()))); + T b __attribute__((aligned(fooT<T>()))); + T c __attribute__((aligned(fooN<__alignof__(T)>()))); + T d __attribute__((aligned(fooT<int>()))); + T e __attribute__((aligned(fooN<__alignof__(int)>()))); +} + +//instantiate it, +void bar() +{ + fun<int>(); +} + +//with classes +struct __attribute__((aligned(foo()))) S0 +{ + char dummy; +}; +S0 s0; + +struct __attribute__((aligned(fooT<int>()))) S1 +{ + char dummy; +}; +S1 s1; + +//and class templates +template <typename T> +struct __attribute__((aligned(foo()))) S2 +{ + char dummy; +}; + +S2<int> s2; + +template <typename T> +struct __attribute__((aligned(fooT<T>()))) S3 +{ + char dummy; +}; +S3<int> s3; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-attribute2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-attribute2.C new file mode 100644 index 0000000..c174cb3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-attribute2.C @@ -0,0 +1,33 @@ +// { dg-do compile { target init_priority } } +// { dg-require-effective-target c++11 } + +struct t { t(); }; + +constexpr int prio = 123; +constexpr int size = 8; +constexpr int pos = 1; +enum A { zero = 0, one, two }; +__attribute__((init_priority(prio))) t a; + +enum class E1 : int { + first = 101, + second, + third, +}; +__attribute__((init_priority(E1::second))) t b; // Should not compile? + +enum E2 { + E2_first = 141, + E2_second, + E2_third, +}; +__attribute__((init_priority(E2_second))) t c; + +void* my_calloc(unsigned, unsigned) __attribute__((alloc_size(pos,two))); +void* my_realloc(void*, unsigned) __attribute__((alloc_size(two))); + +typedef char vec __attribute__((vector_size(size))); + +void f(char*) __attribute__((nonnull(pos))); + +char g __attribute__((aligned(size))); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-auto.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-auto.C new file mode 100644 index 0000000..ae270dc --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-auto.C @@ -0,0 +1,2 @@ +// { dg-do compile { target c++11 } } +constexpr auto value = 0; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-base.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-base.C new file mode 100644 index 0000000..5f0b5ca --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-base.C @@ -0,0 +1,17 @@ +// Test base/member class and static_assert with constexpr +// { dg-do compile { target c++11 } } + +struct A { + int i; + constexpr A(int _i): i(_i) { } +}; +struct B: A { + A a; + int j; + constexpr B(int _ib, int _ia, int _j): A(_ib), a(_ia), j(_j) { } +}; + +constexpr B b (12, 24, 36); + +#define SA(X) static_assert (X, #X) +SA(b.i==12 && b.a.i==24 && b.j==36); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-base2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-base2.C new file mode 100644 index 0000000..217687a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-base2.C @@ -0,0 +1,19 @@ +// PR c++/46293 +// { dg-do compile { target c++11 } } + +struct A +{ +}; + +struct C +{ + int i; + constexpr C(int i): i(i) {} +}; + +struct B: A, C +{ + constexpr B(): A(), C(42) { } +}; + +constexpr B b{}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-base3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-base3.C new file mode 100644 index 0000000..db867d4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-base3.C @@ -0,0 +1,26 @@ +// PR c++/46526 +// { dg-do run { target c++11 } } + +struct Base +{ + virtual int getid () = 0; +}; + +struct A : public Base +{ + virtual int getid () { return 1; } +}; + +struct B : public Base +{ + virtual int getid () { throw "here"; } +}; + +int +main () +{ + A a; + B b; + Base& ar = a; + ar.getid (); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-base4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-base4.C new file mode 100644 index 0000000..ab66439 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-base4.C @@ -0,0 +1,27 @@ +// PR c++/46626 +// { dg-do run { target c++11 } } + +struct A +{ + virtual void f () = 0; + virtual ~A () { } +}; + +struct B : A +{ + virtual void f () { } +}; + +static void +foo (A *a) +{ + a->f (); +} + +int +main () +{ + B b; + foo (&b); + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield.C new file mode 100644 index 0000000..a50ac36 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield.C @@ -0,0 +1,10 @@ +// PR c++/46369 +// { dg-do compile { target c++11 } } + +struct A +{ + unsigned i : 1; +}; + +constexpr A f() { return { 1 }; } +constexpr bool b = (f().i == 1); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield2.C new file mode 100644 index 0000000..5b66720 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield2.C @@ -0,0 +1,18 @@ +// PR c++/49136 +// { dg-do compile { target c++11 } } + +struct day +{ + unsigned d : 5; + unsigned n : 3; + constexpr explicit day (int dd) : d(dd), n(7) {} +}; + +struct date { + int d; + constexpr date (day dd) : d(dd.n != 7 ? 7 : dd.d) {} +}; + +constexpr day d(0); +constexpr date dt(d); +static_assert (dt.d == 0, "Error"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield3.C new file mode 100644 index 0000000..c393db4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield3.C @@ -0,0 +1,32 @@ +// PR c++/49136 +// { dg-do compile { target c++11 } } + +struct S +{ + unsigned : 1; unsigned s : 27; unsigned : 4; + constexpr S (unsigned int x) : s(x) {} +}; + +template <typename S> +struct T +{ + unsigned int t; + constexpr T (S s) : t(s.s != 7 ? 0 : s.s) {} + constexpr T (S s, S s2) : t(s.s != s2.s ? 0 : s.s) {} +}; + +constexpr S s (7), s2 (7); +constexpr T<S> t (s), t2 (s, s2); +static_assert (t.t == 7, "Error"); +static_assert (t2.t == 7, "Error"); + +struct U +{ + int a : 1; int s : 1; + constexpr U (int x, int y) : a (x), s (y) {} +}; + +constexpr U u (0, -1), u2 (-1, -1); +constexpr T<U> t3 (u), t4 (u, u2); +static_assert (t3.t == 0, "Error"); +static_assert (t4.t == -1, "Error"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-builtin1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-builtin1.C new file mode 100644 index 0000000..d663f88 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-builtin1.C @@ -0,0 +1,25 @@ +// PR c++/49813 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-builtin2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-builtin2.C new file mode 100644 index 0000000..dde38f0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-builtin2.C @@ -0,0 +1,16 @@ +// PR c++/54021 +// { dg-do compile { target c++11 } } + +extern int nonconst_func(int); +constexpr int identity(int x) { return x; } +constexpr int zero() { return identity(0); } +constexpr int one() { return identity(1); } + +// These are the same. Only the latter is accepted, though. +constexpr int rejected_const_4(int x) +{ return __builtin_constant_p(x) ? 4 : nonconst_func(x); } +constexpr int accepted_const_4(int x) +{ return identity(__builtin_constant_p(x)) ? 4 : nonconst_func(x); } + +// This is rejected. I would like it to work. +constexpr int four = accepted_const_4(1); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-cache1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-cache1.C new file mode 100644 index 0000000..8038b88 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-cache1.C @@ -0,0 +1,9 @@ +// PR c++/51433 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-cleanup.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-cleanup.C new file mode 100644 index 0000000..bfba6fc --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-cleanup.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +struct A +{ + int i; + ~A(); +}; + +constexpr int i = A().i; // { dg-error "non-literal" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-complex.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-complex.C new file mode 100644 index 0000000..fa39348 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-complex.C @@ -0,0 +1,18 @@ +// Make sure C99 complex works with constexpr +// { dg-do compile { target c++11 } } +// { dg-options "" } + +struct complex +{ + typedef float value_type; + typedef __complex__ float _ComplexT; + + constexpr complex(_ComplexT __z) : _M_value(__z) { } + + constexpr complex(float __r = 0.0f, float __i = 0.0f) + : _M_value(__r + __i * 1.0fi) { } + +private: + _ComplexT _M_value; +}; +constexpr complex c1; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-compound.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-compound.C new file mode 100644 index 0000000..bfe4e13 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-compound.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +constexpr int f() +{ + { // { dg-error "" } + return 1; + } + { } // { dg-error "" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-condition.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-condition.C new file mode 100644 index 0000000..388a734 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-condition.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } +// Core DR 948 + +constexpr int something() { return 3; } + +int main() { + if (constexpr long v = something()) {} + if (static long v = something()) { } // { dg-error "decl-specifier invalid" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-condition2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-condition2.C new file mode 100644 index 0000000..3ce9b4c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-condition2.C @@ -0,0 +1,18 @@ +// PR c++/48909 +// { dg-do compile { target c++11 } } + +#define SA(X) static_assert((X),#X) + +constexpr int const * is_sorted_until(int const * first, int const * last) +{ + return first == last || first + 1 == last ? last + : (*(first + 1) < *first) != false ? first + 1 + : is_sorted_until(first + 1, last); +} + +int main() +{ + static constexpr int array[2] = {0, 1}; + constexpr int const * last = is_sorted_until(array, array + 2); + SA(last==array+2); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-const1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-const1.C new file mode 100644 index 0000000..6ee7225 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor.C new file mode 100644 index 0000000..659e733 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } + +struct A +{ + int i; + constexpr A() { } // { dg-error "uninitialized member .A::i" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor10.C new file mode 100644 index 0000000..1dbc335 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor10.C @@ -0,0 +1,6 @@ +// PR c++/52599 +// { dg-do compile { target c++11 } } + +struct foo { + constexpr foo() try { } catch(...) { }; // { dg-error "constexpr" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor11.C new file mode 100644 index 0000000..e22c55f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor11.C @@ -0,0 +1,16 @@ +// PR c++/55856 +// { dg-do compile { target 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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor12.C new file mode 100644 index 0000000..45e1ed2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor12.C @@ -0,0 +1,14 @@ +// PR c++/55753 +// { dg-do compile { target 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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor13.C new file mode 100644 index 0000000..299db88 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor13.C @@ -0,0 +1,15 @@ +// PR c++/55753 +// { dg-do compile { target c++11 } } + +struct A +{ + double r,i; + constexpr A(double r = 0.0, double i = 0.0): r(r), i(i) {} +}; + +template <typename Tp> +struct B { + B() { + A((true ? 1.0 : A())); + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor2.C new file mode 100644 index 0000000..30b0109 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor2.C @@ -0,0 +1,11 @@ +// { dg-do compile { target c++11 } } + +struct A +{ + A(); +}; + +struct B : A +{ + constexpr B(): A() { } // { dg-error "A::A" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor3.C new file mode 100644 index 0000000..36d1de4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor3.C @@ -0,0 +1,10 @@ +// PR c++/46348 +// { dg-do compile { target c++11 } } + +struct A +{ + int arr[1]; + + constexpr A() + : arr() { } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor4.C new file mode 100644 index 0000000..c494712 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor4.C @@ -0,0 +1,15 @@ +// PR c++/46873 +// { dg-do compile { target c++11 } } + +struct S +{ + int i:1; +}; + +struct T +{ + const S s; + constexpr T (S a = S ()) : s (a) { } +}; + +T t; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor5.C new file mode 100644 index 0000000..abfc72c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor5.C @@ -0,0 +1,30 @@ +// PR c++/46877 +// { dg-do compile { target c++11 } } + +struct new_allocator +{ + constexpr new_allocator (); +}; + +struct string +{ + constexpr string () + { + } + new_allocator a; +}; + +struct pair +{ + const string first; + constexpr pair () + { + } +}; + +constexpr +new_allocator::new_allocator () +{ +} + +pair p; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor6.C new file mode 100644 index 0000000..fd87fe4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor6.C @@ -0,0 +1,10 @@ +// PR c++/47041 +// { dg-do compile { target c++11 } } +// { dg-options "-fno-elide-constructors" } + +struct S +{ + int i; +}; + +S s = S (); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor7.C new file mode 100644 index 0000000..5d18e56 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor7.C @@ -0,0 +1,18 @@ +// PR c++/47199 +// { dg-do compile { target c++11 } } +// { dg-options "-fno-elide-constructors" } + +template < int > struct S +{ + constexpr S (int r):rr (r) + { + } + S (const S &) = default; + static constexpr S s () + { + return -1; + } + int rr; +}; + +static const int d = S < 0 >::s ().rr; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor8.C new file mode 100644 index 0000000..5b75e64 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor8.C @@ -0,0 +1,7 @@ +// PR c++/46466 +// { dg-do compile { target c++11 } } +// { dg-options "-fno-elide-constructors" } + +struct S { bool b; }; +constexpr S f() { return S{true}; } +static_assert(f().b, ""); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor9.C new file mode 100644 index 0000000..0763ee4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor9.C @@ -0,0 +1,19 @@ +// PR c++/47774 +// { dg-do compile { target c++11 } } + +struct A +{ + A() {} +}; + +template <typename T> +struct array +{ + constexpr array() : mem() {} + T mem[7]; +}; + +int main() +{ + array<A> ar; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-data1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-data1.C new file mode 100644 index 0000000..f49c56a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-data1.C @@ -0,0 +1,42 @@ +// { dg-do compile { target c++11 } } + +// From N2235 + +// 1 +struct A2 +{ + static const int eights = 888; + static constexpr int nines = 999; +}; + +A2 a; + +// 2 +struct pixel +{ + int x, y; +}; +constexpr pixel ur = { 1294, 1024 }; // OK + +// p4 +struct Length +{ + explicit constexpr Length(int i = 0) : val(i) { } +private: + int val; +}; + +constexpr int myabs(int x) +{ return x < 0 ? -x : x; } // OK + +Length l(myabs(-97)); // OK + +// p6 +class debug_flag +{ +public: + explicit debug_flag(bool); + constexpr bool is_on(); // { dg-error "enclosing class .* not a literal type" } +private: + bool flag; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-data2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-data2.C new file mode 100644 index 0000000..312760a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-data2.C @@ -0,0 +1,46 @@ +// { dg-do compile { target c++11 } } + +template<typename _Tp, _Tp v> + struct A3 + { + typedef _Tp value_type; + typedef A3<value_type,v> type; + + static constexpr value_type value = v; + + constexpr operator value_type() { return value; } + }; + +// Partial specialization. +template<typename _Tp, _Tp v> + struct A3<_Tp*, v> + { + typedef _Tp* value_type; + typedef A3<value_type,v> type; + + static constexpr value_type value = v; + + constexpr operator value_type() { return value; } + }; + +// Explicit specialization. +template<> + struct A3<unsigned short, 0> + { + typedef unsigned short value_type; + typedef A3<value_type, 0> type; + + static constexpr value_type value = 0; + + constexpr operator value_type() { return value; } + }; + +// Explicitly instantiate. +template struct A3<int, 415>; + +// Extern explicitly instantiate. +extern template struct A3<int, 510>; + +// Use. +A3<int, 1111> a31; +A3<char, 9999> a32; // { dg-warning "overflow" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-decl.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-decl.C new file mode 100644 index 0000000..2c88fe6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-decl.C @@ -0,0 +1,9 @@ +// PR c++/46930 +// { dg-do compile { target c++11 } } + +struct S { + static constexpr int size; // { dg-error "must have an initializer" "must have" } +}; + +const int limit = 2 * S::size; +constexpr int S::size = 256; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-defarg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-defarg.C new file mode 100644 index 0000000..eaa3fbd --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-defarg.C @@ -0,0 +1,12 @@ +// PR c++/46335 +// { dg-do compile { target c++11 } } + +struct T { }; +struct A { + A(const T &tr =T()) {} +}; +struct B { + A k; +}; +B kk_; +A fk_; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-defarg2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-defarg2.C new file mode 100644 index 0000000..f1ca05f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-defarg2.C @@ -0,0 +1,44 @@ +// PR c++/46368 +// { dg-do compile { target c++11 } } + +class A; + +class B +{ + A foo (); + A bar (); +}; + +class C +{ +}; + +struct D +{ + D (C); +}; + +struct A : D +{ + A (const C & n) : D (n) {} +}; + +A baz (const char *, A = C ()); + +A +B::foo () +{ + try + { + baz ("foo"); + } + catch (...) + { + } +} + +A +B::bar () +{ + baz ("bar"); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-default-ctor.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-default-ctor.C new file mode 100644 index 0000000..a67505d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-default-ctor.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-default1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-default1.C new file mode 100644 index 0000000..68d50b6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-default1.C @@ -0,0 +1,22 @@ +// PR c++/53464 +// { dg-do compile { target c++11 } } + +template <int value> +struct bar +{ + static constexpr int get() + { + return value; + } +}; + +template <typename A, int value = A::get()> +struct foo +{ +}; + +int main() +{ + typedef foo<bar<0>> type; + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-delegating.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-delegating.C new file mode 100644 index 0000000..f32dde6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-delegating.C @@ -0,0 +1,15 @@ +// PR c++/51526 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-delegating2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-delegating2.C new file mode 100644 index 0000000..3543942 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-delegating2.C @@ -0,0 +1,28 @@ +// PR c++/51723 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-delete.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-delete.C new file mode 100644 index 0000000..3cc4f55 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-delete.C @@ -0,0 +1,3 @@ +// { dg-do compile { target c++11 } } + +constexpr bool never() = delete; // useless, but OK diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-deref.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-deref.C new file mode 100644 index 0000000..ce898ab --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-deref.C @@ -0,0 +1,16 @@ +// { dg-do compile { target c++11 } } + +struct A +{ + const int *p[2]; +}; + +constexpr const int * f(const int *p) { return p; } + +int main() +{ + constexpr int i = 42; + constexpr int j = *&i; // OK + constexpr int k = *A{{&i}}.p[0]; // OK + constexpr int l = *f(&i); // OK +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag1.C new file mode 100644 index 0000000..34cdb73 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag1.C @@ -0,0 +1,20 @@ +// Test that we explain why a template instantiation isn't constexpr +// { dg-do compile { target c++11 } } + +template <class T> +struct A +{ + T t; + constexpr int f() { return 42; } // { dg-error "enclosing class" } +}; + +struct B { B(); operator int(); }; + +constexpr A<int> ai = { 42 }; +constexpr int i = ai.f(); + +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" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag2.C new file mode 100644 index 0000000..04db4b3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag2.C @@ -0,0 +1,5 @@ +// PR c++/47207 +// { dg-do compile { target c++11 } } + +constexpr int X (X); // { dg-error "not usable" } +// { dg-message "own initializer" "" { target *-*-* } 4 } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag3.C new file mode 100644 index 0000000..2a1897b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag3.C @@ -0,0 +1,54 @@ +// PR c++/45923 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag4.C new file mode 100644 index 0000000..29f574d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag4.C @@ -0,0 +1,25 @@ +// Origin: PR c++/51633 +// { dg-do compile { target 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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag5.C new file mode 100644 index 0000000..c8043e3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-diag5.C @@ -0,0 +1,48 @@ +// Origin: PR c++/51633 +// { dg-do compile { target 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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-eh-spec.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-eh-spec.C new file mode 100644 index 0000000..93224b0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-eh-spec.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } +template<class T> class my_limits { +public: + static constexpr T min() throw() { return T(); } + static constexpr T max() noexcept { return T(); } +}; + +constexpr double var_min = my_limits<double>::min(); // #1 OK +constexpr double var_max = my_limits<double>::max(); // #2 Error diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ellipsis.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ellipsis.C new file mode 100644 index 0000000..8c0783c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ellipsis.C @@ -0,0 +1,5 @@ +// { dg-do compile { target c++11 } } +constexpr int ellipsis(...) { return 1; } + +constexpr int ellipsis_c = ellipsis(); // OK +constexpr int ellipsis_c2 = ellipsis(42); // Internal error diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ellipsis2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ellipsis2.C new file mode 100644 index 0000000..b6a5323 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ellipsis2.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } + +struct A +{ + A(); + A(const A&); + bool empty(); +}; + +constexpr int ellipsis(...) { return 1; } + +static_assert(ellipsis(A().empty()), "Error"); // { dg-error "non-constant condition|empty" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty.C new file mode 100644 index 0000000..42f873b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } + +struct Empty {}; + +constexpr bool f(Empty) { return true; } + +constexpr bool x(f(Empty{})); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty2.C new file mode 100644 index 0000000..51f3f55 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty2.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } + +struct IsLiteral {}; + +constexpr IsLiteral bar(IsLiteral x) { return x; } + +constexpr auto xy = bar(IsLiteral()); // #1 Error, but should be OK diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty3.C new file mode 100644 index 0000000..a9cd98f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty3.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +struct IsLiteral {}; + +constexpr auto ab = IsLiteral(); + +constexpr IsLiteral bar(IsLiteral x) { return x; } + +constexpr auto xy = bar(ab); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty4.C new file mode 100644 index 0000000..f61aa69 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty4.C @@ -0,0 +1,34 @@ +// { dg-do compile { target c++11 } } + +typedef decltype(sizeof(char)) size_type; + +template<class T, size_type N, class Pred> +constexpr size_type do_find_if_or_stop(T (&x)[N], size_type i, Pred p); + +template<class T, size_type N, class Pred> +constexpr size_type do_find_if(T (&x)[N], size_type i, Pred p) { + return p(x[i]) ? i : do_find_if_or_stop(x, i + 1, p); // line 8 +} + +template<class T, size_type N, class Pred> +constexpr size_type do_find_if_or_stop(T (&x)[N], size_type i, Pred p) { + return i == N ? N : do_find_if(x, i, p); +} // Line 14 + +template<class T, size_type N, class Pred> +constexpr size_type find_if(T (&x)[N], Pred p) { + return do_find_if(x, 0, p); // Line 18 +} + +constexpr long items_long[] = {1, 2, 3, 4, -5, 6, -7, 8}; + +template<class T> +struct IsNegative { + constexpr bool operator()(const T& x) { + return x < T(0); + } +}; + +constexpr auto pos1 = find_if(items_long, IsNegative<long>{}); // Line 30 + +static_assert(pos1 == 4, "find_if failure"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty5.C new file mode 100644 index 0000000..e74f5ba --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty5.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } + +struct A { }; +struct B: A { }; + +constexpr B b { }; +constexpr A a = b; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty6.C new file mode 100644 index 0000000..be9a6c6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-empty6.C @@ -0,0 +1,11 @@ +// PR c++/55993 +// { dg-do compile { target c++11 } } + +struct A {}; +struct B:A {}; +struct C:A {}; +struct D:B,C {}; + +constexpr D d {}; +constexpr const C& e=d; // OK +constexpr auto f=static_cast<const C&>(d); // FAIL diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C new file mode 100644 index 0000000..e541bf9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C @@ -0,0 +1,93 @@ +// { dg-do compile { target c++11 } } + +// From N2235 + +// 4.1 constant-expression functions +// 1 examples + + + + + +// 2 defined before first use +// NOTE: this is only needed in contexts that require a constant-expression +struct S { + constexpr int twice(); + constexpr int t(); // { dg-message "used but never defined" } +private: + static constexpr int val = 7; // constexpr variable +}; + +constexpr int S::twice() { return val + val; } +constexpr S s = { }; +int x1 = s.twice(); // ok +int x2 = s.t(); // error: S::t() not defined +constexpr int x2a = s.t(); // { dg-error "S::t" } error: S::t() not defined +constexpr int ff(); // ok +constexpr int gg(); // ok +int x3 = ff(); // error: ff() not defined +constexpr int x3a = ff(); // { dg-error "ff" } error: ff() not defined +constexpr int ff() { return 1; } // too late +constexpr int gg() { return 2; } +int x4 = gg(); // ok + + +// 4.2 const-expression data + +// 2 +// storage not allocated untill address taken +constexpr double x = 9484.748; +const double* p = &x; // the &x forces x into memory + +// 4.3 constant-expression constructors + +// 1 +struct complex { + constexpr complex(double r, double i) : re(r), im(i) { } + constexpr double real() { return re; } + constexpr double imag() { return im; } +private: + double re; + double im; +}; +constexpr complex I(0, 1); // OK -- literal complex + + +// 2 invoked with non-const args +double x5 = 1.0; // { dg-message "not declared .constexpr" } +constexpr complex unit(x5, 0); // { dg-error "x5|argument" } error: x5 non-constant +const complex one(x5, 0); // OK, ‘‘ordinary const’’ -- dynamic + // initialization +constexpr double xx = I.real(); // OK +complex z(2, 4); // OK -- ordinary variable + +// 3 +constexpr complex v[] = { + complex(0, 0), complex(1, 1), complex(2, 2) +}; +constexpr double x6 = v[2].real(); // OK + +// 4 + constexpr int i = 98; + typedef __INTPTR_TYPE__ intptr_t; + constexpr intptr_t ip = (intptr_t) &i; // { dg-error "constant" } + +// 4.3.2 copy-constructor +constexpr complex operator+(complex z, complex w) +{ + return complex(z.real() + w.real(), z.imag() + w.imag()); // fine +} +constexpr complex I2 = I + I; // OK +struct resource { + int id; + constexpr resource(int i) : id(i) { } // fine + resource(const resource& r) : id(r.id) // oops, not constexpr + { + //cout << id << " copied" << endl; + } +}; +constexpr resource f(resource d) +{ return d; } // { dg-error "non-constexpr" } +constexpr resource d = f(9); // { dg-message "constexpr" } + +// 4.4 floating-point constant expressions diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ex2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ex2.C new file mode 100644 index 0000000..9e99d6d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ex2.C @@ -0,0 +1,22 @@ +// { dg-do compile { target c++11 } } + +// From N2235 + +// 4.5.3 constant expressions + +// p 4 +struct A { + constexpr A(int i) : val(i) { } + constexpr operator int() { return val; } + constexpr operator long() { return -1; } +private: + int val; +}; + +template<int I> struct X { static const int i = I; }; +constexpr A a = 42; + +X<a> x; // OK: unique conversion to int +int ar[X<a>::i]; // also OK +int ary[a]; // { dg-error "ambiguous|conversion|array" } ambiguous conversion + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ex3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ex3.C new file mode 100644 index 0000000..3e2685b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ex3.C @@ -0,0 +1,31 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-ftrack-macro-expansion=0" } + +#define SA(X) static_assert (X, #X) + +struct A +{ + int i; + constexpr A(int _i) { i = _i; } // { dg-error "empty body|uninitialized member" } +}; + +template <class T> +struct B +{ + T t; + constexpr B(T _t): t(_t) { } +}; + +B<int> b(1); // { dg-message "not declared .constexpr" } +SA(b.t==1); // { dg-error "non-constant condition|'b'" } +constexpr B<int> b2(1); +SA(b2.t==1); + +template <class T> +constexpr T f(T a, T b) +{ + typedef T myT; + return a + b; +} + +SA(f(1,2)==3); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ex4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ex4.C new file mode 100644 index 0000000..7a9086c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ex4.C @@ -0,0 +1,16 @@ +// { dg-do compile { target c++11 } } + +struct A +{ + constexpr A(int) { } + constexpr operator int() { return 1; }; +}; + +template <class T> +struct B +{ + static constexpr A a = A(1); + int ar[a]; +}; + +B<int> b; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-expinst.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-expinst.C new file mode 100644 index 0000000..08a0fe0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-expinst.C @@ -0,0 +1,5 @@ +// { dg-do compile { target c++11 } } +// Error: Explicit instantiation of a function template shall not use the +// inline or constexpr specifiers +template<class T> constexpr inline T bar(T x) { return x; } +template constexpr inline float bar(float x); // { dg-error "specifier" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-explicit-inst.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-explicit-inst.C new file mode 100644 index 0000000..f5137b3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-explicit-inst.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +template<class T> constexpr inline T bar(T x) { return x; } + +template short bar(short x); // #EI + +constexpr auto yz = bar(0); // OK +constexpr auto ab = bar(short()); // #1 Error, but should be OK +constexpr auto mn = bar(short{}); // #2 Error, but should be OK diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-fnptr.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-fnptr.C new file mode 100644 index 0000000..2b08478 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-fnptr.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } + +constexpr bool is_negative(int x) { return x < 0; } + +constexpr bool check(int x, bool (*p)(int)) { return p(x); } // #1 + +static_assert(check(-2, is_negative), "Error"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-friend-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-friend-2.C new file mode 100644 index 0000000..36799b4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-friend-2.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } + +template<typename T> void f(T); + +template <class T> class A { + friend constexpr void f<>(int); // { dg-error "'constexpr' is not allowed" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-friend.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-friend.C new file mode 100644 index 0000000..55a2329 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-friend.C @@ -0,0 +1,23 @@ +// PR c++/48948 +// { dg-do compile { target c++11 } } + +struct A { A(); }; + +struct B { + friend constexpr int f(B) { return 0; } // OK + friend constexpr int f(A) { return 0; } // { dg-error "constexpr" } +}; + +template <class T> +struct C +{ + friend constexpr int f(C) { return 0; } + friend constexpr int g(C, A) { return 0; } // { dg-error "double" } + constexpr int m(C) { return 0; } + constexpr int m(A) { return 0; } // { dg-error "double" } +}; + +constexpr int i = f(C<int>()); +constexpr int j = C<int>().m(C<int>()); +constexpr int k = C<double>().m(A()); // { dg-error "constexpr" } +constexpr int l = g(C<double>(),A()); // { dg-error "constexpr" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-function1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-function1.C new file mode 100644 index 0000000..ce4520d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-function1.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +// From N2235 + +constexpr int veryabs(int x) { return x < 0 ? -x : x; } + +constexpr long long_max() { return 2147483647; } + +constexpr int verysquare(int x) { return x * x; } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-function2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-function2.C new file mode 100644 index 0000000..8cb32c9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-function2.C @@ -0,0 +1,49 @@ +// { dg-do compile { target c++11 } } + +// From N2235 + +// Mess with the builtin by redeclaring. +constexpr int abs(int x) { return x < 0 ? -x : x; } + +extern "C" +{ + constexpr float + squaref(float x) { return x * x; } +} + +// implicitly inline, already: warn? +inline constexpr double +squared(double x) { return x * x; } + +constexpr int squarei(int x) { return x * x; } +extern const int side; // { dg-message "not initialized with a constant expression" } +constexpr int area = squarei(side); // { dg-error "side|argument" } +// error: squarei(side) is not a constant expression + +int next(constexpr int x) // { dg-error "parameter" } +{ return x + 1; } + +constexpr void f(int x) // { dg-error "return type .void" } +{ /* ... */ } + +constexpr int prev(int x) +{ return --x; } // { dg-error "--" } + +constexpr int g(int x, int n) // error: body not just ‘‘return expr’’ +{ + int r = 1; + while (--n > 0) r *= x; + return r; +} // { dg-error "not a return-statement" } + +constexpr int +bar(int x, int y) { return x + y + x * y; } // { dg-message "previously" } + +int bar(int x, int y) // { dg-error "redefinition" } +{ return x * 2 + 3 * y; } + +constexpr int twice(int x); // { dg-message "never defined" } +enum { bufsz = twice(256) }; // { dg-error "" } twice() isn’t (yet) defined + +constexpr int fac(int x) +{ return x > 2 ? x * fac(x - 1) : 1; } // OK diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-function3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-function3.C new file mode 100644 index 0000000..ea4f4ab --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-function3.C @@ -0,0 +1,29 @@ +// { dg-do compile { target c++11 } } + +// From N2235 + +// function template 1 +template<typename T> + constexpr int bytesize(T t) + { return sizeof (t); } // OK + +char buf[bytesize(0)]; // OK -- not C99 VLA + + +// function template 2 +template<typename _Tp> + constexpr _Tp + square(_Tp x) { return x; } + +// Explicit specialization +template<> + constexpr unsigned long + square(unsigned long x) { return x * x; } + +// Explicit instantiation +template int square(int); + +class A { }; +template A square(A); + +template long square(long); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-generated1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-generated1.C new file mode 100644 index 0000000..39be3ed --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-generated1.C @@ -0,0 +1,21 @@ +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice.C new file mode 100644 index 0000000..fb7570f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice.C @@ -0,0 +1,11 @@ +// We used to crash on this instead of giving a decent error. +// { dg-do compile { target c++11 } } + +struct A { int i; }; + +struct B { + const A *a; + constexpr B(const A& a): a(&a) { } +}; + +constexpr B b{A{42}}; // { dg-error "constant|expansion" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice10.C new file mode 100644 index 0000000..f6fc80c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice10.C @@ -0,0 +1,8 @@ +// PR c++/60225 +// { dg-do compile { target c++11 } } + +struct A +{ + constexpr A() {} + static constexpr A a[2] = {}; // { dg-error "incomplete" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice11.C new file mode 100644 index 0000000..3e32bf6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice11.C @@ -0,0 +1,9 @@ +// PR c++/58610 +// { dg-do compile { target c++11 } } + +struct A +{ + template<typename> A(); +}; + +constexpr A a; // { dg-error "literal|matching" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice12.C new file mode 100644 index 0000000..98f53b1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice12.C @@ -0,0 +1,9 @@ +// PR c++/58609 +// { dg-do compile { target c++11 } } + +struct A +{ + static constexpr int&& i = 0; // { dg-error "initialization" } +}; + +int j = A::i; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice13.C new file mode 100644 index 0000000..4fe3716 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice13.C @@ -0,0 +1,8 @@ +// PR c++/59571 +// { dg-do compile { target c++11 } } + +template <class> +struct foo +{ + static constexpr int bar{(int)-1}; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice14.C new file mode 100644 index 0000000..f936fb9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice14.C @@ -0,0 +1,11 @@ +// PR c++/60305 +// { dg-do compile { target c++11 } } + +template<int I> int foo() { return I; } + +template<int... I> void bar() +{ + constexpr int (*X[])() = { foo<I>... }; +} + +template void bar<1,3,5>(); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice2.C new file mode 100644 index 0000000..dee4817 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice2.C @@ -0,0 +1,3 @@ +// { dg-do compile { target c++11 } } +int x; +constexpr int& rx = x; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice3.C new file mode 100644 index 0000000..fccd120 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice3.C @@ -0,0 +1,13 @@ +// PR c++/46289 +// { dg-do compile { target c++11 } } + +struct A +{ + int i; +}; + +struct B +{ + A a; + constexpr B(): a({1,2}) { } // { dg-error "" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice4.C new file mode 100644 index 0000000..a083c85 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice4.C @@ -0,0 +1,9 @@ +// PR c++/51612 +// { dg-do compile { target c++11 } } + +struct A {}; + +struct B : virtual A +{ + constexpr B() { } // { dg-error "has virtual base classes" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice5.C new file mode 100644 index 0000000..c5a117c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice5.C @@ -0,0 +1,13 @@ +// PR c++/51621 +// { dg-do compile { target c++11 } } + +struct A +{ + A() {} +}; + +struct B +{ + A a[1]; + constexpr B() : a() {} // { dg-error "non-constant|non-constexpr" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice6.C new file mode 100644 index 0000000..30e0a64 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice6.C @@ -0,0 +1,11 @@ +// PR c++/51327 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice7.C new file mode 100644 index 0000000..4fa3a83 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice7.C @@ -0,0 +1,15 @@ +// PR c++/57827 +// { dg-do compile { target c++11 } } + +struct C +{ + constexpr int fun (int x) + { + return x + 1; + } + + int a = 2; + int b = fun(a); +}; + +C c; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice8.C new file mode 100644 index 0000000..84bfae0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice8.C @@ -0,0 +1,17 @@ +// PR c++/53349 +// { dg-do compile { target c++11 } } + +template <int N> +struct Foo { + constexpr Foo(const Foo<N-1> a) : m_a(a) {} + constexpr Foo(const Foo<N> &a) : m_a(a.m_a) {} + + Foo<N-1> m_a; +}; + +template <> struct Foo<0> {}; + +constexpr Foo<1> catty1(Foo<1> x) { return x; } +constexpr Foo<2> catty2(Foo<1> x) { return Foo<2>(catty1(x)); } + +constexpr auto res = catty2(Foo<1>(Foo<0>())); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice9.C new file mode 100644 index 0000000..50de372 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice9.C @@ -0,0 +1,7 @@ +// PR c++/58607 +// { dg-do compile { target c++11 } } + +struct A +{ + constexpr A() { i; } // { dg-error "declared|empty body" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete1.C new file mode 100644 index 0000000..514cca5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete1.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } + +struct A +{ + static constexpr A a = 1; // { dg-error "incomplete" } + constexpr A(int i) { } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete2.C new file mode 100644 index 0000000..a8af2e6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete2.C @@ -0,0 +1,31 @@ +// A constructor that might or might not be constexpr still makes +// its class literal. +// { dg-do compile { target c++11 } } + +template <class T> +struct B +{ + constexpr B(T) { } + constexpr B() {} +}; + +struct A +{ + B<A> b; +}; + +constexpr A a {}; + +template <class T> +struct C +{ + constexpr C(T) { } + C() {} +}; + +struct D +{ + C<D> c; +}; + +constexpr D d {}; // { dg-error "non-constexpr function" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete3.C new file mode 100644 index 0000000..c0516f0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete3.C @@ -0,0 +1,12 @@ +// PR c++/49015 +// { dg-do compile { target c++11 } } + +class A; + +class B { + friend constexpr B f(A); // Line 5 +}; + +class A {}; + +constexpr B f(A) { return B(); } // Line 10 diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist.C new file mode 100644 index 0000000..52fc9ea --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist.C @@ -0,0 +1,64 @@ +// { dg-do run { target c++11 } } + +namespace xstd { + +typedef decltype(sizeof(char)) size_t; + +template<class E> +class initializer_list { +private: + size_t sz; + const E* start; + +public: + typedef E value_type; + typedef const E& reference; + typedef const E& const_reference; + typedef size_t size_type; + typedef const E* iterator; + typedef const E* const_iterator; + + constexpr initializer_list() : sz(), start(nullptr) {} + + template<size_t N> + constexpr initializer_list(const E(&array)[N]) : sz(N), start(array) {} + + constexpr size_t size() { return sz; } + + constexpr const E* begin() { return start; } + + constexpr const E* end() { return start + sz; } +}; + +template<class E, size_t N> +constexpr initializer_list<E> make_list(const E(&array)[N]) { + return initializer_list<E>(array); +} + +template<class E> +E min(initializer_list<E> list) +{ + // static_assert(list.size() > 0, "Invalid list"); + auto it = list.begin(); + E result = *it; + for (++it; it != list.end(); ++it) { + if (*it < result) { + result = *it; + } + } + return result; +} + +} + +constexpr int global_i[] = {2, 4, -5, 6, 10}; +constexpr xstd::initializer_list<int> list(global_i); +#define SA(X) static_assert(X, #X) +SA(list.size() == 5); +SA(list.begin()[2] == -5); +SA(list.end()[-1] == 10); + +int main() { + if (xstd::min(xstd::make_list(global_i)) != -5) + return 1; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist2.C new file mode 100644 index 0000000..65a7036 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist2.C @@ -0,0 +1,10 @@ +// { dg-do compile { target c++11 } } + +#include <initializer_list> + +constexpr auto list = { 1, 2, 3, 4 }; + +#define SA(X) static_assert(X, #X) +SA(list.size() == 4); +SA(list.begin()[2] == 3); +SA(list.end()[-1] == 4); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist3.C new file mode 100644 index 0000000..912cf91 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist3.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } + +#include <initializer_list> +#define SA(X) static_assert(X,#X) + +constexpr int f(std::initializer_list<int> l) { return l.begin()[0]; } + +int main() +{ + constexpr int i = f({42}); + SA(i==42); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist4.C new file mode 100644 index 0000000..d4019b2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist4.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist5.C new file mode 100644 index 0000000..901510e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist5.C @@ -0,0 +1,15 @@ +// PR c++/50024 +// { dg-do compile { target c++11 } } + +template< class T > +struct Container +{ + Container(){ + int* ptr = new int{}; + } +}; + +int main() { + Container< int > c; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist6.C new file mode 100644 index 0000000..8c344c0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist6.C @@ -0,0 +1,27 @@ +// PR c++/55419 +// { dg-do compile { target 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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist7.C new file mode 100644 index 0000000..6fea82f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist7.C @@ -0,0 +1,7 @@ +// PR c++/60186 +// { dg-require-effective-target c++11 } + +template<typename> void foo(int i) +{ + constexpr int a[] = { i }; // { dg-error "" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-invisiref1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-invisiref1.C new file mode 100644 index 0000000..e0ede73 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-invisiref1.C @@ -0,0 +1,36 @@ +// PR c++/55879 +// { dg-do compile { target c++11 } } + +class CAddress +{ +public: + constexpr CAddress(unsigned long begin) : m_Begin(begin) {} + constexpr CAddress(const CAddress &other) : m_Begin(other.m_Begin) {} + +private: + unsigned long m_Begin; +}; + +extern "C" char _lnkDDRRAM; +/* internal compiler error on gcc 4.6.3 */ +const CAddress s_Memmap[2] +{ + {(unsigned long)&_lnkDDRRAM}, /* segmentation fault */ + {0x40000000}, +}; + +class CNested { +public: + constexpr CNested(const CAddress primary) + : m_PrimaryBlock(primary) {} + +private: + CAddress m_PrimaryBlock; +}; + +/* internal compiler error on gcc 4.7.2 */ +const CNested s_taskDescriptions[2] +{ + {{0x42000000}}, + {{0x43000000}}, +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-is_literal.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-is_literal.C new file mode 100644 index 0000000..f255b8d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-is_literal.C @@ -0,0 +1,39 @@ +// { dg-do compile { target c++11 } } + +#include <type_traits> + +#define IS_LIT(T) (std::is_literal_type<T>::value) +#define SA(X) static_assert (X, #X) +#define YES(T) SA(IS_LIT(T)) +#define NO(T) SA(!IS_LIT(T)) + +enum E1 { }; +enum class E2 { }; +struct Literal {}; + +struct NotLiteral { + ~NotLiteral(); +}; + +YES(int); +YES(int[]); +YES(int[3]); +YES(double); +YES(void *); +YES(decltype (nullptr)); +YES(int Literal::*); +YES(void (Literal::*)()); +YES(E1); +YES(E2); +YES(Literal); +NO (NotLiteral); +YES(NotLiteral *); +YES(NotLiteral NotLiteral::*); +YES(NotLiteral (NotLiteral::*)(NotLiteral)); + +struct A { + A(const A&) = default; + A(int); +}; + +NO(A); // no constexpr ctor other than copy diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-main.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-main.C new file mode 100644 index 0000000..42720ad --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-main.C @@ -0,0 +1,3 @@ +// { dg-do compile { target c++11 } } + +constexpr int main (); // { dg-error "constexpr" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-memfn1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-memfn1.C new file mode 100644 index 0000000..775c103 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-memfn1.C @@ -0,0 +1,18 @@ +// PR c++/48296 +// { dg-do compile { target c++11 } } + +struct X +{ + constexpr X() { } + constexpr X f(X x) { return x; } + constexpr X g(X x); +}; + +constexpr X X::g(X x) { return x; } + +struct Y +{ + Y() { } + constexpr Y f(Y y); // { dg-error "not a literal type" } + static constexpr Y g(Y y) {} // { dg-error "constexpr" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-missing.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-missing.C new file mode 100644 index 0000000..afaf2e3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-missing.C @@ -0,0 +1,38 @@ +// PR c++/48911 +// { dg-do compile { target c++11 } } + +#define SA(X) static_assert((X),#X) + +struct A +{ + constexpr A () : a (6) {} + int a; +}; + +int +main () +{ + constexpr int a[2] = { 42 }; + constexpr int i = a[1]; + SA(i==0); + constexpr int b[1] = { }; + constexpr int j = b[0]; + SA(j==0); + constexpr char c[2] = "a"; + constexpr char k = c[1]; + SA(k==0); + constexpr char d[2] = ""; + constexpr char l = d[1]; + SA(l==0); + constexpr wchar_t e[2] = L"a"; + constexpr wchar_t m = e[1]; + SA(m==0); + constexpr wchar_t f[2] = L""; + constexpr wchar_t n = f[1]; + SA(n==0); + constexpr A g[2] = { A () }; + constexpr A o = g[0]; + SA(o.a == 6); + constexpr A p = g[1]; + SA(p.a == 6); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-mutable1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-mutable1.C new file mode 100644 index 0000000..832a161 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-mutable1.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-neg1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-neg1.C new file mode 100644 index 0000000..fb4c012 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-neg1.C @@ -0,0 +1,69 @@ +// Negative examples from N3092 (FCD) +// { dg-do compile { target c++11 } } + +// OK: declaration +constexpr int square(int x); // { dg-message "never defined" } + +// error: pixel is a type +constexpr struct pixel { + int x; + int y; + // OK: declaration + constexpr pixel(int); +}; // { dg-error "constexpr" } +constexpr pixel::pixel(int a) +// OK: definition + : x(square(a)), y(square(a)) // { dg-error "square" } +{ } + +// error: square not defined, so small(2) not constant (5.19), so constexpr +// not satisfied +constexpr pixel small(2); // { dg-message "in constexpr expansion" } + +// error: not for parameters +int next(constexpr int x) { // { dg-error "parameter" } + return x + 1; +} + +// error: not a definition +extern constexpr int memsz; // { dg-error "definition" } + +// error: return type is void +constexpr void f(int x) // { dg-error "void" } +{ /* ... */ } +// error: use of decrement +constexpr int prev(int x) +{ return --x; } // { dg-error "-- x" } + +// error: body not just return expr +constexpr int g(int x, int n) { + int r = 1; + while (--n > 0) r *= x; + return r; +} // { dg-error "body of constexpr function" } + +class debug_flag { +public: + explicit debug_flag(bool); + constexpr bool is_on(); // { dg-error "not a literal type" } debug_flag not literal type +private: + bool flag; +}; +// OK +constexpr int bar(int x, int y) // { dg-message "previously defined here" } +{ return x + y + x*y; } +// ... +// error: redefinition of bar +int bar(int x, int y) // { dg-error "redefinition" } +{ return x * 2 + 3 * y; } + +struct pixel2 { // { dg-message "no user-provided default constructor" } + int x, y; +}; +constexpr pixel2 ur = { 1294, 1024 };// OK +constexpr pixel2 origin; // { dg-error "uninitialized const" } + +constexpr const int* addr(const int& ir) { return &ir; } // OK + +// error, initializer for constexpr variable not a constant +extern constexpr const int* tp = addr(5); // { dg-error "" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-neg2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-neg2.C new file mode 100644 index 0000000..793b4c3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-neg2.C @@ -0,0 +1,27 @@ +// PR c++/54020 +// { dg-do compile { target c++11 } } + +// Preliminaries. +extern int nonconst_func(int); +constexpr int identity(int x) { return x; } +constexpr int zero() { return identity(0); } +constexpr int one() { return identity(1); } + +// Correctly accepted. +constexpr int three = one() ? 3 : nonconst_func(0); + +// Incorrectly accepted. See [dcl.constexpr] #5: +// For a constexpr function, if no function argument values exist +// such that the function invocation sub-stitution would produce a +// constant expression (5.19), the program is ill-formed; no diagnostic +// required. +constexpr int bogus() { return zero () ? 3 : nonconst_func(0); } // { dg-error "nonconst_func" } + +// Correctly rejected (not sure why). +constexpr int correct_error() { return nonconst_func(0); } // { dg-error "nonconst_func" } + +// Correctly rejected. +constexpr int z = bogus(); // { dg-error "" } + +// This is also correctly rejected. +constexpr int correct_failure() { return 0 ? 3 : nonconst_func(0); } // { dg-error "nonconst_func" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept.C new file mode 100644 index 0000000..dbadaa8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept.C @@ -0,0 +1,13 @@ +// { dg-do compile { target c++11 } } + +template<class T> +struct is_funny { + static constexpr bool value = false; +}; + +template<class T> +constexpr T value(T t) noexcept(is_funny<T>::value) { return t; } // Line 7 + +constexpr bool ok = noexcept(value(42)); + +static_assert(ok, "Assertion failure"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept2.C new file mode 100644 index 0000000..d10039a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept2.C @@ -0,0 +1,14 @@ +// { dg-do compile { target c++11 } } + +template<class T> +constexpr T value(T t) { return t; } + +template<class T> +struct is_funny { + static constexpr bool value = false; +}; + +template<class T> +void eval() noexcept(value(is_funny<T>::value)) {} + +constexpr bool ok = noexcept(eval<int>()); // line 12 diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept3.C new file mode 100644 index 0000000..9541bc0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept3.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } + +constexpr int f(int i) { return i; } +#define SA(X) static_assert (X, #X) +SA(noexcept(f(42))); +int j; +SA(!noexcept(f(j))); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept4.C new file mode 100644 index 0000000..eb71900 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept4.C @@ -0,0 +1,14 @@ +// { dg-do compile { target c++11 } } +// A call is noexcept if it is a valid subexpression of a constant +// expression, even if it is not itself a constant expression. + +#define SA(X) static_assert(X,#X) + +constexpr const int* f(const int *p) { return p; } + +int main() +{ + constexpr int i = 42; + SA(noexcept(*f(&i))); + SA(noexcept(f(&i))); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept5.C new file mode 100644 index 0000000..7b0c835 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept5.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } + +struct booleable { + bool data; + constexpr explicit operator bool() { return data; } +}; + +constexpr booleable truthy_func() { return {true}; } + +void funky() noexcept(truthy_func()) {} + +int main() { + funky(); + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept6.C new file mode 100644 index 0000000..76d9246 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept6.C @@ -0,0 +1,10 @@ +// PR c++/51305 +// { dg-do compile { target c++11 } } + +constexpr bool ok() noexcept +{ + typedef int type; + return true; +} + +constexpr auto x = ok(); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept7.C new file mode 100644 index 0000000..2a70d7b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept7.C @@ -0,0 +1,9 @@ +// PR c++/53473 +// { dg-do compile { target c++11 } } + +template<typename T> struct A +{ + static constexpr T foo() noexcept { return 0; } +}; + +template<> constexpr int A<int>::foo() noexcept { return 0; } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg.C new file mode 100644 index 0000000..0f68643 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg.C @@ -0,0 +1,24 @@ +// Example from issue 1125 drafting; D() and v were well-formed with the +// wording approved in Rapperswil, now seems they should be ill-formed. +// { dg-do compile { target c++11 } } + +struct B { + constexpr B(int x) : i(0) { } // "x" is unused + int i; +}; + +int global; // { dg-message "not const" } + +struct D : B { + constexpr D() : B(global) { } // { dg-error "global|argument" } +}; + +struct A2 { + constexpr A2(bool b, int x) : m(b ? 42 : x) { } + int m; +}; + +// ok, constructor call initializes m with the value 42 after substitution +constexpr int v = A2(true, global).m; // { dg-error "global" } +// error: initializer for m is "x", which is non-constant +constexpr int w = A2(false, global).m; // { dg-error "global" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg2.C new file mode 100644 index 0000000..32a023b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg2.C @@ -0,0 +1,17 @@ +// PR c++/47200 +// { dg-do compile { target c++11 } } +// { dg-options "-w" } + +template < int > struct duration +{ + constexpr int count (); + static constexpr duration min (); +}; + +constexpr int +f (duration < 0 > d, duration < 0 > ) +{ + return d.count (); +} + +static_assert (f (duration < 0 >::min (), duration < 0 > ()), ""); // { dg-error "non-constant|before its definition" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg3.C new file mode 100644 index 0000000..d8603f8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg3.C @@ -0,0 +1,22 @@ +// PR c++/49988 +// { dg-do run { target c++11 } } + +template<int ... I> struct X { }; + +struct A { + char data[3]; + template<int ... I> + constexpr + A(const char (&s)[3], X<I...> x) : data{ s[I]...} { } +}; +struct B { + A a; + B(const char (&s)[3]) : a{s,X<0,1,2>{}} { } +}; + +int main() +{ + B b{"12"}; + if (b.a.data[0] != '1') + return 1; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-nonlit.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-nonlit.C new file mode 100644 index 0000000..0534b41 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-nonlit.C @@ -0,0 +1,13 @@ +// FIXME this is currently invalid, but seems like it should be OK +// { dg-do compile { target c++11 } } + +struct A { A() { } }; + +template<class T> +constexpr bool ignore(T&&) { return true; } + +static_assert(ignore(10), "Error"); // OK + +A s; + +static_assert(ignore(s), "Error"); // Currently an error diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-nonlit2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-nonlit2.C new file mode 100644 index 0000000..2d712b6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-nonlit2.C @@ -0,0 +1,19 @@ +// { dg-do compile { target c++11 } } + +struct A +{ + ~A(); +}; + +template<class T> +struct W { + T t; + template<class U> + constexpr W(U&& u) : t(u) {} +}; + +template <class T> +constexpr W<T> make_w(T& w) { return W<T>(w); } + +A a; +constexpr auto w = make_w(a); // { dg-error "" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-nonstatic.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-nonstatic.C new file mode 100644 index 0000000..bb0743a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-nonstatic.C @@ -0,0 +1,6 @@ +// { dg-do compile { target c++11 } } + +struct A +{ + constexpr int i; // { dg-error "" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-nullptr.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-nullptr.C new file mode 100644 index 0000000..8ff8998 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-nullptr.C @@ -0,0 +1,6 @@ +// { dg-do compile { target c++11 } } + +constexpr int zero() { return 0; } + +void* ptr1 = zero(); // { dg-error "int" } +constexpr void* ptr2 = zero(); // { dg-error "int" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-object1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-object1.C new file mode 100644 index 0000000..41afbe9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-object1.C @@ -0,0 +1,29 @@ +// { dg-do compile { target c++11 } } + +// From N2235 + +// 4.5.2 semantics + +// p 1 constexpr specifier +// objects, static const data +struct A1 { int i; }; // { dg-message "no user-provided default constructor" } + +constexpr int i1 = 1024; +constexpr A1 a1 = A1(); + +// error: not a definition +extern constexpr int i2; // { dg-error "definition" } + +// error: missing initializer +constexpr A1 a2; // { dg-error "uninitialized const" } + +const constexpr A1 a3 = A1(); + +volatile constexpr A1 a4 = A1(); // { dg-error "both .volatile. and .constexpr. cannot" } + +// error: on type declaration +constexpr struct pixel +{ + int x; + int y; +}; // { dg-error "cannot be used for type declarations" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-object2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-object2.C new file mode 100644 index 0000000..d52967a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-object2.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } + +constexpr int verysquare(int x) { return x * x; } + +const double mass = 9.8; +constexpr double energy = mass * verysquare(56.6); // { dg-error "mass" "" { xfail *-*-* } } + +int arr[(int)mass]; // { dg-error "mass" "" { xfail *-*-* } } + +float array[verysquare(9)]; // OK -- not C99 VLA + +extern const int medium; +const int high = verysquare(medium); // OK -- dynamic initialization + +enum { Max = verysquare(7) }; // OK diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-overflow.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-overflow.C new file mode 100644 index 0000000..8406e49 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-overflow.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-w -ftrack-macro-expansion=0" } + +#include <limits.h> +extern constexpr int max_s = INT_MAX + 1; // { dg-error "" } +extern constexpr unsigned max_u = UINT_MAX + 1u; // OK +extern constexpr int abs_s = -INT_MIN; // { dg-error "" } overflows on 2's complement machines diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-overflow2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-overflow2.C new file mode 100644 index 0000000..bd2e687 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-overflow2.C @@ -0,0 +1,8 @@ +// PR c++/47504 +// { dg-do compile { target c++11 } } + +char constexpr sub(char arg) +{ return char(arg - char(1)); } + +int main() +{ static char constexpr m = sub(-1); } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-pedantic.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-pedantic.C new file mode 100644 index 0000000..21f4c83 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-pedantic.C @@ -0,0 +1,17 @@ +// The FCD doesn't allow typedefs and static_assert in constexpr functions, +// but it should. +// { dg-do compile { target c++11 } } +// { dg-options "-pedantic" } + +template <class T> +constexpr T f(T t) +{ + typedef T T2; // { dg-warning "constexpr" "" { xfail *-*-* } } + static_assert (T2(0) == T(0), ""); // { dg-warning "constexpr" "" { xfail *-*-* } } + return t; +} + +int main() +{ + constexpr int i = f(42); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-pos1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-pos1.C new file mode 100644 index 0000000..8e82ef5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-pos1.C @@ -0,0 +1,60 @@ +// Positive examples from N3092 (FCD) +// { dg-do compile { target c++11 } } + +#define SA(X) static_assert(X, #X) + +constexpr int bufsz = 1024; // OK: definition +SA (bufsz == 1024); + +constexpr int square(int x); // OK: declaration + +struct pixel { + int x; + int y; + // OK: declaration + constexpr pixel(int); +}; +constexpr pixel::pixel(int a) // OK: definition + : x(square(a)), y(square(a)) +{ } + +constexpr int square(int x) // OK: definition +{ return x * x; } + +constexpr pixel large(4); // OK: square defined +SA(large.x == 16 && large.y==16); + +constexpr long long_max() // OK +{ return 2147483647; } + +SA(long_max() == 2147483647); + +constexpr int abs(int x) // OK +{ return x < 0 ? -x : x; } + +SA(abs(-1) == 1); +SA(abs(24) == 24); + +struct Length { + explicit constexpr Length(int i = 0) : val(i) { } +private: + int val; +}; + +constexpr Length l1; +constexpr Length l2(12); + +struct pixel2 { + int x, y; +}; +constexpr pixel2 ur = { 1294, 1024 };// OK + +SA(ur.x == 1294 && ur.y == 1024); + +constexpr const int* addr(const int& ir) { return &ir; } // OK +static const int x = 5; +extern constexpr const int* xp = addr(x); // OK: (const int*)&(const int&)x + // is an address contant expression +SA(xp == &x); +extern constexpr int x2 = *addr(5); +SA(x2 == 5); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-potential1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-potential1.C new file mode 100644 index 0000000..f960e3a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-potential1.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } +// We decided in Rapperswil that it's OK if any value of decide can produce +// a constant expression. + +constexpr int may_throw(bool decide) { + return decide ? 42 : throw -1; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem.C new file mode 100644 index 0000000..c16fb15 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem.C @@ -0,0 +1,20 @@ +// { dg-do compile { target c++11 } } + +struct C { // literal type + int m; + int n; + constexpr C(int m) : m(m), n(-m) {} + constexpr bool is_neg() { return m < 0; } +}; + +constexpr bool check1(const C& c, int C:: *pm) { return c.*pm < 0; } // #1 + +constexpr bool check2(const C* pc, bool (C::*pm)() const) { return +(pc->*pm)(); } // #2 + +constexpr C c(-1); + +static_assert(!check1(c, &C::n), "Error"); +static_assert(check1(c, &C::m), "Error"); + +static_assert(check2(&c, &C::is_neg), "Error"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrsub.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrsub.C new file mode 100644 index 0000000..18648d9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrsub.C @@ -0,0 +1,14 @@ +// PR c++/51489 +// DR 1313 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-pure.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-pure.C new file mode 100644 index 0000000..f54b7c5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-pure.C @@ -0,0 +1,13 @@ +// { dg-do compile { target c++11 } } + +struct A +{ + virtual void f() = 0; +}; + +struct B: A +{ + void f() { } +}; + +B b; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-recursion.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-recursion.C new file mode 100644 index 0000000..e3e13f7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-recursion.C @@ -0,0 +1,6 @@ +// Test that we catch excessive recursion. +// { dg-do compile { target c++11 } } +// { dg-options "-fconstexpr-depth=5" } +// { dg-prune-output "in constexpr expansion" } +constexpr int f (int i) { return f (i-1); } +constexpr int i = f(42); // { dg-error "constexpr evaluation depth" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-redeclaration1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-redeclaration1.C new file mode 100644 index 0000000..6010b20 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-redeclaration1.C @@ -0,0 +1,10 @@ +// PR c++/59123 +// { dg-do compile { target c++11 } } + +// Fwd-declarations +struct S; +extern const S s; + +// (... later) definitions +struct S {}; +constexpr S s {}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ref1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ref1.C new file mode 100644 index 0000000..f3e4cea --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ref1.C @@ -0,0 +1,44 @@ +// PR c++/49172 +// { dg-do compile { target c++11 } } + +#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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ref2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ref2.C new file mode 100644 index 0000000..7697363 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ref2.C @@ -0,0 +1,17 @@ +// Negative reference variable tests. +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ref3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ref3.C new file mode 100644 index 0000000..7936536 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ref3.C @@ -0,0 +1,10 @@ +// PR c++/50298 +// { dg-do compile { target c++11 } } + +int global_variable; + +template <class T> struct X { + static constexpr T r = global_variable; +}; + +X<int&> x; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ref4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ref4.C new file mode 100644 index 0000000..ce1ce52 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ref4.C @@ -0,0 +1,18 @@ +// PR c++/54777 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-reinterpret1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-reinterpret1.C new file mode 100644 index 0000000..69db98b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-reinterpret1.C @@ -0,0 +1,37 @@ +// PR c++/56728 +// { dg-require-effective-target c++11 } + +class B { +public: + static B instance; + class Inner + { + public: + class Wuzi + { + unsigned int m; + } m_Class[3]; + unsigned m_Int[4]; + }; + + constexpr static Inner & getInner() + { + /* I am surprised this is considered a constexpr */ + return *((Inner *)4); + } // { dg-error "reinterpret_cast" } +}; + +B B::instance; + +class A +{ +public: + constexpr A(B &bridge, B::Inner &bridge2, unsigned char index) + : m_Bridge(bridge), m_Wuz(bridge2.m_Class[index]) + {} + + B &m_Bridge; + B::Inner::Wuzi &m_Wuz; +}; +A works{B::instance, B::getInner(), 3}; +A crashnkill[1]{{B::instance, B::getInner(), 3}}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-rom.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-rom.C new file mode 100644 index 0000000..697203d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-rom.C @@ -0,0 +1,13 @@ +// PR c++/49673: check that test_data goes into .rodata +// { dg-do compile { target c++11 } } +// { dg-additional-options -G0 { target { { alpha*-*-* frv*-*-* ia64-*-* lm32*-*-* m32r*-*-* microblaze*-*-* mips*-*-* nios2-*-* powerpc*-*-* rs6000*-*-* score*-*-* } && { ! { *-*-darwin* *-*-aix* alpha*-*-*vms* } } } } } +// { dg-final { scan-assembler "\\.rdata" { target mips*-*-* } } } +// { dg-final { scan-assembler "rodata" { target { { *-*-linux-gnu *-*-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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-sassert.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-sassert.C new file mode 100644 index 0000000..7f82671 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-sassert.C @@ -0,0 +1,13 @@ +// Allow static_assert in constexpr constructors, too. +// { dg-do compile { target c++11 } } + +template<typename T> +struct A +{ + int i; + + constexpr A(int i) : i(i) + { + static_assert(sizeof(T) == 1, ""); + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-specialization.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-specialization.C new file mode 100644 index 0000000..80f56a1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-specialization.C @@ -0,0 +1,12 @@ +// PR c++/56871 +// { dg-do compile { target c++11 } } + +template<typename T> constexpr int foo(T); +template<> int foo(int); +template<> int foo(int); // { dg-error "previous" } +template<> constexpr int foo(int); // { dg-error "redeclaration" } + +template<typename T> int bar(T); +template<> constexpr int bar(int); +template<> constexpr int bar(int); // { dg-error "previous" } +template<> int bar(int); // { dg-error "redeclaration" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static.C new file mode 100644 index 0000000..24174ac --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static.C @@ -0,0 +1,24 @@ +// Test for constant initialization of non-literal class (e.g. mutex) +// { dg-options "-save-temps" } +// { dg-do run { target c++11 } } + +struct A +{ + int i; + constexpr A(int _i): i(_i) { } + A(const A&); // non-trivial copy ctor makes A non-literal +}; + +A a(42); // constexpr constructor allows constant initialization +A ar[3] = { { 1 }, { 2 }, { 3 } }; +// { dg-final { scan-assembler-not "static_initialization" } } +// { dg-final cleanup-saved-temps } + +int main() +{ + if (a.i != 42 + || ar[0].i != 1 + || ar[1].i != 2 + || ar[2].i != 3) + return 1; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static10.C new file mode 100644 index 0000000..e908fb3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static10.C @@ -0,0 +1,19 @@ +// PR c++/55944 +// { dg-do compile { target c++11 } } + +template<class T> +struct Test +{ + constexpr Test(T val) : value(val) {} + static void test() + { + static constexpr Test<int> x(42); // ICE + } + T value; +}; + +int main() +{ + static constexpr Test<int> x(42); // OK + Test<double>::test(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static11.C new file mode 100644 index 0000000..91cc25a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static11.C @@ -0,0 +1,14 @@ +// PR c++/54532 +// { dg-do compile { target c++11 } } + +#define SA(X) static_assert(X,#X) + +struct A { + int i; + constexpr static int A::*p = &A::i; +}; + +constexpr A a = { 42 }; +SA(a.*A::p == 42); + +constexpr int A::* A::p; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static2.C new file mode 100644 index 0000000..70a254c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static2.C @@ -0,0 +1,11 @@ +// { dg-do compile { target c++11 } } +struct IsLiteral {}; + +struct ShouldBeLiteral { + constexpr ShouldBeLiteral(int){} +}; + +struct StaticDataMember { + static constexpr IsLiteral one = IsLiteral(); // #1 + static constexpr ShouldBeLiteral two= ShouldBeLiteral(-1); // #2 +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static3.C new file mode 100644 index 0000000..6d65a62 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static3.C @@ -0,0 +1,18 @@ +// Test for constant initialization of class with vtable +// { dg-options "-save-temps" } +// { dg-final { scan-assembler-not "static_initialization" } } +// { dg-final cleanup-saved-temps } +// { dg-do run { target c++11 } } + +int r = 1; +// implicit default constructor for A and B is constexpr +struct A { virtual void f() {} }; +struct B: A { virtual void f() { r = 0; } }; + +B b; + +int main() +{ + b.f(); + return r; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static4.C new file mode 100644 index 0000000..fa1a4c7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static4.C @@ -0,0 +1,19 @@ +// { dg-do run { target c++11 } } + +extern "C" void abort (); +extern int ar[2]; + +int f() +{ + if (ar[0] != 42 || ar[1] != 0) + abort (); + return 1; +} + +int i = f(); + +int ar[2] = { 42, i }; + +int main() +{ +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static5.C new file mode 100644 index 0000000..d161cf5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static5.C @@ -0,0 +1,17 @@ +// { dg-do compile { target c++11 } } + +template <class T> +struct A +{ + constexpr static T t = T(); // { dg-error "literal" } +}; +template <class T> +constexpr T A<T>::t; + +struct B +{ + ~B(); +}; + +B b = A<B>::t; + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static6.C new file mode 100644 index 0000000..78065c3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static6.C @@ -0,0 +1,21 @@ +// { dg-do compile { target c++11 } } + +struct B +{ + constexpr operator int() { return 4; } +}; + +template <int I> +struct C; + +template<> +struct C<4> { typedef int TP; }; + +template <class T> +struct A +{ + constexpr static B t = B(); + C<t>::TP tp; +}; + +A<B> a; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static7.C new file mode 100644 index 0000000..272ebd9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static7.C @@ -0,0 +1,10 @@ +// PR c++/48945 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static8.C new file mode 100644 index 0000000..34aa5af --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-static8.C @@ -0,0 +1,8 @@ +// PR c++/50258 +// { dg-do compile { target c++11 } } +// { dg-options "-fpermissive" } + +struct Foo { + static const double d = 3.14; // { dg-warning "constexpr" } +}; +const double Foo::d; // { dg-warning "constexpr" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-stmtexpr.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-stmtexpr.C new file mode 100644 index 0000000..bebd4f6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-stmtexpr.C @@ -0,0 +1,9 @@ +// PR c++/46977 +// { dg-do compile { target c++11 } } +// { dg-options "" } + +template < typename > void +foo () +{ + ({int i;}), 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-string.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-string.C new file mode 100644 index 0000000..0f561a4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-string.C @@ -0,0 +1,5 @@ +// { dg-do compile { target c++11 } } + +constexpr char c1 = "hi"[1]; +constexpr char c2 = "hi"[2]; +constexpr char c3 = "hi"[3]; // { dg-error "out of bound" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-switch.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-switch.C new file mode 100644 index 0000000..ee94159 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-switch.C @@ -0,0 +1,13 @@ +// { dg-do compile { target c++11 } } + +template<class T> +constexpr T value(T t = T()) { return t; } + +enum us_enum { us_item = value<short>() }; // OK + +void func(us_enum n) { + switch (n) { + case value(us_item): ; // #1 Error + default: ; + } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-switch2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-switch2.C new file mode 100644 index 0000000..652a08d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-switch2.C @@ -0,0 +1,23 @@ +// Test for constexpr conversion in case context +// { dg-do compile { target c++11 } } + +enum class E { e1, e2 }; + +struct A +{ + E e; + constexpr operator E() { return e; } + constexpr A(E e): e(e) { } +}; + +E e; + +int main() +{ + switch (e) + { + case A(E::e1): + case A(E::e2): + ; + } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-synth1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-synth1.C new file mode 100644 index 0000000..27375e2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-synth1.C @@ -0,0 +1,14 @@ +// PR c++/46472 +// { dg-do compile { target c++11 } } + +template<class T> struct A { + T t; + constexpr A(){} +}; + +struct B +{ + A<int> a; +}; + +B b; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-targ.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-targ.C new file mode 100644 index 0000000..b517114 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-targ.C @@ -0,0 +1,13 @@ +// { dg-do compile { target c++11 } } + +struct A +{ + constexpr operator double() { return 1.0; } +}; + +template <int I> +struct B +{ }; + +constexpr A a { }; +B<a> b; // { dg-error "template argument|invalid type" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-temp1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-temp1.C new file mode 100644 index 0000000..d065436 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template1.C new file mode 100644 index 0000000..b949bd6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template1.C @@ -0,0 +1,27 @@ +// PR c++/50248, DR 1358 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template2.C new file mode 100644 index 0000000..a316b34 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template2.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template3.C new file mode 100644 index 0000000..f0ac222 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template3.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +struct A { constexpr operator int() { return 42; } }; + +template<class T> +struct B { + static const int versionConst = A(); + enum { versionEnum = versionConst }; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template4.C new file mode 100644 index 0000000..7adcae8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template4.C @@ -0,0 +1,26 @@ +// PR c++/55931 +// { dg-do compile { target c++11 } } + +#include <type_traits> + +template<typename Type> +class Test +{ + public: + constexpr Test(const Type val) : _value(val) {} + constexpr Type get() const {return _value;} + static void test() + { + static constexpr Test<int> x(42); + std::integral_constant<int, x.get()> i; // This is not working + } + protected: + Type _value; +}; + +int main() +{ + static constexpr Test<int> x(42); + std::integral_constant<int, x.get()> i; // This is working + Test<double>::test(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template5.C new file mode 100644 index 0000000..aa80658 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template5.C @@ -0,0 +1,6 @@ +// PR c++/54946 +// { dg-do compile { target c++11 } } + +template<const char*s> static void testfunc(); +constexpr struct testtype { const char* str; } test = { "abc"} ; +void (*functionpointer)() = testfunc<(const char*) test.str>; // { dg-error "" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template6.C new file mode 100644 index 0000000..fd0c957 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-template6.C @@ -0,0 +1,19 @@ +// PR c++/59268 +// { dg-do compile { target c++11 } } + +template <typename> +struct A +{ + constexpr A (int) {} + virtual void foo () + { + constexpr A<void> a (0); + } +}; + +void +bar () +{ + A<int> a (3); + a.foo (); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-throw.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-throw.C new file mode 100644 index 0000000..5666629 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-throw.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } + +constexpr int may_throw(bool decide) { + return decide ? 42 : throw -1; // { dg-error "throw" } +} + +constexpr int x = may_throw(false); // { dg-message "may_throw" } +constexpr int y = may_throw(true); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-tuple.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-tuple.C new file mode 100644 index 0000000..f59cd84 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-typedef1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-typedef1.C new file mode 100644 index 0000000..98c2309 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-typedef1.C @@ -0,0 +1,11 @@ +// PR c++/50508 +// { dg-do compile { target c++11 } } + +template <class T> + struct integral_constant { + typedef T value_type; + constexpr operator value_type() { return true; } + }; + +static constexpr bool value = integral_constant<bool>() + && true; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-typeid.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-typeid.C new file mode 100644 index 0000000..32af84e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-typeid.C @@ -0,0 +1,10 @@ +// { dg-do compile { target c++11 } } + +#include <typeinfo> + +struct A { virtual void f(); }; + +extern constexpr const std::type_info* p1 = &typeid(int); +extern constexpr const std::type_info* p2 = &typeid(A); +// typeid-expression whose operand is of a polymorphic class type +extern constexpr const std::type_info* p3 = &typeid((A())); // { dg-error "" "" { xfail *-*-* } } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union.C new file mode 100644 index 0000000..0c3548c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union.C @@ -0,0 +1,16 @@ +// Test that we don't have to deal with type punning +// DR 1188 says this is ill-formed +// { dg-do compile { target c++11 } } + +union U +{ + float f; + unsigned char ca[sizeof(float)]; +}; + +constexpr U u = { 1.0 }; +constexpr float f = u.f; +constexpr unsigned char c = u.ca[0]; // { dg-error "U::ca" } + +constexpr double d = 1.0; +constexpr unsigned char c2 = (unsigned char&)d; // { dg-error "char. glvalue" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union2.C new file mode 100644 index 0000000..1a5e832 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union2.C @@ -0,0 +1,18 @@ +// PR c++/51675 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union3.C new file mode 100644 index 0000000..ecae28d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union3.C @@ -0,0 +1,12 @@ +// PR c++/51675 +// { dg-do compile { target c++11 } } + +union foo +{ + int x; + short y; + + constexpr foo(): x(0) { } +}; + +constexpr foo f; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union4.C new file mode 100644 index 0000000..a8d6b8d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union4.C @@ -0,0 +1,18 @@ +// PR c++/54922 +// { dg-do compile { target c++11 } } + +struct nullable_int +{ + bool init_; + union { + unsigned char for_value_init; + int value_; + }; + + constexpr nullable_int() : init_(false), for_value_init() {} +}; + +#define SA(X) static_assert(X,#X) + +constexpr nullable_int n; +SA((n.for_value_init == 0)); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union5.C new file mode 100644 index 0000000..5779666 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-union5.C @@ -0,0 +1,42 @@ +// PR c++/54922 +// { dg-do compile { target c++11 } } +// { dg-options "-pedantic" } + +#define SA(X) static_assert(X,#X) + +struct A +{ + union { + union { + union { + unsigned char i; + int j; + }; + }; + }; + + constexpr A() : i(42) {} +}; + +constexpr A a; +SA((a.i == 42)); + +struct B +{ + struct { + int h; + struct { + union { + unsigned char i; + int j; + }; + int k; + }; // { dg-warning "anonymous struct" } + }; // { dg-warning "anonymous struct" } + int l; + + constexpr B(): h(1), i(2), k(3), l(4) {} +}; + +constexpr B b; +SA((b.h == 1 && b.i == 2 && b.k == 3 && b.l == 4)); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-using.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-using.C new file mode 100644 index 0000000..e8e7de3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-using.C @@ -0,0 +1,27 @@ +// Core issue 898 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-using2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-using2.C new file mode 100644 index 0000000..59a65e5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-using2.C @@ -0,0 +1,18 @@ +// PR c++/49520 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-value.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-value.C new file mode 100644 index 0000000..8731187 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-value.C @@ -0,0 +1,10 @@ +// { dg-do compile { target c++11 } } + +struct HopefullyLiteral { + HopefullyLiteral() = default; // Should be a constexpr c'tor as of 12.1/6 and 8.4.2/4 +}; + +constexpr HopefullyLiteral var1{}; // OK +constexpr HopefullyLiteral var2 = HopefullyLiteral{}; // #1 +constexpr HopefullyLiteral var3 = HopefullyLiteral(); // #2 +constexpr HopefullyLiteral var4 = HopefullyLiteral(var3); // #3 diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-value2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-value2.C new file mode 100644 index 0000000..00797fa --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-value2.C @@ -0,0 +1,19 @@ +// { dg-do compile { target c++11 } } + +template<class T> +constexpr T value_init() { return T(); } + +template<class T> +constexpr inline T bar(T x) { return x; } + +union EmptyUnion {}; +union Union1 { int i; }; +union Union3 { double d; int i; char* c; }; + +constexpr auto u1 = value_init<EmptyUnion>(); +constexpr auto u2 = value_init<Union1>(); +constexpr auto u3 = value_init<Union3>(); +constexpr auto u4 = bar(EmptyUnion{}); +constexpr auto u5 = bar(Union1{}); +constexpr auto u6 = bar(Union3{}); +constexpr auto u7 = bar(u1); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-value3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-value3.C new file mode 100644 index 0000000..8fd9c74 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-value3.C @@ -0,0 +1,10 @@ +// PR c++/50234 +// { dg-do compile { target c++11 } } + +#define SA(X) static_assert((X),#X) + +struct A { int i; }; + +constexpr int f(A a) { return a.i; } + +SA(f({}) == 0); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-value4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-value4.C new file mode 100644 index 0000000..1fc3738 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-value4.C @@ -0,0 +1,16 @@ +// PR c++/57901 +// { dg-require-effective-target c++11 } + +struct Z { + Z() = default; + Z(Z const&) = default; + constexpr Z(Z&&) {} /* non-trivial (constexpr) move ctor */ +}; + +template<typename T> +constexpr int fn0(T v) { return 0; } +template<typename T> +constexpr int fn (T v) { return fn0(v); } + +constexpr auto t0 = fn0(Z()); // OK! +constexpr auto t = fn (Z()); // error! (GCC 4.8.1) diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-variadic.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-variadic.C new file mode 100644 index 0000000..495c6e2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-variadic.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } +template<class... T> +constexpr bool variadics(T&&...) { return true; } + +struct IsLiteral {}; + +constexpr bool variadic_var = variadics(0, true, 1.2, IsLiteral{}); // Error, so below + +int main() {} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual.C new file mode 100644 index 0000000..2c13e3e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual.C @@ -0,0 +1,14 @@ +// PR c++/47067 +// { dg-do compile { target c++11 } } + +struct X { + virtual void x(); + virtual ~X(); +}; + +struct Y { + virtual void y(); + virtual ~Y(); +}; + +struct Z: X, Y {} z; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual2.C new file mode 100644 index 0000000..86040a3 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual3.C new file mode 100644 index 0000000..de446bc --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual4.C new file mode 100644 index 0000000..b938d65 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual4.C @@ -0,0 +1,18 @@ +// PR c++/56291 +// { dg-do compile { target 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-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-wstring1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-wstring1.C new file mode 100644 index 0000000..dc1b708 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-wstring1.C @@ -0,0 +1,33 @@ +// PR c++/48570 +// { dg-do run { target c++11 } } + +extern "C" void abort (); +constexpr wchar_t foo (int i) { return L"0123"[i]; } +constexpr char16_t bar (int i) { return u"0123"[i]; } +constexpr char32_t baz (int i) { return U"0123"[i]; } +const wchar_t foo0 = foo (0); +const wchar_t foo1 = foo (1); +const wchar_t foo2 = foo (2); +const wchar_t foo3 = foo (3); +const wchar_t foo4 = foo (4); +const char16_t bar0 = bar (0); +const char16_t bar1 = bar (1); +const char16_t bar2 = bar (2); +const char16_t bar3 = bar (3); +const char16_t bar4 = bar (4); +const char32_t baz0 = baz (0); +const char32_t baz1 = baz (1); +const char32_t baz2 = baz (2); +const char32_t baz3 = baz (3); +const char32_t baz4 = baz (4); + +int +main () +{ + if (foo0 != L'0' || foo1 != L'1' || foo2 != L'2' || foo3 != L'3' || foo4 != L'\0') + abort (); + if (bar0 != u'0' || bar1 != u'1' || bar2 != u'2' || bar3 != u'3' || bar4 != u'\0') + abort (); + if (baz0 != U'0' || baz1 != U'1' || baz2 != U'2' || baz3 != U'3' || baz4 != U'\0') + abort (); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-wstring2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-wstring2.C new file mode 100644 index 0000000..db79a9c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-wstring2.C @@ -0,0 +1,6 @@ +// PR c++/48570 +// { dg-do compile { target c++11 } } + +constexpr wchar_t c1 = L"hi"[3]; // { dg-error "out of bound" } +constexpr char16_t c2 = u"hi"[3]; // { dg-error "out of bound" } +constexpr char32_t c3 = U"hi"[3]; // { dg-error "out of bound" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc1.C new file mode 100644 index 0000000..e7ccb64 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc1.C @@ -0,0 +1,42 @@ +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/dc2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc2.C new file mode 100644 index 0000000..665f79d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc2.C @@ -0,0 +1,22 @@ +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/dc3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc3.C new file mode 100644 index 0000000..9c6fd56 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc3.C @@ -0,0 +1,62 @@ +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/dc4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc4.C new file mode 100644 index 0000000..634b549 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/dc5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc5.C new file mode 100644 index 0000000..5732162 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc5.C @@ -0,0 +1,27 @@ +// { dg-do run { target c++11 } } + +#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-4.9/gcc/testsuite/g++.dg/cpp0x/dc6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc6.C new file mode 100644 index 0000000..b16c0b4 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/dc7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc7.C new file mode 100644 index 0000000..e48741e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc7.C @@ -0,0 +1,7 @@ +// PR c++/58255 +// { dg-do compile { target c++11 } } + +struct A { + explicit A() { } + A(int x) : A() { } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc8.C new file mode 100644 index 0000000..e483f3e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dc8.C @@ -0,0 +1,66 @@ +// PR c++/51424 +// { dg-do compile { target c++11 } } + +template <class T > +struct S +{ + S() : S() {} // { dg-error "delegates to itself" } + S(int x) : S(x) {} // { dg-error "delegates to itself" } +}; + +struct B1 +{ + B1() : B1() {} // { dg-error "delegates to itself" } + B1(int y) : B1(y) {} // { dg-error "delegates to itself" } +}; + +struct V1 : virtual B1 +{ + V1() : B1() {} + V1(int x) : B1(x) {} +}; + +struct B2 +{ + B2() : B2() {} // { dg-error "delegates to itself" } + B2(int y) : B2(y) {} // { dg-error "delegates to itself" } +}; + +struct V2 : virtual B2 +{ + V2() : V2() {} // { dg-error "delegates to itself" } + V2(int x) : V2(x) {} // { dg-error "delegates to itself" } +}; + +struct B3 +{ + B3() {} + B3(int y) {} +}; + +struct V3 : virtual B3 +{ + V3() : V3() {} // { dg-error "delegates to itself" } + V3(int x) : V3(x) {} // { dg-error "delegates to itself" } +}; + +struct CE1 +{ + constexpr CE1() : CE1() {} // { dg-error "delegates to itself" } + constexpr CE1(int x) : CE1(x) {} // { dg-error "delegates to itself" } +}; + +struct CEB2 +{ + constexpr CEB2() : CEB2() {} // { dg-error "delegates to itself" } + constexpr CEB2(int x) : CEB2(x) {} // { dg-error "delegates to itself" } +}; + +struct CE2 : CEB2 +{ + constexpr CE2() : CEB2() {} + constexpr CE2(int x) : CEB2(x) {} +}; + +S<int> s1; +S<int> s2(1); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-1212.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-1212.C new file mode 100644 index 0000000..f9c879e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-1212.C @@ -0,0 +1,11 @@ +// Core 1212 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-33837.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-33837.C new file mode 100644 index 0000000..fbbc6a1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-33837.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } +// PR c++/33837 +void foo() +{ + __decltype (A::foo()); // { dg-error "was not declared|expected" } + __decltype (B); // { dg-error "was not declared" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-33838.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-33838.C new file mode 100644 index 0000000..effe08d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-33838.C @@ -0,0 +1,6 @@ +// { dg-do compile { target c++11 } } +// PR c++/33838 +template<typename T> struct A +{ + __decltype (T* foo()); // { dg-error "expected|no arguments|accept" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-38655.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-38655.C new file mode 100644 index 0000000..3b8455b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-38655.C @@ -0,0 +1,4 @@ +// PR c++/38655 +// { dg-options "" } + +__decltype(0r)* p = 1; // { dg-error "not supported|invalid" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-54581.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-54581.C new file mode 100644 index 0000000..4b81b5a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-54581.C @@ -0,0 +1,28 @@ +/* { dg-do compile { target c++11 } } */ +/* { dg-options "-Wall" } */ + +typedef float v4f __attribute__((vector_size(4*sizeof(float)))); + +template <class T> void eat (T&&) {} + +void test1 () +{ + v4f x = {0,1,2,3}; + typedef decltype (x < x) v4i; + v4i y = {4,5,6,7}; // v4i is not opaque + eat (y); +} + +template<class V> +void test2 () +{ + V x = {0,1,2,3}; + typedef decltype (x < x) v4i; + v4i y = {4,5,6,7}; // v4i is not opaque + eat (y); +} + +int main(){ + test1(); + test2<v4f>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-call1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-call1.C new file mode 100644 index 0000000..2616bb0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-call1.C @@ -0,0 +1,32 @@ +// PR c++/52748 +// N3276 +// { dg-do compile { target c++11 } } + +struct A; // { dg-error "forward declaration" } +A f(); + +decltype(f()) g1(); // OK +decltype(((f()))) g2b(); // OK +decltype(42,f()) g3(); // OK +decltype(42,45,f()) g3b(); // OK +decltype(42,45,(f())) g3c(); // OK +decltype(42,((45,(f())))) g3c(); // OK + +decltype(f(),42) g4(); // { dg-error "" } +decltype(45,f(),42) g4b(); // { dg-error "" } + +class B +{ + ~B(); // { dg-error "private" } +public: + int i; + void operator[](int); +}; +B h(); + +void i(const B&); + +decltype(h()) g5a(); // OK +decltype(h().i) g5(); // { dg-error "" } +decltype(h()[0]) g6(); // { dg-error "" } +decltype(i(h())) g7(); // { dg-error "" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-call2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-call2.C new file mode 100644 index 0000000..ad23220 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-call2.C @@ -0,0 +1,7 @@ +// PR c++/52748 +// We don't want to instantiate A<T> here. +// { dg-require-effective-target c++11 } + +template <class T> struct A: T { }; +template <class T> A<T> f(T); +decltype(f(42)) *p; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-call3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-call3.C new file mode 100644 index 0000000..27797a2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-call3.C @@ -0,0 +1,132 @@ +// Testcase for N3276 and operator overloading +// { dg-require-effective-target c++11 } + +struct A; +struct B { + A operator()(int); + A operator[](int); + A operator=(int); + A operator+=(int); + A operator-=(int); + A operator*=(int); + A operator/=(int); + A operator^=(int); + A operator&=(int); + A operator|=(int); + A operator<<=(int); + A operator>>=(int); +}; + +A operator-(B); +A operator+(B); +A operator*(B); +A operator&(B); +A operator!(B); +A operator~(B); +A operator++(B); +A operator--(B); + +A operator+(B,B); +A operator-(B,B); +A operator*(B,B); +A operator/(B,B); +A operator%(B,B); +A operator^(B,B); +A operator&(B,B); +A operator|(B,B); +A operator<(B,B); +A operator>(B,B); +A operator,(B,B); +A operator<<(B,B); +A operator>>(B,B); +A operator==(B,B); +A operator->*(B,B); + +#define TRY(E) static_cast<decltype(E)*>(0) + +template <class B> +void f() +{ + B b; + TRY(b(0)); + TRY(b[0]); + TRY(b=0); + TRY(b+=0); + TRY(b-=0); + TRY(b*=0); + TRY(b/=0); + TRY(b^=0); + TRY(b&=0); + TRY(b|=0); + TRY(b<<=0); + TRY(b>>=0); + + TRY(-b); + TRY(+b); + TRY(*b); + TRY(&b); + TRY(!b); + TRY(~b); + TRY(++b); + TRY(--b); + + TRY(b+b); + TRY(b-b); + TRY(b*b); + TRY(b/b); + TRY(b%b); + TRY(b^b); + TRY(b&b); + TRY(b|b); + TRY(b>b); + TRY(b<b); + TRY((b,b)); + TRY(b<<b); + TRY(b>>b); + TRY(b==b); + TRY(b->*b); +} + +int main() +{ + B b; + TRY(b(0)); + TRY(b[0]); + TRY(b=0); + TRY(b+=0); + TRY(b-=0); + TRY(b*=0); + TRY(b/=0); + TRY(b^=0); + TRY(b&=0); + TRY(b|=0); + TRY(b<<=0); + TRY(b>>=0); + + TRY(-b); + TRY(+b); + TRY(*b); + TRY(&b); + TRY(!b); + TRY(~b); + TRY(++b); + TRY(--b); + + TRY(b+b); + TRY(b-b); + TRY(b*b); + TRY(b/b); + TRY(b%b); + TRY(b^b); + TRY(b&b); + TRY(b|b); + TRY(b>b); + TRY(b<b); + TRY((b,b)); + TRY(b<<b); + TRY(b>>b); + TRY(b==b); + TRY(b->*b); + + f<B>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-incomplete1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-incomplete1.C new file mode 100644 index 0000000..f46d0ba --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-incomplete1.C @@ -0,0 +1,9 @@ +// PR c++/59270 +// { dg-do compile { target c++11 } } + +struct A +{ + struct B b; // { dg-error "incomplete type" } +}; + +decltype(A()) a; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-refbug.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-refbug.C new file mode 100644 index 0000000..cecff3c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype-refbug.C @@ -0,0 +1,17 @@ +// { dg-do compile { target c++11 } } +// PR c++/33045 +int && f (); + +template<typename T, typename U> +struct is_same +{ + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> +{ + static const bool value = true; +}; + +static_assert(is_same<decltype(f()), int&&>::value, "decltype of rvalue reference"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype1.C new file mode 100644 index 0000000..84c7a03 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype1.C @@ -0,0 +1,27 @@ +// { dg-do compile { target c++11 } } + +template<typename T, typename U> +struct is_same +{ + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> +{ + static const bool value = true; +}; + +const int& foo(); +int i; +struct A { double x; }; +const A* a = new A(); + +static_assert(is_same<decltype(foo()), const int&>::value, + "type should be const int&"); +static_assert(is_same<decltype(i), int>::value, + "type should be int"); +static_assert(is_same<decltype(a->x), double>::value, + "type should be double"); +static_assert(is_same<decltype((a->x)), const double&>::value, + "type should be const double&"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype10.C new file mode 100644 index 0000000..846d0bf --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype10.C @@ -0,0 +1,9 @@ +// PR c++/34271 +// { dg-do compile { target c++11 } } + +template<int> struct A +{ + static int i; +}; + +template<int N> int A<N>::i(decltype (A::i; // { dg-error "expected primary-expression before" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype11.C new file mode 100644 index 0000000..9fa8e23 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype11.C @@ -0,0 +1,12 @@ +// PR c++/35316 +// { dg-do compile { target c++11 } } + +template<int> struct A +{ + int i : 2; + + void foo() + { + decltype(i) j; + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype12.C new file mode 100644 index 0000000..eae318d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype12.C @@ -0,0 +1,37 @@ +// { dg-do compile { target c++11 } } +template<typename T, typename U> +struct is_same +{ + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> +{ + static const bool value = true; +}; + +int&& f(const int&) {} +int&& (*fp)(const int&) = f; +int&& (&fr)(const int&) = f; + +struct X { int&& f(const int&); }; + +int&& (X::*mfp)(const int&) = &X::f; + +void g(X& xr, X* xp) +{ + int i; + static_assert(is_same<decltype(f(i)), int&&>::value, "direct call"); + static_assert(is_same<decltype(fp(i)), int&&>::value, "pointer"); + static_assert(is_same<decltype((*fp)(i)), int&&>::value, + "dereferenced pointer"); + static_assert(is_same<decltype(fr(i)), int&&>::value, + "reference"); + static_assert(is_same<decltype(xr.f(i)), int&&>::value, + "member function call"); + static_assert(is_same<decltype((xr.*mfp)(i)), int&&>::value, + "member function pointer with .*"); + static_assert(is_same<decltype((xp->*mfp)(i)), int&&>::value, + "member function pointer with ->*"); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype13.C new file mode 100644 index 0000000..8e6c6d2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype13.C @@ -0,0 +1,38 @@ +// PR c++/34269 +// { dg-do compile } + +void +f1 () +{ + __decltype; // { dg-error "expected" } +} + +void +f2 () +{ + __decltype (; // { dg-error "expected" } +} + +void +f3 () +{ + __decltype (); // { dg-error "expected" } +} + +void +f4 () +{ + __typeof__; // { dg-error "expected" } +} + +void +f5 () +{ + __typeof__ (; // { dg-error "expected" } +} + +void +f6 () +{ + __typeof__ (); // { dg-error "expected" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype14.C new file mode 100644 index 0000000..9484173 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype14.C @@ -0,0 +1,17 @@ +// PR c++/37540 + +struct A +{ + int g() {return 0;} +}; + +template <typename T_> +void f(A a) +{ + __decltype(a.g()) i; +} + +int main() +{ + f<int>(A()); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype15.C new file mode 100644 index 0000000..f19819c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype15.C @@ -0,0 +1,12 @@ +// PR c++/38640 +// { dg-do compile { target c++11 } } + +template<int N> void foo (decltype (N)); +template<long int N> void foo (decltype (N)); + +void +bar (void) +{ + foo<5> (6); + foo<5L> (6L); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype16.C new file mode 100644 index 0000000..5cf8439 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype16.C @@ -0,0 +1,10 @@ +// PR c++/39070 +// { dg-do compile { target c++11 } } + +template<typename X> struct junk { + template<typename Z> static Z y(); + template<typename Y> static int test(...); + template<typename Y> static char test(decltype(y<Y>())*); + static int const value=sizeof(test<X>(0)); +}; +typedef char type[junk<int>::value==sizeof(char) ? 1 : -1]; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype17.C new file mode 100644 index 0000000..6e5854d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype17.C @@ -0,0 +1,28 @@ +// PR c++/36628 +// { dg-do run { target c++11 } } + +#include <typeinfo> +#include <string.h> + +int rvalue(); +int& lvalueref(); +int&& rvalueref(); + +decltype(true ? rvalue() : rvalue()) f() +{} + +decltype(true ? lvalueref() : lvalueref()) g() +{} + +decltype(true ? rvalueref() : rvalueref()) h() +{} + +int main() +{ + if (strcmp (typeid(f).name(), "FivE") != 0) + return 1; + if (strcmp (typeid(g).name(), "FRivE") != 0) + return 2; + if (strcmp (typeid(h).name(), "FOivE") != 0) + return 3; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype18.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype18.C new file mode 100644 index 0000000..4c1571a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype18.C @@ -0,0 +1,5 @@ +// PR c++/37875 +// { dg-do compile { target c++11 } } + +template <typename> struct X {}; +X<decltype(1 > 2)> x; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype19.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype19.C new file mode 100644 index 0000000..41d602f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype19.C @@ -0,0 +1,24 @@ +// PR c++/42013 + +template<typename _Tp> + _Tp +__attribute ((const)) declval(); + +template<typename _Tp, typename _Up> + struct common_type + { + typedef __decltype(true ? declval<_Tp>() : declval<_Up>()) typet; + typedef __decltype(false ? declval<_Tp>() : declval<_Up>()) typef; + }; + +template<typename, typename> struct is_same; + +template<typename _Tp> struct is_same<_Tp, _Tp> { typedef _Tp type; }; + +void f() +{ + typedef common_type<int, const int>::typet typet; + typedef common_type<int, const int>::typef typef; + + typedef is_same<typet, typef>::type type; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype2.C new file mode 100644 index 0000000..f316f50 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype2.C @@ -0,0 +1,58 @@ +// { dg-do compile { target c++11 } } + +template<typename T, typename U> +struct is_same +{ + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> +{ + static const bool value = true; +}; + +#define CHECK_DECLTYPE(DECLTYPE,RESULT) \ + static_assert(is_same< DECLTYPE , RESULT >::value, #RESULT) + +struct A {}; + +int a; +int& b = a; +const int& c = a; +const int d = 5; +const A e = A(); +CHECK_DECLTYPE(decltype(a), int); +CHECK_DECLTYPE(decltype(b), int&); +CHECK_DECLTYPE(decltype(c), const int&); +CHECK_DECLTYPE(decltype(d), const int); +CHECK_DECLTYPE(decltype(e), const A); + +CHECK_DECLTYPE(decltype(a), int); +CHECK_DECLTYPE(decltype((a)), int&); + +void foo_check(int a, int& b, float& c, int* d) +{ + CHECK_DECLTYPE(decltype(a), int); + CHECK_DECLTYPE(decltype(b), int&); + CHECK_DECLTYPE(decltype(c), float&); + CHECK_DECLTYPE(decltype(d), int*); +} + +int foo(char); +int bar(char); +int bar(int); +CHECK_DECLTYPE(decltype(foo), int(char)); + +decltype(bar) z; // { dg-error "overload" "overload" } +// { dg-error "invalid type" "invalid" { target *-*-* } 47 } + +CHECK_DECLTYPE(decltype(&foo), int(*)(char)); +CHECK_DECLTYPE(decltype(*&foo), int(&)(char)); + +void array_types() +{ + int a[10]; + CHECK_DECLTYPE(decltype(a), int[10]); +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype20.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype20.C new file mode 100644 index 0000000..5fb3540 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype20.C @@ -0,0 +1,10 @@ +// PR c++/42277 +// { dg-do compile { target c++11 } } + +struct S { int s; }; +template <int N> +void foo () +{ + S s; + decltype (s.s) i; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype21.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype21.C new file mode 100644 index 0000000..e4dc201 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype21.C @@ -0,0 +1,34 @@ +// PR c++/6709 (DR 743) +// PR c++/42603 (DR 950) +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/decltype22.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype22.C new file mode 100644 index 0000000..b3ff8b8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype22.C @@ -0,0 +1,13 @@ +// PR c++/42761 +// { dg-do compile { target c++11 } } + +template<typename _Tp> _Tp* fn(); + +template <class T> struct A +{ + template <class U, + class S = decltype(fn<T>())> + struct B { }; +}; + +A<int> a; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype23.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype23.C new file mode 100644 index 0000000..731eed7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype23.C @@ -0,0 +1,5 @@ +// { dg-do compile { target c++11 } } + +int x, &&y = static_cast<int &&>(x); +typedef decltype((y)) myInt; // `y' is a parenthesized id-expression of type int that is an lvalue +typedef int &myInt; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype24.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype24.C new file mode 100644 index 0000000..0ff9963 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype24.C @@ -0,0 +1,7 @@ +// PR c++/47068 +// { dg-do compile { target c++11 } } + +template <class T> struct broken { + int member; + typedef decltype(~ member) gcc_crashes_here; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype25.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype25.C new file mode 100644 index 0000000..e57376f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype25.C @@ -0,0 +1,20 @@ +// PR c++/47851 +// { dg-do compile { target c++11 } } + +struct Type { + void display_type(); + void display_type() const { } +}; + +typedef Type const ConstType; + +struct ConvertibleToType { + operator Type&() { return *reinterpret_cast<Type*>(this); } +}; + +int main () +{ + // Both lines should call the const variant. + (true ? ConvertibleToType() : ConstType()).display_type(); + decltype((true ? ConvertibleToType() : ConstType()))().display_type(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype26.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype26.C new file mode 100644 index 0000000..0d320da --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype26.C @@ -0,0 +1,16 @@ +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/decltype27.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype27.C new file mode 100644 index 0000000..3174a89 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype27.C @@ -0,0 +1,9 @@ +// PR c++/48617 +// { dg-do compile { target c++11 } } + +template<class T, decltype(T())> // # +struct A {}; + +A<int, 0> a; + +int main() {} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype28.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype28.C new file mode 100644 index 0000000..c1c5a1b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype28.C @@ -0,0 +1,16 @@ +// PR c++/44175 +// { dg-do compile { target c++11 } } + +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)) // { dg-error "depth" } +ft (F f, typename enable_if<N==0, int>::type) {} + +int main() { + ft<struct a*, 2> (0, 0); // { dg-message "from here" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype29.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype29.C new file mode 100644 index 0000000..d87299c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype29.C @@ -0,0 +1,19 @@ +// PR c++/44175 +// { dg-do compile { target c++11 } } + +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())) // { dg-error "depth" } +ft() {} + +int main() { + ft<struct a*, 0>(); // { dg-error "no match|wrong number" } +} + +// { dg-prune-output "note" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype3.C new file mode 100644 index 0000000..aaff5df --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype3.C @@ -0,0 +1,71 @@ +// { dg-do compile { target c++11 } } + +template<typename T, typename U> +struct is_same +{ + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> +{ + static const bool value = true; +}; + +#define CHECK_DECLTYPE(DECLTYPE,RESULT) \ + static_assert(is_same< DECLTYPE , RESULT >::value, #DECLTYPE " should be " #RESULT) + +class A { +public: + int a; + int& b; + static int c; + + A(int& b) : b(b) { } + + void foo() { + CHECK_DECLTYPE(decltype(a), int); + CHECK_DECLTYPE(decltype(this->a), int); + CHECK_DECLTYPE(decltype((*this).a), int); + CHECK_DECLTYPE(decltype(b), int&); + CHECK_DECLTYPE(decltype(c), int); + } + void bar() const { + CHECK_DECLTYPE(decltype(a), int); + CHECK_DECLTYPE(decltype(b), int&); + CHECK_DECLTYPE(decltype(c), int); + } +}; + +int b; +A aa(b); +const A& caa = aa; +CHECK_DECLTYPE(decltype(aa.a), int); +CHECK_DECLTYPE(decltype(aa.b), int&); +CHECK_DECLTYPE(decltype(caa.a), int); + +class B { +public: + int a; + enum B_enum { b }; + decltype(a) c; + decltype(a) foo() { } + decltype(b) enums_are_in_scope() { return b; } // ok +}; + +CHECK_DECLTYPE(decltype(aa.*&A::a), int&); +decltype(aa.*&A::b) zz; // { dg-error "cannot create pointer to reference member" "cannot" } +// { dg-error "invalid type" "invalid type" { target *-*-* } 57 } +CHECK_DECLTYPE(decltype(caa.*&A::a), const int&); + +class X { + void foo() { + CHECK_DECLTYPE(decltype(this), X*); + CHECK_DECLTYPE(decltype(*this), X&); + } + void bar() const { + CHECK_DECLTYPE(decltype(this), const X*); + CHECK_DECLTYPE(decltype(*this), const X&); + } +}; + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype30.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype30.C new file mode 100644 index 0000000..25eeb9d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype30.C @@ -0,0 +1,17 @@ +// PR c++/49369 +// { dg-do compile { target c++11 } } + +template <class,class> struct assert_same; +template <class T> struct assert_same<T,T> {}; + +struct B { + int member; +}; + +struct C: B { + void method() const; +}; + +void C::method() const { + assert_same<decltype((B::member)), const int&> a; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype31.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype31.C new file mode 100644 index 0000000..bffcf1c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype31.C @@ -0,0 +1,13 @@ +// PR c++/49921 +// { dg-do compile { target c++11 } } + +struct Local +{ + void f(); +}; + +Local *l; +void (Local::*ptr)(); +decltype((l->*ptr)) i; // { dg-error "member function" } + +// { dg-prune-output "invalid type in declaration" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype32.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype32.C new file mode 100644 index 0000000..02c6316 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype32.C @@ -0,0 +1,13 @@ +// PR c++/50075 +// { dg-do compile { target c++11 } } +// { dg-options "-ftemplate-depth=10" } + +template <typename T> +auto make_array(const T& il) -> +decltype(make_array(il)) // { dg-error "not declared|no matching|exceeds" } +{ } + +int main() +{ + int z = make_array(1); // { dg-error "no matching" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype33.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype33.C new file mode 100644 index 0000000..63d5a49 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype33.C @@ -0,0 +1,19 @@ +// PR c++/50084 +// { dg-do compile { target c++11 } } +// { dg-options "-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-4.9/gcc/testsuite/g++.dg/cpp0x/decltype34.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype34.C new file mode 100644 index 0000000..028e506 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype34.C @@ -0,0 +1,19 @@ +// PR c++/50870 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/decltype35.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype35.C new file mode 100644 index 0000000..daffaf0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype35.C @@ -0,0 +1,15 @@ +// PR c++/50870 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/decltype36.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype36.C new file mode 100644 index 0000000..c426f69 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype36.C @@ -0,0 +1,21 @@ +// PR c++/51265 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/decltype37.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype37.C new file mode 100644 index 0000000..c885e9a --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/decltype38.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype38.C new file mode 100644 index 0000000..97ebb33 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/decltype39.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype39.C new file mode 100644 index 0000000..4676d2d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype39.C @@ -0,0 +1,19 @@ +// PR c++/53788 +// { dg-do compile { target c++11 } } + +struct t { static const bool value = true; }; +struct f { static const bool value = false; }; + +template<typename T> +struct has_static { + template<typename X> + static t check(X*, decltype(T::fun())* = 0); // { dg-error "without object" } + static f check(...); + + typedef decltype(check((T*)(0))) ret; + static const bool value = ret::value; +}; + +struct test { int fun() { return 0; } }; + +bool b = has_static<test>::value; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype4.C new file mode 100644 index 0000000..c14e156 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype4.C @@ -0,0 +1,82 @@ +// { dg-do compile { target c++11 } } + +template<typename T, typename U> +struct is_same +{ + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> +{ + static const bool value = true; +}; + +#define CHECK_DECLTYPE(DECLTYPE,RESULT) \ + static_assert(is_same< DECLTYPE , RESULT >::value, #DECLTYPE " should be " #RESULT) + +struct A { + int x; + int& y; + int foo(char); + int& bar() const; +}; + +CHECK_DECLTYPE(decltype(&A::x), int A::*); +decltype(&A::y) Ay; // { dg-error "cannot create pointer to reference member|invalid type" } +CHECK_DECLTYPE(decltype(&A::foo), int (A::*) (char)); +CHECK_DECLTYPE(decltype(&A::bar), int& (A::*) () const); + +CHECK_DECLTYPE(decltype("decltype"), const char(&)[9]); +CHECK_DECLTYPE(decltype(1), int); + +int an_int = 5; +int& i = an_int; +const int j = an_int; + +CHECK_DECLTYPE(decltype(i)&, int&); +CHECK_DECLTYPE(const decltype(j), const int); + +int foo(); +CHECK_DECLTYPE(decltype(foo()), int); +float& bar(int); +CHECK_DECLTYPE(decltype (bar(1)), float&); +const A bar(); +CHECK_DECLTYPE(decltype (bar()), const A); +const A& bar2(); +CHECK_DECLTYPE(decltype (bar2()), const A&); + +void wibble() { + CHECK_DECLTYPE(decltype(1+2), int); + int* p; + CHECK_DECLTYPE(decltype(*p), int&); + int a[10]; + CHECK_DECLTYPE(decltype(a[3]), int&); + int i; int& j = i; + CHECK_DECLTYPE(decltype (i = 5), int&); + CHECK_DECLTYPE(decltype (j = 5), int&); + + CHECK_DECLTYPE(decltype (++i), int&); + CHECK_DECLTYPE(decltype (i++), int); +} + +struct B { + B () : bit(), cbit() {} + int bit : 2; + const int cbit : 3; + + void foo() + { + CHECK_DECLTYPE(decltype(bit), int); + CHECK_DECLTYPE(decltype((bit)), int&); + CHECK_DECLTYPE(decltype(cbit), const int); + CHECK_DECLTYPE(decltype((cbit)), const int&); + } +}; + +B b; +const B& bc = b; +CHECK_DECLTYPE(decltype(b.bit), int); +CHECK_DECLTYPE(decltype(bc.bit), int); +CHECK_DECLTYPE(decltype((b.bit)), int&); +CHECK_DECLTYPE(decltype((bc.bit)), const int&); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype40.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype40.C new file mode 100644 index 0000000..1b194ab --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype40.C @@ -0,0 +1,101 @@ +// PR c++/51222 +// { dg-do compile { target c++11 } } + +template<class T> +struct add_rref { + typedef T&& type; +}; + +template<> +struct add_rref<void> { + typedef void type; +}; + +template<class T> +typename add_rref<T>::type declval(); + +template<class T, class U, class = + decltype(::delete ::new T(declval<U>())) +> +auto f(int) -> char; + +template<class, class> +auto f(...) -> char(&)[2]; + +template<class T, class = + decltype(::delete ::new T()) +> +auto g(int) -> char; + +template<class> +auto g(...) -> char(&)[2]; + +template<class T, class U> +auto f2(int) -> decltype(::delete ::new T(declval<U>()), char()); + +template<class, class> +auto f2(...) -> char(&)[2]; + +template<class T> +auto g2(int) -> decltype(::delete ::new T(), char()); + +template<class> +auto g2(...) -> char(&)[2]; + +struct C { }; + +struct A { + virtual ~A() = 0; +}; + +struct D1 { + D1() = delete; +}; + +struct D2 { + ~D2() = delete; +}; + +static_assert(sizeof(g<void>(0)) == 2, "Ouch"); +static_assert(sizeof(g<void()>(0)) == 2, "Ouch"); +static_assert(sizeof(g<void() const>(0)) == 2, "Ouch"); +static_assert(sizeof(g<A>(0)) == 2, "Ouch"); +static_assert(sizeof(g<D1>(0)) == 2, "Ouch"); +static_assert(sizeof(g<D2>(0)) == 2, "Ouch"); +static_assert(sizeof(g<int&>(0)) == 2, "Ouch"); +static_assert(sizeof(g<int&&>(0)) == 2, "Ouch"); +static_assert(sizeof(g<void(&)()>(0)) == 2, "Ouch"); +static_assert(sizeof(g<void(&&)()>(0)) == 2, "Ouch"); +static_assert(sizeof(f<void, void>(0)) == 2, "Ouch"); +static_assert(sizeof(f<void(), void()>(0)) == 2, "Ouch"); +//static_assert(sizeof(f<void() const, void() const>(0)) == 2, "Ouch"); +static_assert(sizeof(f<int, void>(0)) == 2, "Ouch"); +static_assert(sizeof(f<void, int>(0)) == 2, "Ouch"); +static_assert(sizeof(f<C, void>(0)) == 2, "Ouch"); +static_assert(sizeof(f<C, int>(0)) == 2, "Ouch"); +static_assert(sizeof(f<int&, int&>(0)) == 2, "Ouch"); +static_assert(sizeof(f<int&&, int&&>(0)) == 2, "Ouch"); +static_assert(sizeof(f<void(&)(), void(&)()>(0)) == 2, "Ouch"); +static_assert(sizeof(f<void(&&)(), void(&&)()>(0)) == 2, "Ouch"); + +static_assert(sizeof(g2<void>(0)) == 2, "Ouch"); +static_assert(sizeof(g2<void()>(0)) == 2, "Ouch"); +static_assert(sizeof(g2<void() const>(0)) == 2, "Ouch"); +static_assert(sizeof(g2<A>(0)) == 2, "Ouch"); +static_assert(sizeof(g2<D1>(0)) == 2, "Ouch"); +static_assert(sizeof(g2<D2>(0)) == 2, "Ouch"); +static_assert(sizeof(g2<int&>(0)) == 2, "Ouch"); +static_assert(sizeof(g2<int&&>(0)) == 2, "Ouch"); +static_assert(sizeof(g2<void(&)()>(0)) == 2, "Ouch"); +static_assert(sizeof(g2<void(&&)()>(0)) == 2, "Ouch"); +static_assert(sizeof(f2<void, void>(0)) == 2, "Ouch"); +static_assert(sizeof(f2<void(), void()>(0)) == 2, "Ouch"); +//static_assert(sizeof(f2<void() const, void() const>(0)) == 2, "Ouch"); +static_assert(sizeof(f2<int, void>(0)) == 2, "Ouch"); +static_assert(sizeof(f2<void, int>(0)) == 2, "Ouch"); +static_assert(sizeof(f2<C, void>(0)) == 2, "Ouch"); +static_assert(sizeof(f2<C, int>(0)) == 2, "Ouch"); +static_assert(sizeof(f2<int&, int&>(0)) == 2, "Ouch"); +static_assert(sizeof(f2<int&&, int&&>(0)) == 2, "Ouch"); +static_assert(sizeof(f2<void(&)(), void(&)()>(0)) == 2, "Ouch"); +static_assert(sizeof(f2<void(&&)(), void(&&)()>(0)) == 2, "Ouch"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype41.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype41.C new file mode 100644 index 0000000..1439e15 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype41.C @@ -0,0 +1,43 @@ +// Core 1273 +// { dg-do compile { target c++11 } } + +template <class T> struct C; +template <class T> struct D; + +class A +{ + int i; + static int j; + friend struct C<int>; + friend struct D<int>; +} a; + +class B +{ + int i; + static int j; + friend struct C<float>; + friend struct D<float>; +} b; + +template <class T> +struct C +{ + template <class U> decltype (a.i) f() { } // #1 + template <class U> decltype (b.i) f() { } // #2 +}; + +template <class T> +struct D +{ + template <class U> decltype (A::j) f() { } // #1 + template <class U> decltype (B::j) f() { } // #2 +}; + +int main() +{ + C<int>().f<int>(); // calls #1 + C<float>().f<float>(); // calls #2 + D<int>().f<int>(); // calls #1 + D<float>().f<float>(); // calls #2 +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype42.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype42.C new file mode 100644 index 0000000..6c1aa43 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype42.C @@ -0,0 +1,31 @@ +// PR c++/50545 +// { dg-do compile { target c++11 } } + +template< class T > +T&& declval(); + +// #1 +template< class T > +auto f( int ) + -> decltype( int{ declval<T>() } ); + +// #2 +template< class > +void f( ... ); + + +#define STATIC_ASSERT( ... ) static_assert( __VA_ARGS__, #__VA_ARGS__ ) + +template< class T, class U > +struct is_same { + static constexpr bool value = false; +}; + +template< class T > +struct is_same<T, T> { + static constexpr bool value = true; +}; + + +STATIC_ASSERT( is_same< decltype( f<int>(0) ), int >::value ); // OK; f<int>(0) calls #1. +STATIC_ASSERT( is_same< decltype( f<int*>(0) ), void >::value ); // static assertion fails; f<int*>(0) should call #2, because int{ (int*)0 } is ill-formed, but calls #1. diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype43.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype43.C new file mode 100644 index 0000000..4df95a1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype43.C @@ -0,0 +1,27 @@ +// PR c++/53763 +// { dg-do compile { target c++11 } } + +template<typename TYPE> +struct A +{ + static int a(TYPE value) + { + return value; + } +}; + +template<typename... ARGS> +struct B +{ + static int b(ARGS...) + { + return 0; + } +}; + +int main() +{ + int x = B<decltype(A<int>::a(1))>::b(A<int>::a(1)); + int y = B<decltype(A ::a(2))>::b(A<int>::a(2)); // { dg-error "template argument" } + return x + y; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype44.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype44.C new file mode 100644 index 0000000..2b2e622 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype44.C @@ -0,0 +1,44 @@ +// PR c++/53307 +// { dg-do compile { target c++11 } } + +template <class...Ts> struct tuple{}; + +struct funct +{ + template <class T, class...argTs> + T operator()(T arg1, argTs...) + { + return arg1; + } +}; + +template <class...>class test; + +template < template <class...> class tp, + class...arg1Ts, + class...arg2Ts> +class test<tp<arg1Ts...>, tp<arg2Ts...>> +{ + public: + template <class func> + auto test_pass(func fun, arg2Ts...arg2s) + -> decltype(fun(arg2s...)) + { + return fun(arg2s...); + } + + template <class func, class...arg3Ts> + auto testbug(func fun, arg2Ts...arg2s, arg3Ts...arg3s) + -> decltype(fun(arg2s..., arg3s...)) + { + return fun(arg2s..., arg3s...); + } +}; + +int main() +{ + test<tuple<>, tuple<char, int>> t; + t.test_pass (funct(), 'a', 2); + t.testbug (funct(), 'a', 2, "fine"); + t.testbug (funct(), 'a', 2); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype45.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype45.C new file mode 100644 index 0000000..f768d85 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype45.C @@ -0,0 +1,40 @@ +// PR c++/51878 +// { dg-do compile { target c++11 } } + +template<class F, class... T> +auto indirect_call(F f, T... t) -> decltype(f(t...)) +{ + return f(t...); +} + +template<class F, class T> +struct VariadicBind +{ + F f; + T t; + + template<class... A> + auto operator()(A... a) -> decltype(indirect_call(f, t, a...)) + { + return indirect_call(f, t, a...); + } +}; + +template<class F> +void apply(F f) +{ + f(); +} + +template<class F, class V1, class... V> +void apply(F f, V1 v1, V... v) +{ + apply(VariadicBind<F, int>{f, v1}, v...); +} + +void func(int, int) { } + +int main() +{ + apply(func, 0, 0); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype46.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype46.C new file mode 100644 index 0000000..f18354d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype46.C @@ -0,0 +1,12 @@ +// PR c++/55558 +// { dg-do compile { target c++11 } } + +struct A +{ + static int member; +}; + +template<typename T> void foobar () +{ + typedef decltype (A::member) myType; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype47.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype47.C new file mode 100644 index 0000000..f6700a3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype47.C @@ -0,0 +1,12 @@ +// PR c++/55564 +// { dg-do compile { target c++11 } } + +template <typename T, decltype(sizeof(T)) N> +auto array_size(T(&)[N]) -> decltype(N) { return N; } + +int main() { + int simple[4] = {}; + int result = array_size(simple); + + return result; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype48.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype48.C new file mode 100644 index 0000000..39fc4eb --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype48.C @@ -0,0 +1,16 @@ +// PR c++/56059 +// { dg-do compile { target 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>() ...))> // { dg-error "no match" } +foo(); + +int main() +{ + foo<int, int>(); // { dg-error "no match" } + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype49.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype49.C new file mode 100644 index 0000000..c317498 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype49.C @@ -0,0 +1,10 @@ +// PR c++/45282 +// { dg-require-effective-target c++11 } + +struct A { int i; }; +int A::*ipm = &A::i; + +template <class T, class U> class assert_same_type; +template <class T> class assert_same_type<T,T> { }; + +assert_same_type<decltype(A().*ipm),int> x2; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype5.C new file mode 100644 index 0000000..3842e09 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype5.C @@ -0,0 +1,37 @@ +// { dg-do compile { target c++11 } } + +template<typename T, typename U> +struct is_same +{ + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> +{ + static const bool value = true; +}; + +#define CHECK_DECLTYPE(DECLTYPE,RESULT) \ + static_assert(is_same< DECLTYPE , RESULT >::value, #RESULT) + +template<typename F> F create_a(); + +template<typename F, typename T1> +decltype(create_a<F&>()(create_a<const T1&>())) forward(F f, const T1& a1) +{ + return f(a1); +} + +struct identity { + template<typename T> + const T& operator()(const T& x) { return x; } +}; + + +identity id; +int i; +float f; + +CHECK_DECLTYPE(decltype(forward(id, i)), const int&); +CHECK_DECLTYPE(decltype(forward(id, f)), const float&); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype50.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype50.C new file mode 100644 index 0000000..dc3332a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype50.C @@ -0,0 +1,18 @@ +// PR c++/52597 +// { dg-require-effective-target c++11 } + +struct A { + int zip(); + + decltype(zip) bar0; // { dg-error "invalid use of non-static member function" } + void bar1() { + typedef decltype(this->A::zip) x; // { dg-error "invalid use of non-static member function" } + } + void bar2() { + typedef decltype(A::zip) x; // { dg-error "invalid use of non-static member function" } + } +}; + +typedef decltype(A().zip) x; // { dg-error "invalid use of non-static member function" } + +// { dg-prune-output "invalid type in declaration" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype51.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype51.C new file mode 100644 index 0000000..9ab4146 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype51.C @@ -0,0 +1,10 @@ +// PR c++/53721 +// { dg-require-effective-target c++11 } + +struct A +{ + void f() {}; + auto g() -> decltype(this->f()) + { + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype52.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype52.C new file mode 100644 index 0000000..e6b5a4c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype52.C @@ -0,0 +1,18 @@ +// PR c++/56450 +// { dg-do compile { target c++11 } } + +template<typename T> +T&& declval(); + +template<typename, typename> +struct is_same +{ static constexpr bool value = false; }; + +template<typename T> +struct is_same<T, T> +{ static constexpr bool value = true; }; + +struct A { static const int dummy = 0; }; + +static_assert(is_same<decltype(declval<A>().dummy), const int>::value, ""); +static_assert(!is_same<decltype(declval<A>().dummy), const int&>::value, ""); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype53.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype53.C new file mode 100644 index 0000000..4580e97 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype53.C @@ -0,0 +1,11 @@ +// PR c++/57092 +// { dg-do compile { target c++11 } } + +template <void (*F)(int)> +class B { + decltype(F) v; +}; + +void foo(int) {} + +B<foo> o; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype54.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype54.C new file mode 100644 index 0000000..9d301c0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype54.C @@ -0,0 +1,26 @@ +// PR c++/51908 +// { dg-do compile { target c++11 } } + +struct foo1 +{ + template <typename Ret, typename... Args> + operator decltype(static_cast<Ret (*)(Args...)>(nullptr)) () const; +}; + +struct foo2 +{ + template <typename Ret, typename... Args> + operator decltype(static_cast<Ret (*)(Args... args)>(nullptr)) () const; +}; + +struct foo3 +{ + template <typename Ret, typename Arg> + operator decltype(static_cast<Ret (*)(Arg)>(nullptr)) () const; +}; + +struct foo4 +{ + template <typename Ret, typename Arg> + operator decltype(static_cast<Ret (*)(Arg arg)>(nullptr)) () const; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype55.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype55.C new file mode 100644 index 0000000..95427fc --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype55.C @@ -0,0 +1,20 @@ +// PR c++/53211 +// { dg-do compile { target c++11 } } + +template<typename A, typename B> + struct is_same { static const bool value = false; }; + +template<typename A> + struct is_same<A, A> { static const bool value = true; }; + +template<typename... Args> +void func(Args... args) +{ + int arr[] = { args... }; + static_assert (is_same<decltype(arr), int[sizeof...(Args)]>::value, ""); +} + +int main() +{ + func(1, 2, 3, 4); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype56.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype56.C new file mode 100644 index 0000000..b44fad0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype56.C @@ -0,0 +1,11 @@ +// PR c++/52816 +// { dg-do compile { target c++11 } } + +class c { + int f; + public: + template <typename A> + decltype(f) m(A) const; +}; + +decltype(c{}.m(0)) i; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype57.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype57.C new file mode 100644 index 0000000..353cc72 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype57.C @@ -0,0 +1,8 @@ +// PR c++/58633 +// { dg-do compile { target c++11 } } + +void foo(int i) +{ + typedef int I; + decltype(i.I::~I())* p; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype6.C new file mode 100644 index 0000000..10086c5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype6.C @@ -0,0 +1,35 @@ +// { dg-do compile { target c++11 } } + +template<typename T, typename U> +struct is_same +{ + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> +{ + static const bool value = true; +}; + +template<typename T> const T& foo(); + + +int i; + +template<typename T> +struct A +{ + double x; +}; + +const A<double>* a = new A<double>(); + +static_assert(is_same<decltype(foo<int>()), const int&>::value, + "type should be const int&"); +static_assert(is_same<decltype(i), int>::value, + "type should be int"); +static_assert(is_same<decltype(a->x), double>::value, + "type should be double"); +static_assert(is_same<decltype((a->x)), const double&>::value, + "type should be const double&"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype7.C new file mode 100644 index 0000000..f757c9e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype7.C @@ -0,0 +1,14 @@ +// PR c++/34268 +// { dg-do compile } + +struct A +{ + __decltype (A); // { dg-error "must be an expression" } + __decltype (~A); // { dg-error "must be an expression" } +}; + +struct B +{ + __typeof__ (B); + __typeof__ (~B); // { dg-error "expected primary-expression" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype8.C new file mode 100644 index 0000000..3680689 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype8.C @@ -0,0 +1,12 @@ +// PR c++/34267 +// { dg-do compile } + +struct A {}; +__decltype (A); // { dg-error "must be an expression" } +template<int> struct B +{ + __decltype (A); // { dg-error "must be an expression" } + __decltype (~A); // { dg-error "must be an expression" } + __decltype (B); // { dg-error "must be an expression" } + __decltype (~B); // { dg-error "must be an expression" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype9.C new file mode 100644 index 0000000..9db3db0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/decltype9.C @@ -0,0 +1,9 @@ +// PR c++/34271 +// { dg-do compile { target c++11 } } + +template<int> struct A +{ + static int i; +}; + +template<int N> int A<N>::i(decltype (A::i)); // { dg-error "member function|must be an expression" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deduce.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deduce.C new file mode 100644 index 0000000..380ca28 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deduce.C @@ -0,0 +1,36 @@ +// { dg-do compile { target c++11 } } +template<typename T, typename U> struct same_type; +template<typename T> struct same_type<T, T> {}; + +int lval_int; +int rval_int(); +int const lval_const_int=0; +int const&& rval_const_int(); + +template <typename T> void deduce_lval_int(T && t) +{ + same_type<T, int &>(); +} + +template <typename T> void deduce_rval_int(T && t) +{ + same_type<T, int>(); +} + +template <typename T> void deduce_lval_const_int(T && t) +{ + same_type<T, const int &>(); +} + +template <typename T> void deduce_rval_const_int(T && t) +{ + same_type<T, const int>(); +} + +void f() +{ + deduce_lval_int(lval_int); + deduce_rval_int(rval_int()); + deduce_lval_const_int(lval_const_int); + deduce_rval_const_int(rval_const_int()); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted1.C new file mode 100644 index 0000000..4956e88 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted1.C @@ -0,0 +1,42 @@ +// Positive test for defaulted/deleted fns +// { dg-do run { target c++11 } } + +struct A +{ + int i; + A() = default; + A(const A&) = delete; + A& operator=(const A&) = default; + ~A(); +}; + +A::~A() = default; + +void f() = delete; + +struct B +{ + int i; + B() = default; +}; + +int main() +{ + A a1, a2; + B b = {1}; + a1 = a2; +} + +// fns defaulted in class defn are trivial +struct C +{ + C() = default; + C(const C&) = default; + C& operator=(const C&) = default; + ~C() = default; +}; + +union U +{ + C c; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted10.C new file mode 100644 index 0000000..8537268 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted10.C @@ -0,0 +1,14 @@ +// PR c++/40381 +// { dg-do compile { target c++11 } } + +struct A +{ + template<typename T> void foo(T) = delete; // { dg-error "previously|declared" } +}; + +template<typename T> void A::foo(T) {} // { dg-error "redefinition" } + +void bar() +{ + A().foo(0); // { dg-error "use" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted11.C new file mode 100644 index 0000000..cd4e293 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted11.C @@ -0,0 +1,15 @@ +// Core issue 901 +// { dg-do compile { target c++11 } } + +struct A +{ + A(); ~A(); + void operator delete (void *) = delete; + void operator delete[] (void *) = delete; +}; + +int main() +{ + A* ap = new A; + ap = new A[2]; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted13.C new file mode 100644 index 0000000..68dc5d0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted13.C @@ -0,0 +1,29 @@ +// { dg-do compile { target c++11 } } + +template<typename T> +struct NonCopyable { + NonCopyable() = default; + NonCopyable(NonCopyable const&); +}; + +template<> +NonCopyable<int>::NonCopyable(NonCopyable<int> const&) = delete; // { dg-message "declared" } + +template<typename T> +NonCopyable<T>::NonCopyable(NonCopyable<T> const&) = default; + +template<> +NonCopyable<double>::NonCopyable(NonCopyable<double> const&) = delete; // { dg-message "declared" } + + +int main() +{ + NonCopyable<double> nc_dbl; + NonCopyable<double> nc_dbl_cpy(nc_dbl); // { dg-error "use" } + + NonCopyable<int> nc_int; + NonCopyable<int> nc_int_cpy(nc_int); // { dg-error "use" } + + NonCopyable<char> nc_char; + NonCopyable<char> nc_char_cpy(nc_char); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted14.C new file mode 100644 index 0000000..0c07fa7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted14.C @@ -0,0 +1,20 @@ +// PR c++/39866 +// { dg-do compile { target c++11 } } + +struct A { + A& operator=(const A&) = delete; // { dg-bogus "" } + + void operator=(int) {} // { dg-message "" } + void operator=(char) {} // { dg-message "" } +}; + +struct B {}; + +int main() +{ + A a; + a = B(); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 16 } + a = 1.0; // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 18 } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted15.C new file mode 100644 index 0000000..fabcc23 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted15.C @@ -0,0 +1,58 @@ +// PR c++/38796 +// { dg-do compile { target c++11 } } + +#define SA(X) static_assert ((X), #X) + +struct A +{ + A (int); + A (const A& = 1) = default; // { dg-error "default argument" } + void operator= (const A&) = default; // { dg-error "defaulted|match" } +}; + +struct B +{ +private: + B() = default; +}; + +SA(__has_trivial_constructor(B)); + +struct C +{ +protected: + ~C() = default; +}; + +SA(__has_trivial_destructor(C)); + +struct D +{ +private: + D& operator= (const D&) = default; +}; + +SA(__has_trivial_assign(D)); + +struct E +{ + explicit E (const E&) = default; +}; + +SA(__has_trivial_copy(E)); + +struct F +{ + F(F&) = default; +}; + +struct G: public F +{ + // Can't be const because F copy ctor isn't. + G(const G&) = default; // { dg-error "const" } +}; + +struct H +{ + virtual ~H() = default; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted16.C new file mode 100644 index 0000000..f866c8e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted16.C @@ -0,0 +1,13 @@ +// Test that non-inline default causes the function to be defined even if +// it isn't used. + +// { dg-do compile { target c++11 } } +// { dg-final { scan-assembler "_ZN1AC1Ev" } } + +struct A +{ + A(); +}; + +A::A() = default; + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted17.C new file mode 100644 index 0000000..0a3c0de --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted17.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } + +struct A // { dg-error "const|operator=" } +{ + const int i; +}; + +int main() +{ + A a = { 0 }; + a = a; // { dg-error "deleted" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted18.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted18.C new file mode 100644 index 0000000..6d84a1e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted18.C @@ -0,0 +1,10 @@ +// { dg-do compile { target c++11 } } + +void f(char i, int j) = delete; // { dg-message "<deleted>" } +void f(int i, ...); // { dg-message "void f" } + +int main() +{ + f(1,1); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 8 } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted19.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted19.C new file mode 100644 index 0000000..2b93a7b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted19.C @@ -0,0 +1,21 @@ +// We don't allocate a cookie to help us run the destructor if it's trivial, +// even if it's deleted. +// { dg-do run { target c++11 } } + +struct A +{ + ~A() = delete; +}; + +void *p = 0; +void *operator new[](__SIZE_TYPE__ t) +{ + p = ::operator new (t); + return p; +} + +int main() +{ + A* ap = new A[5]; + return ap != p; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted19a.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted19a.C new file mode 100644 index 0000000..a082d51 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted19a.C @@ -0,0 +1,23 @@ +// We allocate a cookie to help us run the destructor if it's non-trivial, +// even if it's deleted. +// { dg-do run { target c++11 } } + +struct B { ~B() {} }; +struct A +{ + B b; + ~A() = delete; +}; + +void *p = 0; +void *operator new[](__SIZE_TYPE__ t) +{ + p = ::operator new (t); + return p; +} + +int main() +{ + A* ap = new A[5]; + return ap == p; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted2.C new file mode 100644 index 0000000..bd83c7f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted2.C @@ -0,0 +1,69 @@ +// Negative test for defaulted/deleted fns. +// { dg-do compile { target c++11 } } + +void f(); // { dg-message "previous" } +void f() = delete; // { dg-error "deleted" } + +struct A +{ + A() { } // { dg-message "previous" } + void f() = default; // { dg-error "default" } +}; + +A::A() = default; // { dg-error "redefinition" } + +void g() {} // { dg-message "previous" } +void g() = delete; // { dg-error "redefinition" } + +struct B // { dg-message "user-provided default constructor" } +{ + int i; + B() = default; // { dg-message "not user-provided" } +}; + +const B b; // { dg-error "uninitialized const" } + +struct C +{ + virtual void f() = delete; // { dg-error "overriding deleted" } +}; + +struct D: public C +{ + virtual void f(); // { dg-error "non-deleted function" } +}; + +struct E +{ + const B b; + E() { } // { dg-error "uninitialized" } +}; + +struct F +{ + F() = default; + F(const F&) = delete; // { dg-message "declared" } +}; + +struct G +{ + G(); +}; + +// ctor defaulted after class defn is not trivial +G::G() = default; + +union U +{ + G g; // { dg-error "union member.*non-trivial" } +}; + +int main() +{ + F f; + F f2(f); // { dg-error "use" } + const B* b = new const B; // { dg-error "uninitialized const" } + U u; // { dg-error "deleted" } +} + +// { dg-prune-output "implicitly deleted because" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted20.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted20.C new file mode 100644 index 0000000..affda20 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted20.C @@ -0,0 +1,19 @@ +// PR c++/46497 +// { dg-do compile { target c++11 } } + +struct A { + A(A&&) = default; +}; +struct B { + const A a; + B(const B&) = default; + B(B&&) = default; // { dg-error "implicitly deleted|use of deleted" } +}; + +void g(B); // { dg-error "argument 1" } +B&& f(); + +int main() +{ + g(f()); // { dg-error "deleted" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted21.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted21.C new file mode 100644 index 0000000..63c98e6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted21.C @@ -0,0 +1,21 @@ +// PR c++/46736 +// { dg-do compile { target c++11 } } + +struct U { + U(); +private: + U(U const&); // { dg-error "private" } +}; + +struct X { + U const u; + X(); + X(X&&); +}; + +X::X(X&&)=default; // { dg-message "implicitly deleted" } +// { dg-prune-output "within this context" } + +X f() { + return X(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted22.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted22.C new file mode 100644 index 0000000..5afcd1d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted22.C @@ -0,0 +1,22 @@ +// Test that a virtual defaulted constructor is still virtual. +// { dg-do run { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted23.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted23.C new file mode 100644 index 0000000..9e6cbc3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted23.C @@ -0,0 +1,37 @@ +// Test for checking of exception specifications on defaulted fns +// { dg-do compile { target c++11 } } + +struct A +{ + A() noexcept = default; +}; + +A a; + +struct B +{ + B() throw (int) = default; // { dg-message "exception-specification" } +}; + +B b; // { dg-error "deleted" } + +struct C +{ + C() throw (int) { } +}; + +C c; + +struct D: C +{ + D() throw (int) = default; +}; + +D d; + +struct E +{ + E() = default; +}; + +E e; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted24.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted24.C new file mode 100644 index 0000000..32c6f2e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted24.C @@ -0,0 +1,6 @@ +// PR c++/48280 +// { dg-do compile { target c++11 } } + +struct S { + template < typename > S (const S &) = default; // { dg-error "" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted25.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted25.C new file mode 100644 index 0000000..644fe1b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted25.C @@ -0,0 +1,10 @@ +// PR c++/48930 +// { dg-do compile { target c++11 } } +// { dg-prune-output "note" } + +struct A +{ + A(const A&) = default; +}; + +A a; // { dg-error "no match" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted26.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted26.C new file mode 100644 index 0000000..f14a0e8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted26.C @@ -0,0 +1,7 @@ +// PR c++/49066 +// { dg-do compile { target c++11 } } + +void foo() = delete; // { dg-message "declared here" } +void foo(); + +int main() { foo(); } // { dg-error "deleted" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted27.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted27.C new file mode 100644 index 0000000..d26e744 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted27.C @@ -0,0 +1,19 @@ +// PR c++/47544 +// { dg-do compile { target c++11 } } +// { dg-final { scan-assembler "_ZN1sIiEC2Ev" } } +// { dg-final { scan-assembler-not "_ZN1sIiED2Ev" } } + +template <typename T> +struct s { + s(); + ~s() = default; +}; + +extern template struct s<int>; + +template <typename T> +s<T>::s() = default; + +template struct s<int>; + +s<int> a; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted28.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted28.C new file mode 100644 index 0000000..aa90099 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted28.C @@ -0,0 +1,17 @@ +// PR c++/49102 +// PR c++/50034 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted29.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted29.C new file mode 100644 index 0000000..8e2989b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted29.C @@ -0,0 +1,20 @@ +// PR c++/46696 +// { dg-do compile { target c++11 } } + +struct A +{ + A& operator= (A const&); +}; + +struct B +{ + A ar[1]; + B& operator= (B const&) = default; +}; + +int main() +{ + B x; + B y; + y = x; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted3.C new file mode 100644 index 0000000..75e89c8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted3.C @@ -0,0 +1,16 @@ +// PR c++/37006 +// { dg-do compile { target c++11 } } + +template<class T> +struct A { + template<class U> + bool operator==(const A<U>&) = delete; // { dg-message "declared" } + operator bool () { return true; } +}; + +int main() +{ + A<int> a1; + A<void> a2; + if(a1 == a2) {} // { dg-error "use" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted30.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted30.C new file mode 100644 index 0000000..ce86f57 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted30.C @@ -0,0 +1,16 @@ +// PR c++/49507 +// { dg-do compile { target c++11 } } + +template<typename T> +struct ConcretePoolKey +{ + virtual ~ConcretePoolKey(); +}; + +template<typename T> +ConcretePoolKey<T>::~ConcretePoolKey() = default; + +int main() +{ + ConcretePoolKey<int> foo; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted31.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted31.C new file mode 100644 index 0000000..2ac28ba --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted31.C @@ -0,0 +1,16 @@ +// PR c++/39164 +// { dg-do compile { target c++11 } } + +struct A +{ + A() { } // { dg-message "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-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted32.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted32.C new file mode 100644 index 0000000..e5b94b6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted32.C @@ -0,0 +1,21 @@ +// PR c++/50531 +// { dg-do compile { target c++11 } } + +template <typename T> +class DataFilter +{ + public: + inline virtual ~DataFilter(); +}; + +template<typename T> +inline DataFilter<T>::~DataFilter() = default; + +class ARCalculator : public DataFilter<ARCalculator> +{ + public: + virtual void dataStart(int, int); +}; + +void ARCalculator::dataStart(int, int) +{} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted33.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted33.C new file mode 100644 index 0000000..2f11c13 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted34.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted34.C new file mode 100644 index 0000000..ff777f6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted34.C @@ -0,0 +1,10 @@ +// { dg-do compile { target c++11 } } +// { dg-final { scan-assembler "__cxa_deleted_virtual" } } + +struct A +{ + virtual void f(); + virtual ~A() = delete; +}; + +void A::f() {} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted35.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted35.C new file mode 100644 index 0000000..adf9c82 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted35.C @@ -0,0 +1,8 @@ +// PR c++/53096 +// { dg-do compile { target c++11 } } + +struct foo +{ + foo(foo&) = default; + foo& operator=(foo&) = default; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted36.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted36.C new file mode 100644 index 0000000..1360f60 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted37.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted37.C new file mode 100644 index 0000000..1926f2e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted37.C @@ -0,0 +1,19 @@ +// DR 1402 +// { dg-do compile { target c++11 } } + +struct A +{ + A& operator=(A&&); +}; + +struct B: virtual A { B& operator=(B&&) = default; }; // { dg-warning "virtual base" } +struct C: virtual A { }; // { dg-warning "virtual base" } + +int main() +{ + B b1, b2; + b2 = static_cast<B&&>(b1); + + C c1, c2; + c2 = static_cast<C&&>(c1); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted38.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted38.C new file mode 100644 index 0000000..39424f6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted38.C @@ -0,0 +1,14 @@ +// PR c++/50893 +// { dg-do compile { target c++11 } } + +class Base +{ + public: + virtual ~Base() = default; +}; + +class Derived : public Base +{ + public: + virtual ~Derived() = default; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted39.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted39.C new file mode 100644 index 0000000..a4963c4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted39.C @@ -0,0 +1,23 @@ +// DR 1402 +// { dg-do compile { target c++11 } } + +template <class T> T&& move(T& t); + +struct A +{ + A(const A&); +}; + +struct B +{ + B(B&&); +}; + +struct C +{ + A a; + B b; +}; + +extern C c1; +C c2(move(c1)); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted4.C new file mode 100644 index 0000000..ca07d76 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted4.C @@ -0,0 +1,25 @@ +// PR c++/37208: SFINAE and deleted functions. + +// { dg-do compile { target c++11 } } +template<int> struct A { }; + +template<typename T> +int& int_if_addable(A<sizeof((*(T*)0) + (*(T*)0))>*); + +template<typename T> +float& int_if_addable(...); + +struct X { }; + +struct Y { }; +Y operator+(Y, Y); + +struct Z { }; +Z operator+(Z, Z) = delete; + +void f() +{ + float& x = int_if_addable<X>(0); + int& y = int_if_addable<Y>(0); + float& z = int_if_addable<Z>(0); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted40.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted40.C new file mode 100644 index 0000000..8da1364 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted40.C @@ -0,0 +1,23 @@ +// DR 1402 +// { dg-do compile { target c++11 } } + +template <class T> T&& move(T& t); + +struct A +{ + A(const A&); +}; + +struct B +{ + B(B&&) = delete; // { dg-prune-output "declared" } +}; + +struct C // { dg-error "deleted" } +{ + A a; + B b; +}; + +extern C c1; +C c2(move(c1)); // { dg-error "deleted" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted41.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted41.C new file mode 100644 index 0000000..4272012 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted41.C @@ -0,0 +1,14 @@ +// PR c++/56343 +// { dg-do compile { target c++11 } } + +class B +{ +public: + virtual ~B() noexcept(false) { } +}; + +class D : public B +{ +public: + virtual ~D() = default; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted42.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted42.C new file mode 100644 index 0000000..1ac25a9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted42.C @@ -0,0 +1,10 @@ +// DR 941 +// { dg-require-effective-target c++11 } + +template <class T> T f(T) = delete; +template<> int f(int) { return 42; } + +int main() +{ + f(42); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted43.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted43.C new file mode 100644 index 0000000..f2846fe --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted43.C @@ -0,0 +1,60 @@ +// PR c++/53903 +// { dg-do compile { target c++11 } } + +struct T +{ + T() noexcept(false) { } + ~T() noexcept(false) { } +}; + +T t; + +struct A +{ + A() noexcept; + ~A() noexcept; + + T t; +}; + +A::A() noexcept = default; // { dg-error "defaulted" } +A::~A() noexcept = default; // { dg-error "defaulted" } + +struct U +{ + U() noexcept(false) { } + ~U() noexcept(false) { } +}; + +U u; + +struct B +{ + B() noexcept(false); + ~B() noexcept(false); + + U u; +}; + +B::B() noexcept(false) = default; +B::~B() noexcept(false) = default; + +B b; + +struct V +{ + V() noexcept(false) { } + ~V() noexcept(false) { } +}; + +V v; + +struct C +{ + C() noexcept = default; // { dg-message "exception-specification" } + ~C() noexcept = default; // { dg-message "exception-specification" } + + V v; +}; + +C c; // { dg-error "deleted" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted44.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted44.C new file mode 100644 index 0000000..213c139 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted44.C @@ -0,0 +1,24 @@ +// PR c++/57319 +// { dg-require-effective-target c++11 } + +namespace N1 { + struct A { }; + struct B: virtual A { }; + struct C: virtual B { }; + + struct D: C + { + void operator= (D &); + }; +} + +namespace N2 { + struct A { A& operator=(A&&); }; + struct B: virtual A { }; // { dg-warning "move assignment" } + struct C: virtual B { }; // { dg-warning "move assignment" } + + struct D: C + { + void operator= (D &); + }; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted45.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted45.C new file mode 100644 index 0000000..e91b3a1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted45.C @@ -0,0 +1,20 @@ +// { dg-do run } +// { dg-require-effective-target c++11 } + +struct A +{ + int i; + A() = default; + A(int i): i{i} { } + ~A() {} +}; + +int main(int argc, char **argv) +{ + { int i[4] = { 42, 42, 42, 42 }; } + { + A a[4] = { argc }; + if (a[1].i != 0) + __builtin_abort (); + } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted46.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted46.C new file mode 100644 index 0000000..d4562c9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted46.C @@ -0,0 +1,17 @@ +// { dg-require-effective-target c++11 } + +struct A +{ +protected: + A() = default; + int i; +}; + +struct B: A { + B() = default; +}; + +int main() +{ + B(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted47.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted47.C new file mode 100644 index 0000000..f4b62a3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted47.C @@ -0,0 +1,16 @@ +// PR c++/54812 +// { dg-do compile { target c++11 } } + +class A +{ + A() = default; // { dg-error "private" } +}; + +A a; // { dg-error "context" } + +class B +{ + ~B() = default; // { dg-error "private" } +}; + +B b; // { dg-error "context" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted48.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted48.C new file mode 100644 index 0000000..727afc5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted48.C @@ -0,0 +1,17 @@ +// PR c++/60108 +// { dg-require-effective-target c++11 } + +template<int> struct A +{ + virtual ~A(); +}; + +template<typename> struct B : A<0>, A<1> +{ + ~B() = default; +}; + +struct C : B<bool> +{ + C() {} +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted5.C new file mode 100644 index 0000000..96394ea --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted5.C @@ -0,0 +1,19 @@ +// PR c++/37234 +// { dg-do link { target c++11 } } + +template <typename T> +class foo { + public: + foo() =default; + ~foo(); +}; + +template <typename T> +foo<T>::~foo() =default; + +int main() { + + foo<int> fi; + + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted6.C new file mode 100644 index 0000000..440c58d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted6.C @@ -0,0 +1,13 @@ +// PR c++/37906 +// { dg-do compile { target c++11 } } + +struct b +{ + b() = default; + b(const b&) = delete; +}; + +void test01() +{ + static_assert(__has_trivial_constructor(b), "default ctor not trivial"); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted7.C new file mode 100644 index 0000000..089d618 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted7.C @@ -0,0 +1,12 @@ +// PR c++/38701, 38702 +// { dg-do compile { target c++11 } } + +void foo() = default; // { dg-error "cannot be defaulted" } +namespace +{ + void bar() = default; // { dg-error "cannot be defaulted" } +} + +enum E { e }; + +E& operator |= (E&, const E&) = default; // { dg-error "cannot be defaulted" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted8.C new file mode 100644 index 0000000..383766d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted8.C @@ -0,0 +1,8 @@ +// PR c++/38649 +// { dg-do compile { target c++11 } } + +struct A +{ + A(...) = default; // { dg-error "cannot be defaulted" } + A(const A&, ...) = default; // { dg-error "cannot be defaulted" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted9.C new file mode 100644 index 0000000..8d3aef8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted9.C @@ -0,0 +1,21 @@ +// PR c++/39153 +// { dg-do compile { target c++11 } } +// { dg-options "-fno-inline" } + +struct _Impl_base +{ + _Impl_base() = default; + virtual ~_Impl_base(); +}; + +inline _Impl_base::~_Impl_base() = default; + +template<typename _Tp> +class _Impl : public _Impl_base +{ }; + +int main() +{ + _Impl<int> i; + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deleted1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deleted1.C new file mode 100644 index 0000000..0a632bf --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deleted1.C @@ -0,0 +1,6 @@ +// PR c++/58581 +// { dg-do compile { target c++11 } } + +template<typename T> int foo(T) noexcept(T()) = delete; + +int i = foo(0); // { dg-error "deleted" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deleted2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deleted2.C new file mode 100644 index 0000000..8590c49 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deleted2.C @@ -0,0 +1,9 @@ +// PR c++/52707 +// { dg-do compile { target c++11 } } + +struct A { + int m; + A() = delete; +}; + +A a = {1}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deleted3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deleted3.C new file mode 100644 index 0000000..6783677 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deleted3.C @@ -0,0 +1,11 @@ +// PR c++/60216 +// { dg-require-effective-target c++11 } + +struct A +{ + template<typename T> A(T) = delete; +}; + +template<> A::A<int>(int) {} + +A a(0); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dependent1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dependent1.C new file mode 100644 index 0000000..629b125 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dependent1.C @@ -0,0 +1,25 @@ +// PR c++/48319 +// { dg-do compile { target c++11 } } +// We were failing to recognize declval<_Args1> as dependent. + +template<typename Tp> Tp declval() noexcept; + +template<typename _Tp> +class __is_constructible_helper +{ + typedef char __one; + typedef struct { char __arr[2]; } __two; + + template<typename _Tp1, typename... _Args1> + static decltype(_Tp1(declval<_Args1>()...), __one()) __test(int); + + template<typename, typename...> + static __two __test(...); + +public: + static const bool __value = sizeof(__test<_Tp>(0)) == 1; +}; + +int main() { + return __is_constructible_helper<int>::__value; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/diag1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/diag1.C new file mode 100644 index 0000000..9bf7cfe --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/diag1.C @@ -0,0 +1,32 @@ +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/dyncast1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dyncast1.C new file mode 100644 index 0000000..1224f36 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/dyncast1.C @@ -0,0 +1,31 @@ +// PR c++/57599 +// { dg-do compile { target c++11 } } + +struct A { }; +struct B : public A { }; + +template<class, class> +struct is_same { static constexpr bool value = false; }; + +template<class T> +struct is_same<T, T> { static constexpr bool value = true; }; + +template<class T> +T val(); + +static_assert(is_same<decltype(dynamic_cast<A*>(val<B*>())), + A*>::value, "Ouch"); +static_assert(is_same<decltype(dynamic_cast<A&>(val<B&>())), + A&>::value, "Ouch"); +static_assert(is_same<decltype(dynamic_cast<const A*>(val<B*>())), + const A*>::value, "Ouch"); +static_assert(is_same<decltype(dynamic_cast<const A&>(val<B&>())), + const A&>::value, "Ouch"); +static_assert(is_same<decltype(dynamic_cast<volatile A*>(val<B*>())), + volatile A*>::value, "Ouch"); +static_assert(is_same<decltype(dynamic_cast<volatile A&>(val<B&>())), + volatile A&>::value, "Ouch"); +static_assert(is_same<decltype(dynamic_cast<const volatile A*>(val<B*>())), + const volatile A*>::value, "Ouch"); +static_assert(is_same<decltype(dynamic_cast<const volatile A&>(val<B&>())), + const volatile A&>::value, "Ouch"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/elision.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/elision.C new file mode 100644 index 0000000..4cc5653 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/elision.C @@ -0,0 +1,75 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test: Implicit cast to rvalue when eliding copy + +// { dg-do compile { target c++11 } } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {char x[1];}; +struct two {char x[2];}; + +class move_only +{ + move_only(const move_only&); + move_only& operator=(const move_only&); +public: + move_only() {} + move_only(move_only&&) {} + move_only& operator=(move_only&&) {return *this;} +}; + +move_only +test1() +{ + return move_only(); +} + +move_only +test2() +{ + move_only x; + return x; +} + +move_only +test3(bool b) +{ + move_only x1; + if (b) + { + move_only x2; + return x2; + } + return x1; +} + +void +test4(bool b) +{ + if (!b) + throw move_only(); +} + +void +test5(bool b) +{ + move_only x; + if (!b) + throw x; +} + +extern bool b; + +int main() +{ + move_only t1 = test1(); + move_only t2 = test2(); + move_only t3 = test3(b); + test4(b); + test5(b); + return 0; +} + +bool b = true; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/elision2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/elision2.C new file mode 100644 index 0000000..b3d13fb --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/elision2.C @@ -0,0 +1,13 @@ +// Core 1148: should be able to move from value parameter on return +// { dg-do compile { target c++11 } } + +struct A +{ + A(const A&) = delete; + A(A&&); +}; + +A f (A a) +{ + return a; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/elision_neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/elision_neg.C new file mode 100644 index 0000000..0870a80 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/elision_neg.C @@ -0,0 +1,43 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test: Implicit cast to rvalue when eliding copy + +// { dg-do compile { target c++11 } } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {char x[1];}; +struct two {char x[2];}; + +class move_only +{ + move_only(const move_only&); // { dg-error "is private" } + move_only& operator=(const move_only&); +public: + move_only() {} + move_only(move_only&&) {} + move_only& operator=(move_only&&) {return *this;} +}; + +move_only +test1() +{ + static move_only x; + return x; // { dg-error "within this context" } +} + +move_only +test2(move_only&& x) +{ + return x; // { dg-error "within this context" } +} + +int main() +{ + move_only t1 = test1(); + move_only t2 = test2(move_only()); + return 0; +} + +bool b = true; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/elision_weak.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/elision_weak.C new file mode 100644 index 0000000..e8ba755 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/elision_weak.C @@ -0,0 +1,19 @@ +// { dg-do compile } + +struct S +{ + S() {} + S(S&) {} +}; + +S f() +{ + S s; + return s; +} + +void g() +{ + S s; + throw s; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum1.C new file mode 100644 index 0000000..bf17429 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum1.C @@ -0,0 +1,5 @@ +// PR c++/38021 +// { dg-do compile { target c++11 } } + +enum : { }; // { dg-error "expected" } +enum : 3 { }; // { dg-error "expected" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum10.C new file mode 100644 index 0000000..daffd19 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum10.C @@ -0,0 +1,9 @@ +// PR c++/48534 +// { dg-do compile { target c++11 } } + +enum class OpSE : bool; + +int main() +{ + return static_cast<bool>(OpSE()); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum11.C new file mode 100644 index 0000000..a449f1c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum11.C @@ -0,0 +1,15 @@ +// PR c++/48969 +// { dg-do compile { target c++11 } } +// { dg-options "-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-4.9/gcc/testsuite/g++.dg/cpp0x/enum12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum12.C new file mode 100644 index 0000000..ea55cfe --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum12.C @@ -0,0 +1,19 @@ +// PR c++/48780 +// { dg-do compile { target c++11 } } +// { dg-options "-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-4.9/gcc/testsuite/g++.dg/cpp0x/enum13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum13.C new file mode 100644 index 0000000..5e4a532 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum13.C @@ -0,0 +1,21 @@ +// PR c++/48780 +// { dg-do compile { target c++11 } } +// { dg-options "-fabi-version=5 -Wabi" } + +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); // { dg-warning "promote" } + __builtin_va_end(vl); +} + +int main() { + foo(0, A::X); // { dg-warning "will not promote" } +} + +// { dg-prune-output "note" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum14.C new file mode 100644 index 0000000..2be758d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum14.C @@ -0,0 +1,12 @@ +// PR c++/48106 +// { dg-do compile { target c++11 } } + +enum class E : char +{ + e +}; + +bool operator&(E e, char m) +{ + return static_cast<int>(e) & m; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum15.C new file mode 100644 index 0000000..07beee5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum15.C @@ -0,0 +1,20 @@ +// PR c++/44311 +// { dg-do compile { target c++11 } } + +enum class A { Val0, Val1 }; + +void foo (A a, int i) +{ + switch (a) + { + case A::Val0: break; + case 1: break; // { dg-error "" } + } + + switch (i) + { + case A::Val0: break; // { dg-error "" } + case 1: break; + case 2.0: break; // { dg-error "" } + } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum16.C new file mode 100644 index 0000000..207fcab --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum16.C @@ -0,0 +1,6 @@ +// PR c++/48935 +// { dg-do compile { target c++11 } } + +enum class ENUM { a }; + +ENUM::Type func() { return ENUM::a; } // { dg-error "does not name a type" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum17.C new file mode 100644 index 0000000..32c4609 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum17.C @@ -0,0 +1,17 @@ +// PR c++/48536 +// { dg-do compile { target c++11 } } + +#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-4.9/gcc/testsuite/g++.dg/cpp0x/enum18.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum18.C new file mode 100644 index 0000000..de16596 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum18.C @@ -0,0 +1,8 @@ +// PR c++/47277 +// { dg-do compile { target c++11 } } + +int main(void) { + enum e {}; + e ev; + ev.e::~e_u(); // { dg-error "e_u. has not been declared" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum19.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum19.C new file mode 100644 index 0000000..b04fd52 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum19.C @@ -0,0 +1,13 @@ +// We shouldn't give an ABI warning about promotion in switch. +// { dg-do compile { target c++11 } } +// { dg-options "-fabi-version=5 -Wabi" } + +enum class Foo { X }; +void test(Foo val) +{ + switch(val) + { + case Foo::X: + break; + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum2.C new file mode 100644 index 0000000..c101134 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum2.C @@ -0,0 +1,4 @@ +// PR c++/38637 +// { dg-do compile { target c++11 } } + +template<int> enum E : int { e }; // { dg-error "declaration|expected" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum20.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum20.C new file mode 100644 index 0000000..8937cc7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum20.C @@ -0,0 +1,5 @@ +// PR c++/47635 +// { dg-do compile { target c++11 } } + +enum A { }; +void A::f() { } // { dg-error "not a class" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum21a.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum21a.C new file mode 100644 index 0000000..5526811 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/enum21b.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum21b.C new file mode 100644 index 0000000..ac449f0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum21b.C @@ -0,0 +1,4 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-pedantic" } + +enum x { y, }; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum22.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum22.C new file mode 100644 index 0000000..e87a31c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum22.C @@ -0,0 +1,12 @@ +// PR c++/56155 +// { dg-do compile { target c++11 } } + +enum e_ : unsigned char { Z_, E_=sizeof(Z_) }; +static_assert( E_ == 1, "E_ should be 1"); + +template <class T> +struct A { + enum e_ : unsigned char { Z_, E_=sizeof(Z_) }; +}; + +static_assert ( A<double>::E_ == 1, "E_ should be 1"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum23.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum23.C new file mode 100644 index 0000000..b2378e1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum23.C @@ -0,0 +1,9 @@ +// PR c++/51242 +// { dg-do compile { target c++11 } } + +enum class MyEnum { A = 1 }; + +struct MyClass +{ + MyEnum Field1 : 3; // { dg-bogus "warning: 'MyClass::Field1' is too small" "" { xfail *-*-* } } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum24.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum24.C new file mode 100644 index 0000000..6099656 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum24.C @@ -0,0 +1,57 @@ +// PR c++/56749 +// { dg-require-effective-target c++11 } + +enum normal_enum +{ + not_scoped1, + not_scoped2 +}; + +enum class scoped_enum +{ + scoped1, + scoped2 +}; + +template <normal_enum N=not_scoped1> +class A +{ +public: + template <typename T> + void fun () + { + } +}; + +template <scoped_enum N=scoped_enum::scoped1> +class B +{ +public: + template <typename T> + void fun () + { + } +}; + + +template <typename T> +void tfun () +{ + A<> a; + a.fun<char>(); //<------------ THIS IS FINE + + B<> b_defaulted; + B<scoped_enum::scoped1> b_explicited; + + b_defaulted.fun<char>(); //<------------ UNEXPECTED: THIS FAILS + b_defaulted.template fun<char>(); //<------------ THIS IS FINE + + b_explicited.fun<char>(); //<------------ UNEXPECTED: THIS FAILS + b_explicited.template fun<char>();//<------------ THIS IS FINE +} + +int main(int argc, char const *argv[]) +{ + tfun<int>(); + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum25.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum25.C new file mode 100644 index 0000000..cb2cf8f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum25.C @@ -0,0 +1,18 @@ +// PR c++/56793 +// { dg-require-effective-target c++11 } + +struct A +{ + enum struct B {X, Y} b; +} a; + +enum struct D {X,Y}; +struct C { } c; + +int main () +{ + if (a.b == a.B::Y) + a.b = A::B::X; + + c.D::Y; // { dg-error "not a member" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum26.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum26.C new file mode 100644 index 0000000..cfc5df3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum26.C @@ -0,0 +1,9 @@ +// PR c++/54216 +// { dg-do compile { target c++11 } } +// { dg-options "-pedantic" } + +enum {}; // { dg-warning "empty anonymous" } + +enum class {}; // { dg-error "anonymous" } + +enum class { x }; // { dg-error "anonymous" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum27.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum27.C new file mode 100644 index 0000000..80ac98f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum27.C @@ -0,0 +1,4 @@ +// PR c++/53745 +// { dg-do compile { target c++11 } } + +enum E : unsigned { e = -1 }; // { dg-error "outside the range" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum28.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum28.C new file mode 100644 index 0000000..3967699 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum28.C @@ -0,0 +1,17 @@ +// PR c++/51912 +// { dg-do compile { target c++11 } } + +constexpr double g() { return 2.0; } + +void f(int i) +{ + switch (i) + { + case 1.0:; // { dg-error "could not convert" } + } + + switch (i) + { + case g():; // { dg-error "could not convert" } + } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum3.C new file mode 100644 index 0000000..940bc04 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum3.C @@ -0,0 +1,26 @@ +// PR c++/38064 +// { dg-do run { target c++11 } } + +enum class E { elem }; + +template <class T> +void f (T t); + +bool f (bool b) { return b; } + +int main() +{ + E e = E::elem; + if (!f (e == E::elem)) + return 1; + if (!f (e <= E::elem)) + return 1; + if (!f (e >= E::elem)) + return 1; + if (f (e < E::elem)) + return 1; + if (f (e > E::elem)) + return 1; + if (f (e != E::elem)) + return 1; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum4.C new file mode 100644 index 0000000..9e908c0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum4.C @@ -0,0 +1,8 @@ +// PR c++/40633 +// { dg-do compile { target c++11 } } + +template< typename T > +struct wrap { + enum class E { val }; +}; + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum5.C new file mode 100644 index 0000000..f896440 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum5.C @@ -0,0 +1,20 @@ +// PR c++/40639 +// { dg-do compile { target c++11 } } + +template< typename T > +struct wrap { + enum E : T { val }; +}; + +template< typename T > +struct dependant { + enum E : typename T::type { val }; +}; + +template<typename T> +struct identity { + typedef T type; +}; + +wrap<int> x; +dependant<identity<int>> y; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum6.C new file mode 100644 index 0000000..c3832ae --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum6.C @@ -0,0 +1,15 @@ +// PR c++/37946 +// { dg-do compile { target c++11 } } + +enum class E : char +{ + e1, + e2 +}; + +inline E operator| (E a1, E a2) +{ + char ret = static_cast<char> (a1) + | static_cast<char> (a2); + return static_cast<E>(ret); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum7.C new file mode 100644 index 0000000..6788f8a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum7.C @@ -0,0 +1,11 @@ +// PR c++/37816 +// { dg-do compile { target c++11 } } + +class A +{ + enum class Color { Red, Orange, Yellow, Green, Blue, Violet }; + enum class Alert { Green, Yellow, Red }; + static const Color x = Red; // { dg-error "" } + static const Color y = Color::Red; + static const Alert z = Alert::Red; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum8.C new file mode 100644 index 0000000..15bee83 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum8.C @@ -0,0 +1,9 @@ +// PR c++/47704 +// { dg-do compile { target c++11 } } + +void +foo () +{ + enum class E { A, B }; + new E; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum9.C new file mode 100644 index 0000000..f359b42 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum9.C @@ -0,0 +1,5 @@ +// { dg-do compile { target c++11 } } + +enum class E { }; +E f(); +bool b2 = static_cast<bool>(f()); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum_base.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum_base.C new file mode 100644 index 0000000..8e23179 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum_base.C @@ -0,0 +1,25 @@ +// { dg-do compile { target c++11 } } + +typedef unsigned volatile long long uvlonglong; + +enum E1 : char { }; +enum E2 : signed const short { }; +enum E3 : uvlonglong { }; +enum E4 : char { + val = 500 // { dg-error "outside the range" } +}; + +enum class E5 { + val = (unsigned long long)-1 // { dg-error "outside the range" } +}; + +typedef float Float; + +enum class E6 : Float { }; // { dg-error "must be an integral type" } + +static_assert (sizeof(E1) == sizeof(char), "char-sized enum"); +static_assert (sizeof(E2) == sizeof(signed short), "short-sized enum"); +static_assert (sizeof(E3) == sizeof(unsigned long long), + "long long-sized enum"); +static_assert (sizeof(E4) == sizeof(char), "char-sized enum"); +static_assert (sizeof(E5) == sizeof(int), "scoped enum with int size"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum_base2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum_base2.C new file mode 100644 index 0000000..8c6a901 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum_base2.C @@ -0,0 +1,9 @@ +// PR c++/60187 +// { dg-require-effective-target c++11 } + +template<typename... T> struct A +{ + enum E : T {}; // { dg-error "parameter pack" } +}; + +A<int> a; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum_base_warn.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum_base_warn.C new file mode 100644 index 0000000..82878a6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/enum_base_warn.C @@ -0,0 +1,25 @@ +// { dg-do run { target c++11 } } +// { dg-options "-O2 -Wtype-limits" } +extern void link_error (void); + +enum Alpha : unsigned char { + ZERO = 0, ONE, TWO, THREE +}; + +Alpha a2; + +int m1 = -1; +int GetM1() { + return m1; +} + +int main() { + a2 = static_cast<Alpha>(GetM1()); + if (a2 == -1) { // { dg-warning "always false due" } + link_error (); + } + if (-1 == a2) { // { dg-warning "always false due" } + link_error (); + } + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error1.C new file mode 100644 index 0000000..33557f2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error1.C @@ -0,0 +1,10 @@ +// PR c++/34395 +// { dg-do compile { target c++11 } } + +template<int... N> void foo (int... x[N]) // { dg-message "int \\\[N\\\]\\.\\.\\. x" } +{ + struct A + { + A () { x; } // { dg-error "use of parameter from containing function" } + }; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error2.C new file mode 100644 index 0000000..e6af294 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error2.C @@ -0,0 +1,9 @@ +// PR c++/38656 +// { dg-do compile { target c++11 } } + +template<int> int foo(); + +template<typename F> void bar(F f) +{ + f((foo<0>()=0)...); // { dg-error "pattern '\\(foo\\<0\\>\\)\\(\\)=0'" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error3.C new file mode 100644 index 0000000..75390f0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error3.C @@ -0,0 +1,24 @@ +// PR c++/47336 +// { dg-do compile { target c++11 } } + +template <typename T> +void g(T t) +{ + t+1; // { dg-error "no match" } +} + +template <typename S> +class C +{ + struct D {} d; +public: + decltype(g(d)) h() + { + return g(d); + } +}; + +int main() +{ + C<int>().h(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error4.C new file mode 100644 index 0000000..bd73b2a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error4.C @@ -0,0 +1,22 @@ +// PR c++/49156 +// { dg-do compile { target c++11 } } + +template<typename T> T declval(); + +template<typename T> +struct S { + + template<typename U> + static U get(const volatile T&); + + template<typename U> + static decltype(*declval<U>()) get(...); // { dg-error "operator*" } + + typedef decltype(get<T>(declval<T>())) type; // { dg-error "no match" } +}; + +struct X { }; + +S<X>::type x; + +// { dg-prune-output "note" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error5.C new file mode 100644 index 0000000..e46c46d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error5.C @@ -0,0 +1,107 @@ +// PR c++/49181 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/error6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error6.C new file mode 100644 index 0000000..515f8f5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error6.C @@ -0,0 +1,8 @@ +// PR c++/48284 +// { dg-do compile { target c++11 } } + +template<typename C> +auto g(C& c) -> decltype (c.f()) { return c.f(); } // { dg-message "decltype .c\\.f" } + +template<typename C> +auto g(C& c) -> decltype (c.f()) { return c.f(); } // { dg-error "decltype .c\\.f" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error7.C new file mode 100644 index 0000000..3c9b8ba --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error7.C @@ -0,0 +1,10 @@ +// Test for printing the type of T{} in error messages. +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/error8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error8.C new file mode 100644 index 0000000..a992077 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/error8.C @@ -0,0 +1,7 @@ +// PR c++/39681 +// { dg-do compile { target c++11 } } + +struct A +{ + int* p = new foo; // { dg-error "16:foo. does not name a type" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit1.C new file mode 100644 index 0000000..ea4fa8a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit1.C @@ -0,0 +1,58 @@ +// Test for explicit conversion ops from N2437. +// { dg-do compile { target c++11 } } + +class U; class V; +class T +{ +public: + T( U const & ); + //implicit converting ctor + explicit T( V const & ); + // explicit ctor +}; +class U +{ +}; +class V +{ +}; +class W +{ +public: + operator T() const; +}; +class X +{ +public: + explicit operator T() const; // theoretical +}; +int main() +{ + U u; V v; W w; X x; + // Direct initialization: + T t1( u ); + T t2( v ); + T t3( w ); + T t4( x ); + // Copy initialization: + T t5 = u; + T t6 = v; // { dg-error "" } + T t7 = w; + T t8 = x; // { dg-error "" } + // Cast notation: + T t9 = (T) u; + T t10 = (T) v; + T t11 = (T) w; + T t12 = (T) x; + // Static cast: + T t13 = static_cast<T>( u ); + T t14 = static_cast<T>( v ); + T t15 = static_cast<T>( w ); + T t16 = static_cast<T>( x ); + // Function-style cast: + T t17 = T( u ); + T t18 = T( v ); + T t19 = T( w ); + T t20 = T( x ); + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit2.C new file mode 100644 index 0000000..715855c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit2.C @@ -0,0 +1,29 @@ +// Test for explicit conversion ops in various conversion situations. +// { dg-do compile { target c++11 } } + +typedef void (*pfn)(); + +struct A +{ + explicit operator int() const; + explicit operator pfn() const; +}; + +int main() +{ + A a; + int i = a; // { dg-error "" } + const int &ir = a; // { dg-error "" } + a(); // { dg-error "" } + a + 1; // { dg-message "" } (error and note on same line) + + int j (a); + (int)a; + static_cast<int>(a); +} + +struct B +{ + int i; + B(const A& a): i(a) { } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit3.C new file mode 100644 index 0000000..678076c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit3.C @@ -0,0 +1,50 @@ +// Test for "contextually converted to bool" +// { dg-do compile { target c++11 } } + +struct A +{ + explicit operator bool(); +}; + +void f (bool); + +struct B +{ + bool b; +}; + +struct C +{ + operator int(); +}; + +struct D +{ + operator int(); +}; + +int main() +{ + A a; C c; D d; + // These contexts use an explicit bool conversion. + if (a) {} + for (; a; ) {} + do {} while (a); + while (a) {} + a ? 1 : 0; + a || true; + a && true; + !a; + + a ? c : 1; + a ? c : d; + + // These do not. + switch (a); // { dg-error "" } + bool b = a; // { dg-error "" } + f(a); // { dg-error "" } + B b2 = { a }; // { dg-error "" } + a + true; // { dg-error "5:no match" } + b ? a : true; // { dg-error "5:no match" } + a ? a : true; // { dg-error "5:no match" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit4.C new file mode 100644 index 0000000..663878e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit4.C @@ -0,0 +1,18 @@ +// Negative explicit conv test. +// { dg-do compile { target c++11 } } + +struct A { + A(const A&, int = 0); // { dg-message "note" } +}; +struct B +{ + explicit operator A(); +}; + +int main() +{ + B b; + (A(b)); // OK + (A(b,1)); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 16 } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit5.C new file mode 100644 index 0000000..1adb8d6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit5.C @@ -0,0 +1,24 @@ +// test for extension of DR 899 to handle template ctors +// { dg-do run { target c++11 } } + +int r = 1; + +struct C { + C() { } + template <class T = int> C(C&, T = 0) { r = 0; } +}; + +C c; + +struct A +{ + explicit operator C&() const { return c; } +}; + +int main() +{ + A a; + C c2 (a); + + return r; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit6.C new file mode 100644 index 0000000..18f31b4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit6.C @@ -0,0 +1,12 @@ +// PR c++/47080 +// { dg-options "" } +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/explicit7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit7.C new file mode 100644 index 0000000..574796d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/explicit7.C @@ -0,0 +1,18 @@ +// [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-do compile { target c++11 } } +// { dg-options "" } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/extern_template-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/extern_template-1.C new file mode 100644 index 0000000..2779a2b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/extern_template-1.C @@ -0,0 +1,5 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-pedantic" } + +template <typename> void f() {} +extern template void f<int>(); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/extern_template-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/extern_template-2.C new file mode 100644 index 0000000..3eb870b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/extern_template-2.C @@ -0,0 +1,5 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-pedantic" } + +template <typename> class S {}; +extern template class S<int>; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/extern_template-3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/extern_template-3.C new file mode 100644 index 0000000..1b7ad0e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/extern_template-3.C @@ -0,0 +1,16 @@ +// PR c++/37256 +// { dg-options "-O" } + +template <typename T_> +struct B +{ + T_ f(); +}; + +extern template class B<int>; + +void f() +{ + B<int> t; + t.f(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg1.C new file mode 100644 index 0000000..3081d67 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg1.C @@ -0,0 +1,7 @@ +// PR c++/37766 +// { dg-do compile { target c++11 } } + +int a = 1; +template<int& b = a> void f() { + f<>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg2.C new file mode 100644 index 0000000..663f400 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg2.C @@ -0,0 +1,25 @@ +// PR c++/46831 +// { dg-do compile { target c++11 } } +// { dg-options "" } + +struct B { }; +struct D : B { }; +struct A { + template<typename T = void> operator D&(); // { dg-message "template conversion" } + operator long(); +}; + +void f(long); +void f(B&); + +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-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg3.C new file mode 100644 index 0000000..8e9b76f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg3.C @@ -0,0 +1,26 @@ +// { dg-do compile { target c++11 } } + +template <class T, class = typename T::I> void f(T) {} +template <class T, class = typename T::I> void g(T) {} +template <class T, class = typename T::I> void h(T) {} +template <class T, class = typename T::I> void i(T) {} +template <class T, class = typename T::I> void j(T) {} // { dg-error "this context" } + +class A +{ + typedef int I; // { dg-error "private" } + template <class T, class> friend void f(T); + friend void g<A,I>(A); + friend void h<A>(A); + friend void i<>(A); +}; + +int main() +{ + A a; + f(a); + g(a); + h(a); + i(a); + j(a); // { dg-error "no match" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg4.C new file mode 100644 index 0000000..52e6f38 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg4.C @@ -0,0 +1,6 @@ +// PR c++/55724 +// { dg-do compile { target 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-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg5.C new file mode 100644 index 0000000..0821fc0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg5.C @@ -0,0 +1,17 @@ +// Only print template subst context when it isn't redundant. +// { dg-require-effective-target c++11 } +// { dg-prune-output "error" } + +template<class T> struct A { typedef typename T::type type; }; + +template <class T, class U = typename A<T>::type> +void f(T); + +template <class T, class U = typename T::type> +void g(T); + +int main() +{ + f(1); // { dg-message "required from here" } + g(1); // { dg-bogus "required from here" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum1.C new file mode 100644 index 0000000..7ec5884 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum1.C @@ -0,0 +1,44 @@ +// { dg-do compile { target c++11 } } + +// opaque enum declarations +enum class E1; +enum class E2 : int; +enum class E3 : short; +enum E4 : int; +enum E5 : short; + +// can be repeated +enum class E1; +enum class E2 : int; +enum class E3 : short; +enum E4 : int; +enum E5 : short; + +// are complete so we can declare variables +E1 b1; +E2 b2; +E3 b3; +E4 b4; +E5 b5; + +//even with elaborated-type-specifiers +enum E1 a1; +enum E2 a2; +enum E3 a3; +enum E4 a4; +enum E5 a5; + +// and the list can be added later +enum class E1 { e11, e12 }; +enum class E2 : int { e21, e22 }; +enum class E3 : short {e31, e32 }; +enum E4 : int { e41, e42 }; +enum E5 : short { e51, e52 }; + +// more repetitions allowed +enum class E1; +enum class E2 : int; +enum class E3 : short; +enum E4 : int; +enum E5 : short; + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum10.C new file mode 100644 index 0000000..609c272 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum10.C @@ -0,0 +1,30 @@ +// { dg-do compile { target c++11 } } + +//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-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum11.C new file mode 100644 index 0000000..8cabc03 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum11.C @@ -0,0 +1,23 @@ +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum2.C new file mode 100644 index 0000000..b8f062e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum2.C @@ -0,0 +1,43 @@ +// { dg-do compile { target c++11 } } + +struct S1 +{ + struct S2 + { + // opaque enum declarations + enum class E1; + enum class E2 : int; + enum class E3 : short; + enum E4 : int; + enum E5 : short; + + // can be repeated + enum class E1; + enum class E2 : int; + enum class E3 : short; + enum E4 : int; + enum E5 : short; + }; +}; + +// are complete so we can declare variables +S1::S2::E1 b1; +S1::S2::E2 b2; +S1::S2::E3 b3; +S1::S2::E4 b4; +S1::S2::E5 b5; + +//even with elaborated-type-specifiers +enum S1::S2::E1 a1; +enum S1::S2::E2 a2; +enum S1::S2::E3 a3; +enum S1::S2::E4 a4; +enum S1::S2::E5 a5; + +// and the list can be added later +enum class S1::S2::E1 { e11, e12 }; +enum class S1::S2::E2 : int { e21, e22 }; +enum class S1::S2::E3 : short {e31, e32 }; +enum S1::S2::E4 : int { e41, e42 }; +enum S1::S2::E5 : short { e51, e52 }; + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum3.C new file mode 100644 index 0000000..c8cd6f6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum3.C @@ -0,0 +1,43 @@ +// { dg-do compile { target c++11 } } + +namespace S1 +{ + namespace S2 + { + // opaque enum declarations + enum class E1; + enum class E2 : int; + enum class E3 : short; + enum E4 : int; + enum E5 : short; + + // can be repeated + enum class E1; + enum class E2 : int; + enum class E3 : short; + enum E4 : int; + enum E5 : short; + } +} + +// are complete so we can declare variables +S1::S2::E1 b1; +S1::S2::E2 b2; +S1::S2::E3 b3; +S1::S2::E4 b4; +S1::S2::E5 b5; + +//even with elaborated-type-specifiers +enum S1::S2::E1 a1; +enum S1::S2::E2 a2; +enum S1::S2::E3 a3; +enum S1::S2::E4 a4; +enum S1::S2::E5 a5; + +// and the list can be added later +enum class S1::S2::E1 { e11, e12 }; +enum class S1::S2::E2 : int { e21, e22 }; +enum class S1::S2::E3 : short {e31, e32 }; +enum S1::S2::E4 : int { e41, e42 }; +enum S1::S2::E5 : short { e51, e52 }; + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum4.C new file mode 100644 index 0000000..aee916e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum4.C @@ -0,0 +1,44 @@ +// { dg-do compile { target c++11 } } + +template<typename T> struct S1 +{ + struct S2 + { + // opaque enum declarations + enum class E1; + enum class E2 : T; + enum class E3 : short; + enum E4 : T; + enum E5 : short; + + // can be repeated + enum class E1; + enum class E2 : T; + enum class E3 : short; + enum E4 : T; + enum E5 : short; + }; + + // are complete so we can declare variables + typename S2::E1 b1; + typename S2::E2 b2; + typename S2::E3 b3; + typename S2::E4 b4; + typename S2::E5 b5; + + //even with elaborated-type-specifiers + enum S1::S2::E1 a1; + enum S1::S2::E2 a2; + enum S1::S2::E3 a3; + enum S1::S2::E4 a4; + enum S1::S2::E5 a5; + + // and the list can be added later + enum class S1::S2::E1 { e11, e12 }; + enum class S1::S2::E2 : T { e21, e22 }; + enum class S1::S2::E3 : short {e31, e32 }; + enum S1::S2::E4 : T { e41, e42 }; + enum S1::S2::E5 : short { e51, e52 }; +}; + +template struct S1<int>; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum5.C new file mode 100644 index 0000000..d1d6230 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum5.C @@ -0,0 +1,62 @@ +// { dg-do compile { target c++11 } } + +namespace one +{ + struct S + { + enum { A = 1, B = 2 }; + struct T + { + enum { B = 102 }; + + enum class E1; + enum E2 : int; + }; + }; + + enum class S::T::E1 { A1 = A, B1 = B, C1 }; + enum S::T::E2 : int { A1 = A, B1 = B, C1 }; + + static_assert(int(S::T::E1::A1) == 1, "error"); + static_assert(int(S::T::E1::B1) == 102, "error"); + static_assert(int(S::T::E1::C1) == 103, "error"); + + static_assert(int(S::T::E2::A1) == 1, "error"); + static_assert(int(S::T::E2::B1) == 102, "error"); + static_assert(int(S::T::E2::C1) == 103, "error"); + static_assert(int(S::T::A1) == 1, "error"); + static_assert(int(S::T::B1) == 102, "error"); + static_assert(int(S::T::C1) == 103, "error"); +} + + +namespace two +{ + namespace S + { + enum { A = 1, B = 2 }; + namespace T + { + enum { B = 102 }; + + enum class E1; + enum E2 : int; + } + } + + enum class S::T::E1 { A1 = A, B1 = B, C1 }; + enum S::T::E2 : int { A1 = A, B1 = B, C1 }; + + static_assert(int(S::T::E1::A1) == 1, "error"); + static_assert(int(S::T::E1::B1) == 102, "error"); + static_assert(int(S::T::E1::C1) == 103, "error"); + + static_assert(int(S::T::E2::A1) == 1, "error"); + static_assert(int(S::T::E2::B1) == 102, "error"); + static_assert(int(S::T::E2::C1) == 103, "error"); + static_assert(int(S::T::A1) == 1, "error"); + static_assert(int(S::T::B1) == 102, "error"); + static_assert(int(S::T::C1) == 103, "error"); +} + + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum6.C new file mode 100644 index 0000000..ccce13a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum6.C @@ -0,0 +1,73 @@ +// { dg-do compile { target c++11 } } + +enum class E1 : int; // { dg-error "previous definition" } +enum E1 : int; // { dg-error "scoped/unscoped mismatch" } + +enum E2 : int; // { dg-error "previous definition" } +enum class E2 : int; // { dg-error "scoped/unscoped mismatch" } + +enum struct E3 : int; +enum class E3 : int; //ok + +enum class E4 : int; // { dg-error "previous definition" } +enum class E4 : long; // { dg-error "different underlying type" } + +enum E5 : int; // { dg-error "previous definition" } +enum E5 : long; // { dg-error "different underlying type" } + +enum E6 : int; +enum E6 : int; //ok + +enum class E7; +enum class E7 : int; //ok + +enum class E3 e3; // { dg-error "scoped enum must not use" } +enum struct E3 e4; // { dg-error "scoped enum must not use" } +enum E5 : int e5; // { dg-error "expected|invalid type" } + +enum E6 : int { a, b, c }; // { dg-error "previous definition" } +enum E6 : int { a, b, c }; // { dg-error "multiple definition" } + +enum class E7 { }; // { dg-error "previous definition" } +enum class E7 { a, b, c }; // { dg-error "multiple definition" } + +namespace N1 +{ + struct D; + enum class E6; + enum E7 : int; +} + +enum class N1::E6; // { dg-error "must use a simple identifier" } +enum N1::E6 e6_1; //ok +enum ::N1::E6 e6_2; //ok + +namespace N2 +{ + enum class N1::E6 { e1, e2, e3 }; // { dg-error "does not enclose" } + enum N1::E7 : int { e1, e2, e3 }; // { dg-error "does not enclose" } +} + +enum class N1::E6 { e1, e2, e3 }; +enum N1::E7 : int { e1, e2, e3 }; + +struct S1 +{ + struct D; + enum class E6; + enum E7 : int; +}; + +enum class S1::E6; // { dg-error "must use a simple identifier" } +enum S1::E6 e6_3; //ok +enum ::S1::E6 e6_4; //ok + +struct S2 +{ + enum class S1::E6 { e1, e2, e3 }; // { dg-error "does not enclose" } + enum S1::E7 : int { e1, e2, e3 }; // { dg-error "does not enclose" } +}; + +enum class S1::E6 { e1, e2, e3 }; +enum S1::E7 : int { e1, e2, e3 }; + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum7.C new file mode 100644 index 0000000..3c67f54 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum7.C @@ -0,0 +1,21 @@ +// { dg-do compile { target c++11 } } +// { dg-options "" } + +template<typename T> struct S1 +{ + enum E1 : int; + enum E1 : T; + enum class E2 : int; + enum class E2 : T; +}; + +template<typename T> enum S1<T>::E1 : int { e1 }; +template<typename T> enum class S1<T>::E2 : T { e2 }; + +S1<int>::E1 x1 = S1<int>::e1; +S1<int>::E1 x11 = S1<int>::E1::e1; +S1<int>::E2 x2 = S1<int>::E2::e2; + +enum S1<int>::E1 ex1 = S1<int>::e1; +enum S1<int>::E1 ex11 = S1<int>::E1::e1; +enum S1<int>::E2 ex2 = S1<int>::E2::e2; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum8.C new file mode 100644 index 0000000..5174226 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum8.C @@ -0,0 +1,25 @@ +// { dg-do compile { target c++11 } } + +//This instatiation is ok +template<typename T> struct S1 +{ + enum E : int; + enum E : T; +}; +template struct S1<int>; //ok + +//This error is diagnosed at instantiation time +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 "required from here" } + +//This error is diagnosed at compilation time +template<typename T> struct S3 +{ + enum E : int; // { dg-error "previous definition" } + enum E : short; // { dg-error "different underlying type" } +}; + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum9.C new file mode 100644 index 0000000..4f1475a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/forw_enum9.C @@ -0,0 +1,21 @@ +// { dg-do compile { target c++11 } } +// { dg-options "" } + +template<typename T> struct S1 +{ + enum E1 : int; + enum class E2 : int; +}; + +template<typename T> enum S1<T>::E1 : int { e1 }; +template<typename T> enum class S1<T>::E2 : T { e2 }; + +template<> enum S1<int>::E1 : int { i1 }; +template<> enum class S1<int>::E2 : int { i2 }; + +S1<char>::E1 xci = S1<char>::e1; +S1<int>::E1 xi1 = S1<int>::i1; + +S1<char>::E2 xc2 = S1<char>::E2::e2; +S1<int>::E2 xi2 = S1<int>::E2::i2; + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/friend1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/friend1.C new file mode 100644 index 0000000..ae2c603 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/friend1.C @@ -0,0 +1,22 @@ +// From N1791 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/friend2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/friend2.C new file mode 100644 index 0000000..c4df8a0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/friend2.C @@ -0,0 +1,40 @@ +// PR c++/47721 +// { dg-do compile { target c++11 } } + +// 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-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-1.C new file mode 100644 index 0000000..a55698c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-1.C @@ -0,0 +1,3 @@ +// { dg-do compile { target c++11 } } + +int **** [[gnu::format(printf, 1, 2)]] foo(const char *, ...); // { dg-warning "ignored" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-10.C new file mode 100644 index 0000000..cac568e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-10.C @@ -0,0 +1,9 @@ +// PR c++/12795 +// { dg-do compile { target c++11 } } +// { dg-require-alias "" } + +void foo() +{ + extern void bar [[gnu::__alias__ ("BAR")]] (); // { dg-warning "ignored" } + bar (); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-11.C new file mode 100644 index 0000000..504b456 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-11.C @@ -0,0 +1,17 @@ +// { dg-do compile { target c++11 } } +// PR c++/13791 + +template <typename T> struct O { + struct [[gnu::packed]] I { + int i; + char c; + }; + + I* foo(); +}; + +template <typename T> +typename O<T>::I* +O<T>::foo() { return 0; } + +template class O<int>; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-12.C new file mode 100644 index 0000000..504b456 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-12.C @@ -0,0 +1,17 @@ +// { dg-do compile { target c++11 } } +// PR c++/13791 + +template <typename T> struct O { + struct [[gnu::packed]] I { + int i; + char c; + }; + + I* foo(); +}; + +template <typename T> +typename O<T>::I* +O<T>::foo() { return 0; } + +template class O<int>; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-13.C new file mode 100644 index 0000000..a1b4a84 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-13.C @@ -0,0 +1,5 @@ +// { dg-do compile { target c++11 } } +// PR c++/13854 + +extern char *rindex [[gnu::__pure__]] (__const char *__s, int __c) throw (); +extern char *rindex [[gnu::__pure__]] (__const char *__s, int __c) throw (); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-14.C new file mode 100644 index 0000000..d646d27 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-14.C @@ -0,0 +1,14 @@ +// { dg-do compile { target c++11 } } +// PR c++/13170 +// The bogus attribute is ignored, but was in TYPE_ATTRIBUTES during +// parsing of the class, causing some variants to have it and some not. + +struct [[gnu::bogus]] A // { dg-warning "ignored" "" } +{ + virtual ~A(); + void foo(const A&); + void bar(const A&); +}; + +void A::foo(const A&) {} +void A::bar(const A& a) { foo(a); } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-15.C new file mode 100644 index 0000000..bf05dbe --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-15.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } +// PR c++/15317 + +struct A +{ + A(char); +}; +A::A([[gnu::unused]] char i2) +{} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-16.C new file mode 100644 index 0000000..4adefdb --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-16.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } +// Origin: <rguenth at tat dot physik dot uni-tuebingen dot de> +// PR c++/10479: use of non dependent expressions in attributes in templates + +template <int i> +struct foo2 { + float bar [[gnu::aligned(alignof(double))]]; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-17.2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-17.2.C new file mode 100644 index 0000000..636f9a9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-17.2.C @@ -0,0 +1,19 @@ +// { dg-do compile { target c++11 } } +// Origin: Benjamin Kosnik <bkoz at gcc dot gnu dot org> +// PR c++/17743: Attributes applied to typedefs. + +struct A { + typedef char layout_type[sizeof(double)] + [[gnu::aligned(alignof(double)]]); // { dg-error "expected" } + layout_type data; +}; + +struct B { + typedef char layout_type[sizeof(double)]; + layout_type data [[gnu::aligned(alignof(double))]]; +}; + +template<bool> struct StaticAssert; +template<> struct StaticAssert<true> {}; + +StaticAssert<alignof(A) == alignof(B)> a1;// { dg-error "incomplete type and cannot be defined" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-17.C new file mode 100644 index 0000000..566461b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-17.C @@ -0,0 +1,19 @@ +// { dg-do compile { target c++11 } } +// Origin: Benjamin Kosnik <bkoz at gcc dot gnu dot org> +// PR c++/17743: Attributes applied to typedefs. + +struct A { + typedef char layout_type[sizeof(double)] + [[gnu::aligned(alignof(double))]]; + layout_type data; +}; + +struct B { + typedef char layout_type[sizeof(double)]; + layout_type data [[gnu::aligned(alignof(double))]]; +}; + +template<bool> struct StaticAssert; +template<> struct StaticAssert<true> {}; + +StaticAssert<alignof(A) == alignof(B)> a1; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-18.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-18.C new file mode 100644 index 0000000..3df13e6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-18.C @@ -0,0 +1,10 @@ +// PR c++/17542 +// Test that we warn when an attribute preceding the class-key is ignored. +// { dg-do compile { target c++11 } } + +[[gnu::packed]] struct A // { dg-warning "attribute" } +{ + char c; + int x; + void f(); +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-19.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-19.C new file mode 100644 index 0000000..5ac93d8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-19.C @@ -0,0 +1,11 @@ +// PR c++/19739 +// { dg-do compile { target c++11 } } + +void Dummy() [[ , ]]; +void Dummy() {} + +int main (int argc, char **argv) +{ + Dummy(); + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-2-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-2-1.C new file mode 100644 index 0000000..2f47b32 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-2-1.C @@ -0,0 +1,3 @@ +// { dg-do compile { target c++11 } } + +struct [[gnu::unused]] A {}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-2.C new file mode 100644 index 0000000..8c777c1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-2.C @@ -0,0 +1,11 @@ +// { dg-do compile { target c++11 } } + +struct [[gnu::packed]] A +{ + void f () const; +}; + +void +A::f () const +{ +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-20.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-20.C new file mode 100644 index 0000000..f989ab2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-20.C @@ -0,0 +1,22 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-g" } +// Origin: <jan at etpmod dot phys dot tue dot nl> +// PR c++/19508: avoid attributes for template parameters + +template <typename T> +struct BVector +{ + typedef T T2; + typedef T value_type [[gnu::aligned(8)]]; // { dg-bogus "attribute" "attribute" } + typedef T2 value_type2 [[gnu::aligned(8)]]; // { dg-bogus "attribute" "attribute" } + value_type v; +}; +BVector<int> m; + +template <template <class> class T> +struct BV2 +{ + typedef T<float> value_type [[gnu::aligned(8)]]; // { dg-bogus "attribute" "attribute" } + value_type v; +}; +BV2<BVector> m2; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-21.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-21.C new file mode 100644 index 0000000..2d5ad04 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-21.C @@ -0,0 +1,21 @@ +// PR c++/20763 +// { dg-do compile { target c++11 } } + +typedef void *voidp; + +struct S +{ + char a; + voidp b [[gnu::aligned (16)]]; +}; + +struct T +{ + char a; + void * b [[gnu::aligned (16)]]; +}; + +static_assert (sizeof (S) == sizeof (T), + "struct S and T should have the same size"); + +static_assert (sizeof (S) == 32, "sizeof (S) == 8 + 16 + 8"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-22.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-22.C new file mode 100644 index 0000000..4c07df9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-22.C @@ -0,0 +1,7 @@ +// PR c++/27648 +// { dg-do compile { target c++11 } } + +void f() +{ + static_cast<float *[[gnu::unused]]>(0); // { dg-warning "ignored" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-23.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-23.C new file mode 100644 index 0000000..57ea6b8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-23.C @@ -0,0 +1,11 @@ +// PR c++/28112 +// { dg-do compile { target c++11 } } + +int i [[gnu::init_priority(;)]]; // { dg-error "before" } +int j [[gnu::vector_size(;)]]; // { dg-error "before" } +int k [[gnu::visibility(;)]]; // { dg-error "before" } +struct A {} [[gnu::aligned(;)]]; // { dg-error "before" } +struct B {} [[gnu::mode(;)]]; // { dg-error "before" } +void foo() [[gnu::alias(;)]]; // { dg-error "before" } +void bar() [[gnu::nonnull(;)]]; // { dg-error "before" } +void baz() [[gnu::section(;)]]; // { dg-error "before" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-24.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-24.C new file mode 100644 index 0000000..e1f26c3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-24.C @@ -0,0 +1,4 @@ +// PR c++/28387 +// { dg-do compile { target c++11 } } + +enum [[gnu::unused]] E; // { dg-error "without previous declaration" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-25.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-25.C new file mode 100644 index 0000000..09486d6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-25.C @@ -0,0 +1,12 @@ +// PR c++/28559 +// { dg-do compile { target c++11 } } + +template<typename T> struct A +{ + struct B; +}; + +struct C +{ + template<typename T> friend struct [[gnu::packed]] A<T>::B; // { dg-warning "uninstantiated" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-26.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-26.C new file mode 100644 index 0000000..00069b8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-26.C @@ -0,0 +1,15 @@ +// PR c++/28659 +// The attribute was causing us to get confused in merge_types when +// combining the template type with an uninstantiated version. +// { dg-do compile { target c++11 } } + +template<class T> +struct [[gnu::aligned(1)]] A +{ + A& operator=(const A &t); +}; + +template<class T> +A<T>& A<T>::operator=(const A<T> &t) +{ +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-27.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-27.C new file mode 100644 index 0000000..e38d8d3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-27.C @@ -0,0 +1,6 @@ +//PR c++/29980 +// { dg-do compile { target c++11 } } + +struct A { typedef int X; }; // { dg-message "previous declaration" } + +struct [[gnu::unused]] A::X; // { dg-error "typedef-name" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-28.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-28.C new file mode 100644 index 0000000..94f1756 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-28.C @@ -0,0 +1,13 @@ +// PR c++/28558 +// { dg-options "" } +// { dg-do compile { target c++11 } } + +struct A +{ + A(int) { } +}; + +int main() +{ + A a = (A [[gnu::unused]])0; // { dg-warning "attribute" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-29.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-29.C new file mode 100644 index 0000000..f3da452 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-29.C @@ -0,0 +1,10 @@ +// PR c++/33506 +// { dg-do compile { target c++11 } } + +extern int f1 [[gnu::warn_unused_result]] (char *) ; +extern int f2 [[gnu::warn_unused_result]] (char *) throw () ; +extern int f2 (char *) throw (); + +extern int f3 [[gnu::nonnull (1)]] (char *) ; +extern int f4 [[gnu::nonnull (1)]] (char *) throw (); +extern int f4 (char *) throw (); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-3.C new file mode 100644 index 0000000..edd1067 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-3.C @@ -0,0 +1,22 @@ +// Test that attributes work in a variety of situations. +// { dg-options "-O -ftrack-macro-expansion=0" } +// { dg-do run { target c++11 } } + +#define attrib [[gnu::mode (QI)]] +#define gnu_attrib __attribute((mode (QI))) + +attrib signed int a; +static unsigned int b attrib; + +int foo(attrib int o) +{ + return (sizeof (a) != 1 + || sizeof (b) != 1 + || sizeof (o) != 1 + || sizeof ((gnu_attrib signed int) b) != 1); +} + +int main () +{ + return foo (42); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-30.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-30.C new file mode 100644 index 0000000..537dec5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-30.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } +// PR c++/35074 + +template<typename T> struct A +{ + void foo() const; +} [[gnu::aligned(4)]]; // { dg-warning "ignored" } + +template<typename T> void A<T>::foo() const {} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-31.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-31.C new file mode 100644 index 0000000..ab58e6e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-31.C @@ -0,0 +1,16 @@ +// PR c++/35097 +// { dg-do compile { target c++11 } } + +template<int> struct A; + +template<> struct A<0> +{ + typedef int X [[gnu::aligned(4)]]; +}; + +template<typename T> void foo(const A<0>::X&, T); + +void bar() +{ + foo(A<0>::X(), 0); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-32.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-32.C new file mode 100644 index 0000000..6a1b235 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-32.C @@ -0,0 +1,37 @@ +// PR c++/35315 +// { dg-do compile { target c++11 } } + +typedef union { int i; } U [[gnu::transparent_union]]; // { dg-warning "ignored" } + +static void foo(U) {} +static void foo(int) {} + +void bar() +{ + foo(0); +} + +typedef union U1 { int i; } U2 [[gnu::transparent_union]]; // { dg-warning "ignored" } + +static void foo2(U1) {} // { dg-message "previously defined" } +static void foo2(U2) {} // { dg-error "redefinition" } + +void bar2(U1 u1, U2 u2) +{ + foo2(u1); + foo2(u2); +} + +// PR c++/36410 +struct A +{ + typedef union [[gnu::transparent_union]] + { + int i; + } B; +}; + +void foo(A::B b) +{ + b.i; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-33.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-33.C new file mode 100644 index 0000000..efb2a1a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-33.C @@ -0,0 +1,19 @@ +// PR c++/35546 +// { dg-do compile { target c++11 } } +// { dg-options "-g" } + +template <int N> +struct T +{ + void foo [[gnu::format (printf,2,3)]] (char const * ...); +}; + +template struct T<3>; + +template <typename T> +struct U +{ + typedef T V [[gnu::mode (SI)]]; +}; + +U<int>::V v; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-34.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-34.C new file mode 100644 index 0000000..ae8e990 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-34.C @@ -0,0 +1,19 @@ +// PR c/37171 +// { dg-do compile { target c++11 } } +// { dg-options "-O2 -fdump-tree-optimized" } + +unsigned int f1 [[gnu::const]] (); +unsigned int f2 [[gnu::__const]] () ; +unsigned int f3 [[gnu::__const__]] () ; + +unsigned int f4 () +{ + return f1 () + f1 () + f1 () + f1 () + + f2 () + f2 () + f2 () + f2 () + + f3 () + f3 () + f3 () + f3 (); +} + +// { dg-final { scan-tree-dump-times "= f1 \\(\\)" 1 "optimized" } } +// { dg-final { scan-tree-dump-times "= f2 \\(\\)" 1 "optimized" } } +// { dg-final { scan-tree-dump-times "= f3 \\(\\)" 1 "optimized" } } +// { dg-final { cleanup-tree-dump "optimized" } } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-35.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-35.C new file mode 100644 index 0000000..ccae6f0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-35.C @@ -0,0 +1,21 @@ +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { dg-require-effective-target c++11 } +// { dg-options "-O3 -msse2" } +// { dg-require-effective-target sse2 } + +// You can make NON-template typedefs with a large alignment. +typedef double AlignedDoubleType [[gnu::aligned(16)]]; + +template <typename RealType> +RealType f(const RealType* p) +{ + // But if you use a template parameter it complains. + typedef RealType AlignedRealType [[gnu::aligned(16)]]; + + return p[0]; +} + +double f2(const double* p) +{ + return f<double>(p); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-36-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-36-1.C new file mode 100644 index 0000000..2aae9ca --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-36-1.C @@ -0,0 +1,11 @@ +// { dg-do compile { target c++11 } } + +struct S; + +typedef int (*F [[gnu::warn_unused_result]]) (int); + +typedef int (*F2 [[gnu::warn_unused_result]]) (int); + +typedef int (S::*F3 [[gnu::warn_unused_result]]) (int); // { dg-warning "only applies to function types" } + +typedef int [[gnu::warn_unused_result]] (*F5) (int); // { dg-warning "ignored" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-36.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-36.C new file mode 100644 index 0000000..3f0ef14 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-36.C @@ -0,0 +1,26 @@ +// PR c++/43031 +// { dg-options "-pedantic" } +// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ia32 } } } +// { dg-require-effective-target c++11 } + +// c++11 attributes that apply to types are ignored for now + +class T; +class L { }; +class P : public L +{ + typedef void (T::* [[gnu::__stdcall__]] F2) (L*); // { dg-warning "ignored" } + typedef void (T::*F) (L*) [[gnu::__stdcall__]]; // { dg-warning "ignored" } + void f(bool aAdd); +}; + +class T +{ +public: + virtual void A(L *listener) [[gnu::__stdcall__]] = 0; // { dg-warning "ignored" } + virtual void R(L *listener) [[gnu::__stdcall__]] = 0; // { dg-warning "ignored" } +}; +void P::f(bool aAdd) +{ + F addRemoveEventListener = (aAdd ? &T::A : &T::R); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-37.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-37.C new file mode 100644 index 0000000..59626b2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-37.C @@ -0,0 +1,18 @@ +// PR c++/43093 +// { dg-options "-pedantic" } +// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ia32 } } } +// { dg-require-effective-target c++11 } + +// c++11 attributes that apply to types are ignored for now + +struct S { + int x; + S(const S &s) {} +}; + +S getS() [[gnu::__stdcall__]]; // { dg-warning "ignored" } + +void test() +{ + S s = getS(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-38.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-38.C new file mode 100644 index 0000000..3db981a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-38.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } +// PR c++/36625 + +template <int N> +struct A { + struct S { short f[3]; } [[gnu::aligned (N)]]; // { dg-warning "ignored" } +}; + +int main () +{ + A<4>::S s; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-39-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-39-1.C new file mode 100644 index 0000000..453fc01 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-39-1.C @@ -0,0 +1,10 @@ +// { dg-do compile { target c++11 } } + +int fragile_block(void) { + typedef + [[gnu::aligned (16)]] // { dg-warning "ignored" } + struct { + int i; + } XmmUint16; + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-39.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-39.C new file mode 100644 index 0000000..83fa8b5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-39.C @@ -0,0 +1,10 @@ +// PR debug/43370 +// { dg-do compile { target c++11 } } +// { dg-options "-g" } + +int fragile_block(void) { + typedef struct [[gnu::aligned (16)]] { + int i; + } XmmUint16; + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-4.C new file mode 100644 index 0000000..eb585a8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-4.C @@ -0,0 +1,30 @@ +// { dg-options "-Wunused -pedantic-errors" } +// { dg-do compile { target c++11 } } +// Test for syntax support of various attribute permutations. + +int +[[noreturn]] // { dg-warning "ignored" } +one +[[gnu::unused]] +(void); + +int one_third [[noreturn]] [[gnu::unused]] (void); + +int [[gnu::unused]] one_half(); // { dg-warning "ignored" } + +static +[[noreturn]] // { dg-warning "ignored" } +void two [[gnu::unused]] (void) {} + + + +[[gnu::unused]] +int +five(void) +[[noreturn]] // { dg-warning "ignored" } +{} + +[[noreturn]] +void +six (void) +; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-40.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-40.C new file mode 100644 index 0000000..f3ccb72 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-40.C @@ -0,0 +1,5 @@ +// PR c++/46803 +// { dg-do compile { target c++11 } } + +int strftime(char *, int, const char *, const struct tm *) + [[gnu::__bounded__(__string__,1,2)]]; // { dg-warning "ignored" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-41.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-41.C new file mode 100644 index 0000000..6e47a1e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-41.C @@ -0,0 +1,20 @@ +// PR c++/45267 +// { dg-do compile { target c++11 } } +// { dg-options "-O" } + +template<typename T> struct Vector { + Vector(long long x); + inline Vector<T> operator<< [[gnu::always_inline]] (int x) const; +}; +long long bar (long long); +template<> inline Vector<int> Vector<int>::operator<<(int x) const { + return bar(x); +} +bool b; +int main() { + Vector<int> a(1); + if ((a << 2), b) { + a << 2; + throw 1; + } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-42.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-42.C new file mode 100644 index 0000000..ec98ece --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-42.C @@ -0,0 +1,14 @@ +// { dg-options "-pedantic" } +// { dg-do compile { target { i?86-*-* && ilp32 } } } +// { dg-require-effective-target c++11 } + +struct A { + [[gnu::fastcall]] + void f(); +}; + +int main() +{ + typedef void (A::*FP)(); + FP fp[] = {&A::f}; // { dg-error "cannot convert" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-43.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-43.C new file mode 100644 index 0000000..c850622 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-43.C @@ -0,0 +1,4 @@ +// { dg-do compile { target c++11 } } +template <class T> struct A { }; + +template [[gnu::packed]] struct A<int>; // { dg-warning "ignored in explicit instantiation" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-44.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-44.C new file mode 100644 index 0000000..81d70e5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-44.C @@ -0,0 +1,3 @@ +// PR c++/52671 +// { dg-do compile { target c++11 } } +[[gnu::deprecated]] enum E { E0 }; // { dg-warning "ignored in declaration" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-45.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-45.C new file mode 100644 index 0000000..573a1ab --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-45.C @@ -0,0 +1,4 @@ +// PR c++/52906 +// { dg-do compile { target c++11 } } + +[[gnu::deprecated]]; // { dg-error "does not declare anything" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-46.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-46.C new file mode 100644 index 0000000..53fcb77 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-46.C @@ -0,0 +1,5 @@ +// PR c++/40821 +// { dg-do compile { target c++11 } } + +struct [[gnu::aligned(8)] S1 { int i; }; // { dg-error "" } +struct [aligned(8) S2 { int i; }; // { dg-error "" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-47-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-47-1.C new file mode 100644 index 0000000..4a5d73a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-47-1.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } +int +foo () +{ + int i [[and, bitor, xor_eq, compl, bitand]]; // { dg-warning "ignored" } + i = 0; + return i; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-47.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-47.C new file mode 100644 index 0000000..af74abd --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-47.C @@ -0,0 +1,13 @@ +// { dg-do compile { target c++11 } } +// Example taken from dcl.attr.grammar: + +int p[10]; +void f() +{ + int x = 42, y[5]; + /* Here, the '[[' should have introduced an attribute, on a + lambda invocation an array subscripting expression. */ + int(p[[x] { return x; }()]); // { dg-error "expected|consecutive" } + /* Likewise, the '[[gnu::' is invalid here. */ + y[[] { return 2; }()] = 2; // { dg-error "expected|consecutive" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-48-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-48-2.C new file mode 100644 index 0000000..3cc5897 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-48-2.C @@ -0,0 +1,4 @@ +// Origin: PR c++/54955 +// { dg-do compile { target c++11 } } + +alignas(double) int f; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-48.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-48.C new file mode 100644 index 0000000..360c093 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-48.C @@ -0,0 +1,17 @@ +// { dg-do compile { target c++11 } } + +typedef char layout_type; + +struct A { + layout_type member alignas (double); +}; + +static_assert (alignof (A) == alignof (double), + "alignment of struct A must be alignof (double)"); + +struct alignas (alignof (long double)) B { + layout_type member; +}; + +static_assert (alignof (B) == alignof (long double), + "alignment of struct A must be alignof (double double)"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-49.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-49.C new file mode 100644 index 0000000..8b68f92 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-49.C @@ -0,0 +1,17 @@ +// { dg-do compile { target c++11 } } + +typedef char layout_type; + +template<class> struct A { + layout_type member alignas (double); +}; + +static_assert (alignof (A<int>) == alignof (double), + "alignment of struct A must be alignof (double)"); + +template<class> struct alignas (alignof (long double)) B { + layout_type member; +}; + +static_assert (alignof (B<int>) == alignof (long double), + "alignment of struct A must be alignof (double double)"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-5.C new file mode 100644 index 0000000..83de121 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-5.C @@ -0,0 +1,23 @@ +// { dg-do compile { target c++11 } } +// +// There were two related problems here, depending on the vintage. At +// one time: +// +// typedef struct A { ... } A [[gnu::aligned (16)]]; +// +// would cause original_types to go into an infinite loop. At other +// times, the attributes applied to an explicit typedef would be lost +// (check_b3 would have a negative size). + +// First check that the declaration is accepted and has an effect. +typedef struct A { int i; } A [[gnu::aligned (16)]]; +int check_A[alignof (A) >= 16 ? 1 : -1]; + +// Check that the alignment is only applied to the typedef. +struct B { int i; }; +struct B b1; +typedef struct B B [[gnu::aligned (16)]]; +struct B b2; +B b3; +int check_b1[__alignof__ (b1) == __alignof__ (b2) ? 1 : -1]; +int check_b3[__alignof__ (b3) >= 16 ? 1 : -1]; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-50.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-50.C new file mode 100644 index 0000000..2479dfd --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-50.C @@ -0,0 +1,22 @@ +// { dg-do compile { target c++11 } } + +typedef char layout_type; + +template<class> struct A { + layout_type member alignas (double) alignas (int); +}; + +// Here, the spec says that A<int> should have the stricter alignment, +// so that would be the alignment of 'double', not 'int'. +static_assert (alignof (A<int>) == alignof (double), + "alignment of struct A must be alignof (double)"); + +template<class> struct alignas (1) alignas (alignof (long double)) B { + layout_type member; +}; + +// Similarly, the B<int> should have the stricter alignment, so that would +// so that would be the alignment of 'long double', not '1'. +static_assert (alignof (B<int>) == alignof (long double), + "alignment of struct A must be alignof (double double)"); + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-51.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-51.C new file mode 100644 index 0000000..f2b6602 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-51.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +typedef char layout_type; +struct A +{ + layout_type member [[gnu::aligned (16)]]; +}; + +static_assert (sizeof (A) == 16, "Alignment should be 16"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-52.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-52.C new file mode 100644 index 0000000..0f87fd4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-52.C @@ -0,0 +1,21 @@ +// { dg-do compile { target c++11 } } + +struct A {int i;} a [[gnu::aligned(16)]]; +struct B {int i;} __attribute__((aligned(16))) b; + +int +main () +{ + A aa; + B bb; + + static_assert (sizeof (a) == 4, "sizeof (a) should be 4"); + static_assert (sizeof (b) == 16, "sizeof (b) should be 16"); + static_assert (sizeof (aa) == 4, "sizeof (aa) should be 4"); + static_assert (sizeof (bb) == 16, "sizeof (bb) should be 16"); + + static_assert (__alignof__ (a) == 16, "alignof (a) should be 16"); + static_assert (__alignof__ (b) == 16, "alignof (b) should be 16"); + static_assert (__alignof__ (aa) == 4, "alignof (aa) should be 4"); + static_assert (__alignof__ (bb) == 16, "alignof (bb) should be 16"); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-53.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-53.C new file mode 100644 index 0000000..723c8ef --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-53.C @@ -0,0 +1,39 @@ +// { dg-do compile { target c++11 } } + +int +toto () +{ + [[gnu::unused]] good: + return 0; +} + +int +foo () +{ + [[gnu::unused]] good: + int i = 0; + + // A C++11 attribute at the beginning of the return statement is + // syntactically correct, appertains to the return statement (not to + // the label) but is currently ignored by this implementation. + good_ignored : [[gnu::unused]] // { dg-warning "attributes at the beginning of statement are ignored" } + return i; +} + +int +bar () +{ + // A GNU attribute after the label appertains to the label. + good: __attribute__((unused)); + return 0; +} + +int +baz () +{ + // The c++ attribute after the label appertains to the (empty) + // statement. + bad: [[gnu::unused]]; // { dg-warning "attributes at the beginning of statement are ignored" } + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-54.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-54.C new file mode 100644 index 0000000..45aa8e4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-54.C @@ -0,0 +1,14 @@ +// PR c++/56859 +// { dg-require-effective-target c++11 } + +template<unsigned size, unsigned alignment> +struct aligned_storage +{ + using type = struct { alignas(alignment) unsigned char data[size]; }; +}; + +#define SA(X) static_assert((X),#X) +SA(alignof(aligned_storage<8,1>::type) == 1); +SA(alignof(aligned_storage<8,2>::type) == 2); +SA(alignof(aligned_storage<8,4>::type) == 4); +SA(alignof(aligned_storage<8,8>::type) == 8); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-55.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-55.C new file mode 100644 index 0000000..c4e6dea --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-55.C @@ -0,0 +1,12 @@ +// PR c++/58584 +// { dg-do compile { target c++11 } } + +struct A +{ + int i alignas(this); // { dg-error "17:invalid use of 'this'" } +}; + +template<int> struct B +{ + int j alignas(this); // { dg-error "17:invalid use of 'this'" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-56.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-56.C new file mode 100644 index 0000000..f331ed3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-56.C @@ -0,0 +1,5 @@ +// PR c++/58724 +// { dg-do compile { target c++11 } } + +namespace foo __attribute__((visibility("default"))) {} +namespace bar [[gnu::visibility("default")]] {} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-57.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-57.C new file mode 100644 index 0000000..12b4f4c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-57.C @@ -0,0 +1,9 @@ +// PR c++/59096 +// { dg-do compile { target c++11 } } + +template<typename T> struct A +{ + typedef T B [[mode]]; // { dg-warning "ignored" } +}; + +A<int>::B b; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-6.C new file mode 100644 index 0000000..54071d5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-6.C @@ -0,0 +1,20 @@ +// Copyright (C) 2002 Free Software Foundation. +// +// Test that the nothrow attribute is working correctly. +// +// Written by Richard Henderson, 26 May 2002. + +// { dg-do link { target c++11} } +extern void foo [[gnu::nothrow]] (); +extern void link_error(); + +int main() +{ + try { + foo(); + } catch (...) { + link_error(); + } +} + +void foo() { } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-7.C new file mode 100644 index 0000000..3341250 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-7.C @@ -0,0 +1,4 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-Wunused-parameter" } + +void f (int i [[gnu::__unused__]]) {} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-8.C new file mode 100644 index 0000000..9c834a4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-8.C @@ -0,0 +1,7 @@ +// { dg-options "-pedantic" } +// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ia32 } } } +// { dg-require-effective-target c++11 } + +extern int * ([[gnu::stdcall]] *fooPtr)( void); // { dg-error "expected" } +int * [[gnu::stdcall]] myFn01( void) { return 0; }// { dg-warning "ignored" } + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-9.C new file mode 100644 index 0000000..3dc51ee --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gen-attrs-9.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } + +class C; +struct S; +union U; +enum e {}; +enum [[gnu::unused]] e; // { dg-warning "already defined" } + +struct [[gnu::unused]] B *p; // { dg-warning "attributes" } + +template <class T> struct A { }; +struct [[gnu::unused]] A<int>; // { dg-warning "attributes" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gnu_fext-numeric-literals.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gnu_fext-numeric-literals.C new file mode 100644 index 0000000..6a8398b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gnu_fext-numeric-literals.C @@ -0,0 +1,115 @@ +// { dg-do compile { target c++11 } } +// { dg-options "" } + +// Integer imaginary... + +constexpr unsigned long long +operator"" i(unsigned long long n) // { dg-warning "shadowed by implementation" } +{ return 4 * n + 0; } + +constexpr unsigned long long +operator"" I(unsigned long long n) // { dg-warning "shadowed by implementation" } +{ return 4 * n + 1; } + +constexpr unsigned long long +operator"" j(unsigned long long n) // { dg-warning "shadowed by implementation" } +{ return 4 * n + 2; } + +constexpr unsigned long long +operator"" J(unsigned long long n) // { dg-warning "shadowed by implementation" } +{ return 4 * n + 3; } + +// Floating-point imaginary... + +constexpr long double +operator"" i(long double n) // { dg-warning "shadowed by implementation" } +{ return 4.0L * n + 0.0L; } + +constexpr long double +operator"" I(long double n) // { dg-warning "shadowed by implementation" } +{ return 4.0L * n + 1.0L; } + +constexpr long double +operator"" j(long double n) // { dg-warning "shadowed by implementation" } +{ return 4.0L * n + 2.0L; } + +constexpr long double +operator"" J(long double n) // { dg-warning "shadowed by implementation" } +{ return 4.0L * n + 3.0L; } + +// Fixed-point... + +constexpr long double +operator"" k(long double n) // { dg-warning "shadowed by implementation" } +{ return 4 * (n + 1) + 0; } + +constexpr long double +operator"" K(long double n) // { dg-warning "shadowed by implementation" } +{ return 4 * (n + 1) + 1; } + +constexpr long double +operator"" r(long double n) // { dg-warning "shadowed by implementation" } +{ return 4 * (n + 1) + 2; } + +constexpr long double +operator"" R(long double n) // { dg-warning "shadowed by implementation" } +{ return 4 * (n + 1) + 3; } + +// Machine-defined... + +constexpr long double +operator"" w(long double n) // { dg-warning "shadowed by implementation" } +{ return 4 * (n + 2) + 0; } + +constexpr long double +operator"" W(long double n) // { dg-warning "shadowed by implementation" } +{ return 4 * (n + 2) + 1; } + +constexpr long double +operator"" q(long double n) // { dg-warning "shadowed by implementation" } +{ return 4 * (n + 2) + 2; } + +constexpr long double +operator"" Q(long double n) // { dg-warning "shadowed by implementation" } +{ return 4 * (n + 2) + 3; } + +int +main() +{ + auto ii = 1i; + auto Ii = 1I; + auto ji = 1j; + auto Ji = 1J; + + auto ifp = 1.0i; + auto Ifp = 1.0I; + auto jfp = 1.0j; + auto Jfp = 1.0J; + + auto kfp = 1.0k; // { dg-error "fixed-point types not supported" } + auto Kfp = 1.0K; // { dg-error "fixed-point types not supported" } + auto rfp = 1.0r; // { dg-error "fixed-point types not supported" } + auto Rfp = 1.0R; // { dg-error "fixed-point types not supported" } + + auto wfp = 1.0w; // { dg-error "unsupported" "" { target { ! has_w_floating_suffix } } } + auto Wfp = 1.0W; // { dg-error "unsupported" "" { target { ! has_w_floating_suffix } } } + auto qfp = 1.0q; // { dg-error "unsupported" "" { target { ! has_q_floating_suffix } } } + auto Qfp = 1.0Q; // { dg-error "unsupported" "" { target { ! has_q_floating_suffix } } } +} + +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 7 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 11 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 15 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 19 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 25 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 29 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 33 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 37 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 43 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 47 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 51 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 55 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 61 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 65 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 69 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 73 } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gnu_fno-ext-numeric-literals.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gnu_fno-ext-numeric-literals.C new file mode 100644 index 0000000..c738a48 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/gnu_fno-ext-numeric-literals.C @@ -0,0 +1,115 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-fno-ext-numeric-literals" } + +// Integer imaginary... + +constexpr unsigned long long +operator"" i(unsigned long long n) +{ return 4 * n + 0; } + +constexpr unsigned long long +operator"" I(unsigned long long n) +{ return 4 * n + 1; } + +constexpr unsigned long long +operator"" j(unsigned long long n) +{ return 4 * n + 2; } + +constexpr unsigned long long +operator"" J(unsigned long long n) +{ return 4 * n + 3; } + +// Floating-point imaginary... + +constexpr long double +operator"" i(long double n) +{ return 4.0L * n + 0.0L; } + +constexpr long double +operator"" I(long double n) +{ return 4.0L * n + 1.0L; } + +constexpr long double +operator"" j(long double n) +{ return 4.0L * n + 2.0L; } + +constexpr long double +operator"" J(long double n) +{ return 4.0L * n + 3.0L; } + +// Fixed-point... + +constexpr long double +operator"" k(long double n) +{ return 4 * (n + 1) + 0; } + +constexpr long double +operator"" K(long double n) +{ return 4 * (n + 1) + 1; } + +constexpr long double +operator"" r(long double n) +{ return 4 * (n + 1) + 2; } + +constexpr long double +operator"" R(long double n) +{ return 4 * (n + 1) + 3; } + +// Machine-defined... + +constexpr long double +operator"" w(long double n) +{ return 4 * (n + 2) + 0; } + +constexpr long double +operator"" W(long double n) +{ return 4 * (n + 2) + 1; } + +constexpr long double +operator"" q(long double n) +{ return 4 * (n + 2) + 2; } + +constexpr long double +operator"" Q(long double n) +{ return 4 * (n + 2) + 3; } + +int +main() +{ + auto ii = 1i; + auto Ii = 1I; + auto ji = 1j; + auto Ji = 1J; + + auto ifp = 1.0i; + auto Ifp = 1.0I; + auto jfp = 1.0j; + auto Jfp = 1.0J; + + auto kfp = 1.0k; + auto Kfp = 1.0K; + auto rfp = 1.0r; + auto Rfp = 1.0R; + + auto wfp = 1.0w; + auto Wfp = 1.0W; + auto qfp = 1.0q; + auto Qfp = 1.0Q; +} + +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 7 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 11 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 15 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 19 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 25 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 29 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 33 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 37 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 43 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 47 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 51 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 55 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 61 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 65 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 69 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 73 } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit-copy.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit-copy.C new file mode 100644 index 0000000..d4cd2e8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit-copy.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } +struct S +{ + S(); +private: + S(S const &&); + S & operator=(S const &&); +}; + +void f() +{ + S a; + S b(a); // { dg-error "deleted" } + a = b; // { dg-error "deleted" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit-trivial1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit-trivial1.C new file mode 100644 index 0000000..23921c7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit-trivial1.C @@ -0,0 +1,23 @@ +// PR c++/46807 +// { dg-do compile { target c++11 } } +// In C++98/03, B::B(const B&) is trivial because A::A(const A&) is trivial, +// even though doing overload resolution would mean calling the template +// constructor. In C++11, we do overload resolution to determine triviality. + +struct A +{ + A() {} +private: + template <class T> A(T&); // { dg-error "private" } +}; + +struct B // { dg-error "implicitly deleted|this context" } +{ + mutable A a; +}; + +int main() +{ + B b; + B b2(b); // { dg-error "deleted" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit1.C new file mode 100644 index 0000000..7eb3371 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit1.C @@ -0,0 +1,26 @@ +// Test for implicitly deleted destructors. +// { dg-do compile { target c++11 } } +// { dg-prune-output "default definition would be ill-formed" } +// { dg-prune-output "within this context" } + +class C +{ + void operator delete (void *); // { dg-error "private" } +public: + virtual ~C(); // { dg-error "overriding" } +}; + +struct D: C { }; // { dg-error "deleted" } +D d; // { dg-error "deleted" } + +struct E +{ + ~E() = delete; // { dg-message "declared here" } +}; + +struct F +{ + virtual ~F(); // { dg-error "overriding" } +}; + +struct G: E, F { }; // { dg-error "deleted" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit10.C new file mode 100644 index 0000000..6a0c711 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit10.C @@ -0,0 +1,19 @@ +// PR c++/46103 +// { dg-do compile { target c++11 } } + +struct MoveOnly { + MoveOnly(const MoveOnly&) = delete; + MoveOnly(MoveOnly&&) { } + MoveOnly() = default; +}; + +struct A { + MoveOnly mo[1]; + A() = default; + A(A&&) = default; +}; + +int main() { + A a; + A aa = static_cast<A&&>(a); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit11.C new file mode 100644 index 0000000..3471ad9 --- /dev/null +++ b/gcc-4.9/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-do compile { target c++11 } } + +struct A +{ + ~A() = delete; // { dg-message "declared here" } +}; + +struct B: A { }; // { dg-error "deleted" } + +extern B eb; +int main() +{ + B* b1 = new B; // { dg-error "use of deleted function" } + B* b2 = new B(eb); // { dg-error "use of deleted function" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit12.C new file mode 100644 index 0000000..d52f153 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit12.C @@ -0,0 +1,54 @@ +// PR c++/50500 +// { dg-do compile { target c++11 } } + +// 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-4.9/gcc/testsuite/g++.dg/cpp0x/implicit13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit13.C new file mode 100644 index 0000000..3165863 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/implicit14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit14.C new file mode 100644 index 0000000..8a56244 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/implicit2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit2.C new file mode 100644 index 0000000..2995894 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit2.C @@ -0,0 +1,32 @@ +// Test that the synthesized C copy constructor calls the A template +// constructor and has the appropriate exception specification. +// { dg-do run { target c++11 } } + +int r = 1; + +struct A +{ + A() {} + A(const A&) throw () { } + template <class T> + A(T& t) { r = 0; } +}; + +struct B +{ + B() {} + B(B&) throw () { } +}; + +struct C: A, B { }; + +#define SA(E) static_assert(E, #E) + +C c; +SA (!noexcept(C(c))); + +int main() +{ + (C(c)); + return r; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit3.C new file mode 100644 index 0000000..8176a6e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit3.C @@ -0,0 +1,55 @@ +// Basic runtime test for implicit move constructor +// { dg-do run { target c++11 } } + +int m; + +struct A +{ + A() = default; + A(A&&) { ++m; } + A& operator=(A&&) { ++m; return *this; } +}; + +struct B +{ + B() = default; + B(const B&); + B(B&&) { ++m; } + B& operator=(const B&); + B& operator=(B&&) { ++m; return *this; } +}; + +struct C +{ + C() = default; + C(C&); + C(C&&) { ++m; } + C& operator=(C&); + C& operator=(C&&) { ++m; return *this; } +}; + +struct D: public A, public B +{ + C c; + int i; +}; + +struct E: public A, public B +{ + C c; + int i; + E() = default; + E(E&&) = default; + E& operator=(E&&) = default; +}; + +int main() +{ + D d1; + D d2 (static_cast<D&&>(d1)); + d1 = static_cast<D&&>(d2); + E e1; + E e2 (static_cast<E&&>(e1)); + e1 = static_cast<E&&>(e2); + return m != 12; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit4.C new file mode 100644 index 0000000..eeb4aa9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit4.C @@ -0,0 +1,20 @@ +// Test that a base with only a move constructor causes the implicit copy +// constructor to be deleted. +// { dg-do compile { target c++11 } } + +struct A // { dg-message "declares a move" } +{ + A(); + A(A&&); +}; + +struct B: A // { dg-error "use of deleted" } +{ +}; + +int main() +{ + B b1; + B b2(b1); // { dg-error "deleted function .B::B.const" } + B b3(static_cast<B&&>(b1)); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit5.C new file mode 100644 index 0000000..f9ae535 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit5.C @@ -0,0 +1,19 @@ +// Test that the default B copy constructor calls the deleted A +// copy constructor. +// { dg-do compile { target c++11 } } + +struct A // { dg-message "declares a move" } +{ + A() = default; + A(A&&) = default; + template <class T> + A(const T& t) { t.i; } +}; + +struct B: A { }; // { dg-error "implicitly|use of deleted" } + +int main() +{ + B b; + B b2(b); // { dg-error "deleted" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit6.C new file mode 100644 index 0000000..d3e85d0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit6.C @@ -0,0 +1,23 @@ +// Circular implicit declarations were causing errors +// { dg-do compile { target c++11 } } + +struct Ray; + +struct Vector +{ + virtual void f(); // make non-trivially-copyable + Vector(const Ray &) ; +}; + +struct array +{ + Vector v; +}; + +struct Ray +{ + array a; +}; + +extern Ray r1; +Ray r2=r1; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit7.C new file mode 100644 index 0000000..eaa7d82 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit7.C @@ -0,0 +1,37 @@ +// PR c++/44909 +// { dg-do compile { target c++11 } } +// Declaring A<D<E>>'s copy ctor means choosing a ctor to initialize D<E>, +// which means choosing a ctor for C<B<E>>, which meant considering +// C(const B<E>&) which means choosing a ctor for B<E>, which means choosing +// a ctor for A<D<E>>. Cycle. + +template<typename T> +struct A +{ + T t; +}; + +template <typename T> +struct B +{ + typename T::U u; +}; + +template <typename T> +struct C +{ + C(const T&); +}; + +template <typename T> +struct D +{ + C<B<T> > v; +}; + +struct E { + typedef A<D<E> > U; +}; + +extern A<D<E> > a; +A<D<E> > a2(a); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit8.C new file mode 100644 index 0000000..68575ca --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit8.C @@ -0,0 +1,32 @@ +// The hack for PR c++/44909 breaks this testcase. We need feedback +// from the C++ committee to know how to proceed. +// { dg-do compile { target c++11 } } + +struct A +{ + A(); + A(A&); +}; + +struct B; +struct BP +{ + BP(const B&); +}; + +struct B +{ + B(); + B(B&&); + B(const BP&); +}; + +// If B(B&&) suppresses the B copy constructor, then copying the 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? +// As of DR 1082, it doesn't suppress it. +struct C: A, B { }; // { dg-error "use of deleted" } + +C c; +C c2(c); // { dg-error "deleted" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit9.C new file mode 100644 index 0000000..0952a42 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/implicit9.C @@ -0,0 +1,12 @@ +// Test that private base dtor makes derived ctor deleted +// { dg-do compile { target c++11 } } + +struct A +{ + A(); +private: + ~A(); // { dg-error "private" } +}; + +struct B: A { }; // { dg-error "implicitly deleted|context" } +B * b = new B; // { dg-error "deleted" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor1.C new file mode 100644 index 0000000..c656fb9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor1.C @@ -0,0 +1,17 @@ +// { dg-do compile { target c++11 } } + +struct A +{ + int i; + constexpr A(int i): i(i) {} +}; + +struct B: A +{ + using A::A; +}; + +constexpr B b(42); + +#define SA(X) static_assert((X),#X) +SA(b.i == 42); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor10.C new file mode 100644 index 0000000..48e95a0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor10.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-g" } + +struct A +{ + template <class... Ts> A(Ts...); +}; + +struct B: A +{ + using A::A; +}; + +B b1(42); +B b2(1.0, 42, (void*)0); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor11.C new file mode 100644 index 0000000..228e8ec --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor11.C @@ -0,0 +1,14 @@ +// { dg-do compile { target c++11 } } + +struct A +{ + A(int, ...); // { dg-message "declared here" } +}; + +struct B: A +{ + using A::A; // { dg-warning "ellipsis" } +}; + +B b1(42); +B b2(42, 1.0); // { dg-error "no match" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor12.C new file mode 100644 index 0000000..cc23d4b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor12.C @@ -0,0 +1,25 @@ +// { dg-do run { target c++11 } } + +struct A +{ + int i; + template <class T> + A(T t) noexcept : i(t) {} +}; + +struct C +{ + C() { throw 42; } +}; + +struct B: A, C +{ + using A::A; +}; + +int main() +{ + try { B b(24); } + catch (int) { return 0; } + __builtin_abort(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor13.C new file mode 100644 index 0000000..bd021e6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor13.C @@ -0,0 +1,22 @@ +// { dg-do compile { target c++11 } } + +struct A +{ + int i; + template <class T> A(T t); +}; + +struct C +{ + C() = delete; // { dg-message "declared here" } +}; + +struct B: A, C +{ + using A::A; // { dg-error "C::C" } +}; + +int main() +{ + B b(24); // { dg-error "B::B" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor14.C new file mode 100644 index 0000000..0404880 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor14.C @@ -0,0 +1,10 @@ +// PR c++/55261 +// { dg-do compile { target c++11 } } + +struct A +{ +}; +struct B : A +{ + using A::A; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor15.C new file mode 100644 index 0000000..c2d33bf --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor15.C @@ -0,0 +1,15 @@ +// Discussions on the core reflector indicate that not inheriting base copy +// constructors was a deliberate choice. + +// { dg-do compile { target c++11 } } + +struct A { A(int); }; +struct B: public A +{ + using A::A; +}; + +A a (42); + +B b1 (24); // inherited +B b2 (a); // not inherited { dg-error "no match" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor16.C new file mode 100644 index 0000000..ba6849f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor16.C @@ -0,0 +1,15 @@ +// PR c++/56285 +// { dg-do compile { target c++11 } } + +struct foo { + explicit foo(int&&) {} +}; + +struct bar: private foo { + using foo::foo; +}; + +int main() +{ + bar b { 42 }; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor17.C new file mode 100644 index 0000000..22eda3a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor17.C @@ -0,0 +1,45 @@ +// PR c++/56323 +// { dg-do compile { target c++11 } } + +struct A { + A(int i); +}; + +typedef A B; + +struct C : B { + using B::B; +}; + +struct D : B { + using B::A; +}; + +C c(0); +D d(0); + +template <class T> +struct E { + typedef T type; +}; + +template <class T> +struct F : E<T>::type { + using E<T>::type::type; // error: E<T>::type is a typedef +}; + +F<A> f(0); + +template <class T> +struct AT +{ + AT(T); +}; + +template <template <class> class T> +struct G : T<int> +{ + using T<int>::T; +}; + +G<AT> g(0); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor18.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor18.C new file mode 100644 index 0000000..0573555 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor18.C @@ -0,0 +1,22 @@ +// PR c++/56358 +// { dg-do compile { target c++11 } } + +struct foo { + explicit foo(int) {} +}; + +template<typename T> +struct bar: T { + using T::T; + + // Bad + explicit bar(): T(0) {} + + void baz() + { + // Also bad + using qux = T; + } +}; + +bar<foo> b, b2(42); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor19.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor19.C new file mode 100644 index 0000000..7a22f88 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor19.C @@ -0,0 +1,14 @@ +// PR c++/60389 +// { dg-do compile { target c++11 } } + +struct A +{ + template<typename...T> A(T...) {} +}; + +struct B : A +{ + using A::A; // { dg-error "inherited" } +}; + +constexpr B b; // { dg-error "literal" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor2.C new file mode 100644 index 0000000..15e5657 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor2.C @@ -0,0 +1,19 @@ +// { dg-do compile { target c++11 } } + +struct A +{ + int i; + constexpr A(int, int i = num): i(i) {} +private: + static const int num = 42; +}; + +struct B: A +{ + using A::A; +}; + +constexpr B b(24); + +#define SA(X) static_assert((X),#X) +SA(b.i == 42); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor3.C new file mode 100644 index 0000000..e8dc84d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor3.C @@ -0,0 +1,17 @@ +// { dg-do compile { target c++11 } } + +struct B1 { + B1(int); +}; +struct B2 { + B2(int); +}; +struct D1 : B1, B2 { + using B1::B1; // { dg-error "inherited" } + using B2::B2; // { dg-error "inherited" } +}; // ill-formed: attempts to declare D1(int) twice +struct D2 : B1, B2 { + using B1::B1; + using B2::B2; + D2(int); // OK: user declaration supersedes both implicit declarations +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor4.C new file mode 100644 index 0000000..16dc197 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor4.C @@ -0,0 +1,18 @@ +// From N3337 +// { dg-do compile { target c++11 } } + +struct B1 { + B1(int); +}; +struct B2 { + B2(int = 13, int = 42); +}; +struct D1 : B1 { + using B1::B1; +}; +struct D2 : B2 { + using B2::B2; +}; + +D1 d1(1); +D2 d2a(2), d2b(3,4); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor5.C new file mode 100644 index 0000000..8c79c83 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor5.C @@ -0,0 +1,21 @@ +// { dg-do compile { target c++11 } } + +struct B1 { + B1(int) { } +}; +struct B2 { + B2(double) { } +}; +struct D1 : B1 { // { dg-error "no match" } + using B1::B1; // implicitly declares D1(int) + int x; +}; +void test() { + D1 d(6); // OK: d.x is not initialized + D1 e; // { dg-error "deleted" } D1 has no default constructor +} +struct D2 : B2 { + using B2::B2; // { dg-error "no match" } implicitly declares D2(double) + B1 b; +}; +D2 f(1.0); // { dg-error "deleted" } B1 has no default constructor diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor6.C new file mode 100644 index 0000000..98ac188 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor6.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } + +extern "C" int printf (const char *, ...); +template< class T > +struct D : T { + using T::T; + // declares all constructors from class T + ~D() { printf ("Destroying wrapper\n"); } +}; + +struct A { + A(int); +}; + +D<A> d(42); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor7.C new file mode 100644 index 0000000..280ccfe --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor7.C @@ -0,0 +1,18 @@ +// { dg-do compile { target c++11 } } + +struct A +{ + int i; + template <class T> + constexpr A(T t): i(t) {} +}; + +struct B: A +{ + using A::A; +}; + +constexpr B b(42); + +#define SA(X) static_assert((X),#X) +SA(b.i == 42); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor8.C new file mode 100644 index 0000000..74c9496 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor8.C @@ -0,0 +1,20 @@ +// { dg-do compile { target c++11 } } + +struct A +{ + int i; + explicit A(int i): i(i) {} +}; + +struct B: A +{ + using A::A; +}; + +void f(B); + +int main() +{ + f(B(42)); // OK + f(42); // { dg-error "could not convert" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor9.C new file mode 100644 index 0000000..3975101 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inh-ctor9.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } + +class A +{ + int i; +protected: + A(int i): i(i) {} +}; + +struct B: A +{ + using A::A; // { dg-error "protected" } +}; + +B b(42); // { dg-error "this context" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-array2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-array2.C new file mode 100644 index 0000000..1e25eb2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-array2.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } + +typedef int IA[2]; +typedef double DA[2]; + +void f(const IA&) { } +void f(const DA&); + +int main() +{ + f({1,2}); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-array3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-array3.C new file mode 100644 index 0000000..1a94f4e --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-arrray1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-arrray1.C new file mode 100644 index 0000000..925ab16 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-arrray1.C @@ -0,0 +1,5 @@ +// { dg-do compile { target c++11 } } + +typedef int IRT[2]; + +const IRT& ir = IRT{1,2}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-ctor1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-ctor1.C new file mode 100644 index 0000000..bc6d272 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-ctor1.C @@ -0,0 +1,13 @@ +// PR c++/52905 +// { dg-do compile { target 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-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-deduce.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-deduce.C new file mode 100644 index 0000000..6ae32a6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-deduce.C @@ -0,0 +1,28 @@ +// Test for deduction of T as std::initializer_list. This isn't currently +// 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 "-fdeduce-init-list" } +// { dg-do run { target c++11 } } + +#include <initializer_list> + +struct A +{ + A(std::initializer_list<int>) { } +}; + +void f (A a) { } + +template <class T> +auto g (T&& t) -> decltype (f(t)) // { dg-warning "call" } +{ + return f(t); +} + +int main() +{ + g({1}); // { dg-warning "deduc" } +} + +// { dg-prune-output "-fno-deduce-init-list" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-defarg1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-defarg1.C new file mode 100644 index 0000000..45eb2d5 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-explicit-sfinae.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-explicit-sfinae.C new file mode 100644 index 0000000..78ec8cb --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-explicit-sfinae.C @@ -0,0 +1,46 @@ +// { dg-do compile { target c++11 } } +template<typename _Tp> +_Tp&& declval() noexcept; + +template<bool b> +struct bt { + static constexpr bool value = b; +}; + +template <typename To_, typename... From_> +class my_is_convertible_many { + private: + template <typename To> + struct indirector { + indirector(To); + }; + + template <typename To, typename... From> + struct tag {}; + + template <typename To, typename... From> + static auto test(tag<To, From...>) + -> decltype(indirector<To>({declval<From>()...}), bt<true>()); + static auto test(...) + -> bt<false>; + + public: + static constexpr bool value = decltype(test(tag<To_, From_...>()))::value; +}; + +struct A {}; +struct B {}; +struct C {}; + +struct Test { + Test(A, A); + //Test(B, B); + explicit Test(C, C); +}; + +int main() { + static_assert(my_is_convertible_many<Test, A, A>::value,""); // true, correct + static_assert(!my_is_convertible_many<Test, B, B>::value,""); // false, correct + static_assert(!my_is_convertible_many<Test, C, C>::value,""); // error + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-lifetime1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-lifetime1.C new file mode 100644 index 0000000..d3b0fc3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-lifetime1.C @@ -0,0 +1,33 @@ +// Test that we properly extend the lifetime of the initializer_list +// array even if the initializer_list is a subobject. +// { dg-do run { target c++11 } } + +#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-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-lifetime2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-lifetime2.C new file mode 100644 index 0000000..77fc961 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-lifetime2.C @@ -0,0 +1,63 @@ +// Test that we properly extend the lifetime of the initializer_list +// array even if the initializer_list is a subobject. +// { dg-do run { target c++11 } } + +#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-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-opt.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-opt.C new file mode 100644 index 0000000..3a5e908 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-opt.C @@ -0,0 +1,20 @@ +// PR c++/41997 +// { dg-do compile { target c++11 } } +// { dg-options "-O2 -fdump-tree-optimized" } +// { dg-final { scan-tree-dump-not "_0" "optimized" } } +// { dg-final { cleanup-tree-dump "optimized" } } + +#include <initializer_list> + +inline int max_val(std::initializer_list<int> il) +{ + int i = *(il.begin()); + int j = *(il.begin() + 1); + return (i > j ? i : j); +} + +int main(void) +{ + return max_val({1,2}); +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-postfix-open-square.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-postfix-open-square.C new file mode 100644 index 0000000..b43ffc3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-postfix-open-square.C @@ -0,0 +1,18 @@ +// PR c++/51738 +// { dg-do compile { target c++11 } } + +struct Index +{ + Index(unsigned, unsigned){ } +}; + +struct Matrix +{ + void operator[](Index){ } +}; + +int main() +{ + Matrix m; + m[{0,1}]; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-protected.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-protected.C new file mode 100644 index 0000000..5d12163 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-protected.C @@ -0,0 +1,23 @@ +// PR c++/54325 +// { dg-do compile { target 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-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-pure.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-pure.C new file mode 100644 index 0000000..a9dbc90 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-pure.C @@ -0,0 +1,25 @@ +// PR c++/54325 +// { dg-do compile { target 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-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-value.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-value.C new file mode 100644 index 0000000..ac84266 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-value.C @@ -0,0 +1,34 @@ +// Test for value-initialization via {} +// { dg-do run { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-value2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-value2.C new file mode 100644 index 0000000..1b4cde7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist-value2.C @@ -0,0 +1,19 @@ +// 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-do run { target c++11 } } + +struct A +{ + int i; + A() = default; + A(int); +}; + +int main() +{ + A a{}; + if (a.i != 0) + return 1; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist1.C new file mode 100644 index 0000000..fb8e85b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist1.C @@ -0,0 +1,71 @@ +// Basic uses of initializer lists +// { dg-do run { target c++11 } } + +#include <initializer_list> + +extern "C" void abort(); + +using namespace std; + +struct A { int i,j; A(int _i,int _j): i(_i), j(_j) {} }; +struct B { A a; B(A _a): a(_a) {} }; +struct C { B b; C(B _b): b(_b) {} }; + +struct D +{ + int ia[3]; + D (initializer_list<int> l) + { + const int *p = l.begin(); + for (int i = 0; i < 3; ++i) + ia[i] = *p++; + } +}; + +void f(C c) +{ + if (c.b.a.i != 1) abort(); + if (c.b.a.j != 2) abort(); +} +void f(int); + +void g(D d) +{ + if (d.ia[0] != 1 || d.ia[1] != 2 || d.ia[2] != 3) + abort(); +} + +struct E +{ + int i, j, k; +}; + +void h(E e) +{ + if (e.i != 1 || e.j != 2 || e.k != 3) + abort(); +} + +void i(initializer_list<int> l) +{ + const int *p = l.begin(); + if (*p++ != 1) abort(); + if (*p++ != 2) abort(); + if (*p++ != 3) abort(); + if (p != l.end()) abort(); +} + +struct U { U(int, int) {} }; +U ua[] = { { 3, 2 } }; + +int main() +{ + g({1,2,3}); + + h({1,2,3}); + + f({{{1,2}}}); + f({{A{1,2}}}); + + i({1,2,3}); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist10.C new file mode 100644 index 0000000..80a8837 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist10.C @@ -0,0 +1,53 @@ +// PR c++/38380 +// { dg-do compile { target c++11 } } + +namespace std +{ + struct atomic_bool + { + bool _M_i; + + atomic_bool() = default; + ~atomic_bool() = default; + atomic_bool(const atomic_bool&) = delete; + atomic_bool& operator=(const atomic_bool&) = delete; + + explicit atomic_bool(bool __i) { _M_i = __i; } + + operator bool() const volatile + { return true; } + }; +} + +namespace __gnu_test +{ + struct direct_list_initializable + { + template<typename _Ttype, typename _Tvalue> + void + operator()() + { + struct _Concept + { + void __constraint() + { + _Ttype __v1 = { }; // default ctor + _Ttype __v2 { __a }; // single-argument ctor + } + + _Tvalue __a; + }; + + void (_Concept::*__x)() __attribute__((unused)) + = &_Concept::__constraint; + } + }; +} + +int main() +{ + __gnu_test::direct_list_initializable test; + + test.operator()<std::atomic_bool, bool>(); + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist11.C new file mode 100644 index 0000000..024466e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist11.C @@ -0,0 +1,18 @@ +// PR c++/38684 +// { dg-do compile { target c++11 } } + +#include <initializer_list> + +struct Y {}; + +struct X : Y { + X(std::initializer_list<int>) {} +}; + +struct A { + X v; +}; + +int main() { + A a{ {1,2,3} }; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist12.C new file mode 100644 index 0000000..5efdc67 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist12.C @@ -0,0 +1,21 @@ +// PR c++/38698 +// { dg-do compile { target c++11 } } +// { dg-prune-output "note" } + +struct A +{ + int i; +}; + +A a({1,2}); // { dg-error "no match" } + +union U +{ + int i,j; +}; + +U u({1,2}); // { dg-error "no match" } + +union V {}; + +V v({1}); // { dg-error "no match" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist13.C new file mode 100644 index 0000000..bba2267 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist13.C @@ -0,0 +1,7 @@ +// PR c++/39056 +// { dg-do compile { target c++11 } } + +#include <complex> + +__complex__ int i {0}; +std::complex<int> i2 {0}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist14.C new file mode 100644 index 0000000..41331c4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist14.C @@ -0,0 +1,19 @@ +// Bug: We weren't doing the normal replacement of array with pointer +// for deduction in the context of a call because of the initializer list. +// { dg-do compile { target c++11 } } + +#include <initializer_list> + +struct string +{ + string (const char *); +}; + +template <class T> +struct vector +{ + template <class U> + vector (std::initializer_list<U>); +}; + +vector<string> v = { "a", "b", "c" }; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist15.C new file mode 100644 index 0000000..acd0495 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist15.C @@ -0,0 +1,20 @@ +// { dg-do compile { target c++11 } } + +// Just discard errors pointing at header files +// { dg-prune-output "include" } + +#include <vector> +#include <typeinfo> + +using namespace std; + +template< typename ... ArgTypes > +void test( ArgTypes ... args ) { + vector<type_info*> x = { &typeid(ArgTypes)... }; // { dg-error "" } +} + +int main() +{ + test( 1, 3.14f, 2.78 ); + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist16.C new file mode 100644 index 0000000..9132bd2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist16.C @@ -0,0 +1,11 @@ +// { dg-do run { target c++11 } } + +extern "C" void abort(); + +void f(int i) { if (i != 42) abort(); } + +int main() +{ + f({42}); + return {0}; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist17.C new file mode 100644 index 0000000..6ff4689 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist17.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +void f(int i); + +int main() +{ + f({42.0}); // { dg-error "narrowing" } + return {1.0}; // { dg-error "narrowing" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist18.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist18.C new file mode 100644 index 0000000..bcf90c8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist18.C @@ -0,0 +1,18 @@ +// PR c++/40308, 40311 +// { dg-do run { target c++11 } } + +template< typename T > +struct test { + test() : data{} {} + + T data; +}; + +int main() +{ + test<int> x; + test<int*> y; + int * a = new int{}; + int * b = new int{5}; + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist19.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist19.C new file mode 100644 index 0000000..ef47d3e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist19.C @@ -0,0 +1,10 @@ +// { dg-do compile { target c++11 } } + +// Allow other errors, too +// { dg-prune-output "error" } + +void f(double); +int main() +{ + f({{1}}); // { dg-error "too many braces" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist2.C new file mode 100644 index 0000000..550c8f6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist2.C @@ -0,0 +1,31 @@ +// Test that conversion to std::initializer_list takes priority over other +// user-defined conversions. + +// { dg-do link { target c++11 } } + +#include <initializer_list> + +struct string +{ + string (const char *) {} + template <class Iter> string (Iter, Iter); +}; + +template <class T, class U> +struct pair +{ + pair (T t, U u) {} +}; + +template<class T, class U> +struct map +{ + void insert (pair<T,U>); + void insert (std::initializer_list<pair<T,U> >) {} +}; + +int main() +{ + map<string,string> m; + m.insert({ {"this","that"}, {"me","you"} }); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist20.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist20.C new file mode 100644 index 0000000..0ee37e5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist20.C @@ -0,0 +1,17 @@ +// PR c++/40689 +// { dg-do compile { target c++11 } } + +class X +{ + public: + X(): data {1,2,3,4,5} {} + private: + const short data[5]; +}; + +int main() +{ + const float * pData = new const float[4] { 1.5, 2.5, 3.5, 4.5 }; + + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist21.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist21.C new file mode 100644 index 0000000..6492b26 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist21.C @@ -0,0 +1,17 @@ +// PR c++/40689 +// { dg-do compile { target c++11 } } + +class X +{ + public: + X(): data {1,2} {} // { dg-error "too many initializers" } + private: + const short data[1]; +}; + +int f(int n) +{ + const float * pData = new const float[1] { 1.5, 2.5 }; // { dg-error "too many initializers" } + + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist22.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist22.C new file mode 100644 index 0000000..0cbfe24 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist22.C @@ -0,0 +1,24 @@ +// Core issue 934/1288 +// { dg-do compile { target c++11 } } + +int i; + +int& r1{ i }; // OK, direct binding +int&& r2{ i }; // { dg-error "" } binding && to lvalue + +int& r3{ }; // { dg-error "" } reference to temporary +int&& r4{ }; // OK, reference to temporary + +struct A { int i; } a; + +A& r5 { i }; // { dg-error "" } reference to temporary +A&& r6 { i }; // OK, aggregate initialization of temporary +A& r7 { a }; // OK, direct-initialization +A&& r8 { a }; // { dg-error "lvalue" } binding && to lvalue + +struct B { B(int); int i; } b(0); + +B& r9 { i }; // { dg-error "" } reference to temporary +B&& r10 { i }; // OK, make temporary with B(int) constructor +B& r11 { b }; // OK, direct-initialization +B&& r12 { b }; // { dg-error "lvalue" } binding && to lvalue diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist23.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist23.C new file mode 100644 index 0000000..7e73df0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist23.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } + +#include <initializer_list> + +struct A +{ + A& operator=(int i); + A& operator=(std::initializer_list<int> l) { return *this; } +}; + +int main() +{ + A a; + a = { }; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist24.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist24.C new file mode 100644 index 0000000..d885744 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist24.C @@ -0,0 +1,9 @@ +// PR c++/39923 +// { dg-do compile { target c++11 } } + +#include <initializer_list> + +void test3() +{ + std::initializer_list<int> list{move}; // { dg-error "not declared|could not convert" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist25.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist25.C new file mode 100644 index 0000000..dd41db1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist25.C @@ -0,0 +1,16 @@ +// PR c++/41754 +// { dg-do run { target c++11 } } + +#include <map> +#include <string> +#include <iostream> + +using namespace std; + +int main() +{ + map<string, string> m; + m.insert({{"t", "t"}, {"y", "y"}}); + + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist26.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist26.C new file mode 100644 index 0000000..81d304f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist26.C @@ -0,0 +1,10 @@ +// PR c++/42059 +// { dg-do compile { target c++11 } } +// { dg-options "" { target { ! c++1y } } } + +void +foo (int i) +{ + int a[i]; + a = { }; // { dg-error "assign" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist27.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist27.C new file mode 100644 index 0000000..8567119 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist27.C @@ -0,0 +1,4 @@ +// PR c++/42061 +// { dg-do compile { target c++11 } } + +int& i = { j }; // { dg-error "invalid initialization|was not declared" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist28.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist28.C new file mode 100644 index 0000000..3bf995a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist28.C @@ -0,0 +1,8 @@ +// PR c++/42060 +// { dg-do compile { target c++11 } } + +void foo() +{ + int a[1]; + throw a = {}; // { dg-error "assign" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist29.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist29.C new file mode 100644 index 0000000..9174164 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist29.C @@ -0,0 +1,14 @@ +// PR c++/42331 +// { dg-do compile { target c++11 } } + +class Mesh +{ +public: + Mesh(const char*) + { typele={0}; } // { dg-error "" } + +private: + int typele[7][2]; +}; + +Mesh m(0); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist3.C new file mode 100644 index 0000000..e62e0cc --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist3.C @@ -0,0 +1,11 @@ +// { dg-do compile { target c++11 } } + +#include <initializer_list> + +template <class T> void f(std::initializer_list<T>); + +void g() +{ + f({1,2,3}); +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist30.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist30.C new file mode 100644 index 0000000..eb78f3c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist30.C @@ -0,0 +1,12 @@ +// Testcase for variadic init list deduction. +// { dg-do compile { target c++11 } } + +#include <initializer_list> + +template <class... Ts> +void f (std::initializer_list<Ts>... ls); + +int main() +{ + f({1},{2.0}); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist31.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist31.C new file mode 100644 index 0000000..f34a0ca --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist31.C @@ -0,0 +1,13 @@ +// PR c++/43028 +// { dg-do compile { target c++11 } } + +#include <initializer_list> + +struct string { string(std::initializer_list<char>) { } }; + +void f() { + auto y = + { + string(Equation()) // { dg-error "not declared" } + }; // { dg-error "unable to deduce" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist32.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist32.C new file mode 100644 index 0000000..c5c02fc --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist32.C @@ -0,0 +1,21 @@ +// Test that we try normal init if no list ctor is viable. +// { dg-do compile { target c++11 } } + +#include <initializer_list> + +struct B {}; + +struct C +{ + C(B); +}; + +struct A +{ + A(std::initializer_list<int>); + A(B) { } + A(C); +}; + +B b; +A a{b}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist33.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist33.C new file mode 100644 index 0000000..9ab4b55 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist33.C @@ -0,0 +1,13 @@ +// PR c++/44045 +// { dg-do compile { target c++11 } } + +struct base +{ + virtual ~base() { } +}; + +int main() +{ + base ptr_array[1]; + ptr_array = { base() }; // { dg-error "assign" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist34.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist34.C new file mode 100644 index 0000000..335a7da --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist34.C @@ -0,0 +1,14 @@ +// PR c++/44157 +// { dg-do compile { target c++11 } } + +#include <initializer_list> + +template<typename T> +void f(T) { } + +int main() { + std::initializer_list<int> a = { 0 }; + f(a); + + f<std::initializer_list<int> >({ 0 }); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist35.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist35.C new file mode 100644 index 0000000..f8b824d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist35.C @@ -0,0 +1,24 @@ +// PR c++/41510 +// { dg-do compile { target c++11 } } + +struct B +{ + B(int, int); +}; +struct A +{ + A(int, int); + A(const B&); +}; + +void f() +{ + A a = { 1, 2 }; +} + +template <class T> void g() +{ + A a = { 1, 2 }; +} + +template void g<int>(); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist36.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist36.C new file mode 100644 index 0000000..2a2b208 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist36.C @@ -0,0 +1,23 @@ +// PR c++/44358 +// { dg-do compile { target c++11 } } + +#include <initializer_list> + +struct A +{ + A(int); +}; + +struct B +{ + B(std::initializer_list<A>); +}; + +void f (B b); +int main() +{ + B b0 = {{1}}; + B b1 = {{1.0}}; // { dg-error "narrowing" } + B b2 {1.0}; // { dg-error "narrowing" } + A a {1.0}; // { dg-error "narrowing" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist37.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist37.C new file mode 100644 index 0000000..dfe6d4a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist37.C @@ -0,0 +1,24 @@ +// DR 990 +// { dg-do compile { target c++11 } } + +#include <initializer_list> + +struct S { + S(std::initializer_list<double>); // #1 + S(std::initializer_list<int>); // #2 + S(); // #3 + // ... +}; +S s1 = { 1.0, 2.0, 3.0 }; // invoke #1 +S s2 = { 1, 2, 3 }; // invoke #2 +S s3 = { }; // invoke #3 (for value-initialization) + + +// Test some other situations, too. +void f (S); +int main() +{ + S s4 { }; + f({ }); + S {}; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist38.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist38.C new file mode 100644 index 0000000..816f94c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist38.C @@ -0,0 +1,21 @@ +// DR 990 +// { dg-do compile { target c++11 } } + +#include <initializer_list> + +struct A { + A(std::initializer_list<int>); // #1 +}; +struct B { + A a; +}; + +void f (B); +int main() +{ + B{}; + f({}); + B b0 = { }; + B b1 { }; // OK, uses #1 + B b2 { 1 }; // { dg-error "could not convert" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist39.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist39.C new file mode 100644 index 0000000..169c063 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist39.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } + +struct A { int i; }; + +void f (const A &); +void f (A &&); + +void g (A, int); +void g (A, double); + +int main() +{ + f ( { 1 } ); + g ( { 1 }, 1 ); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist4.C new file mode 100644 index 0000000..22e6b45 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist4.C @@ -0,0 +1,32 @@ +// Test for initializer-list 'explicit' rule +// { dg-do compile { target c++11 } } + +struct A +{ + explicit A(int,int); + operator bool(); +}; + +A f(A) +{ + A{1,2}; + A a1{1,2}; + new A{1,2}; + if (A a5{1,2}); + + A({1,2}); // { dg-error "explicit" } + A a2({1,2}); // { dg-error "explicit" } + A a3 = {1,2}; // { dg-error "explicit" } + new A({1,2}); // { dg-error "explicit" } + f({1,2}); // { dg-error "explicit" } + a1 = {1,2}; // { dg-error "explicit" } + if (A a4 = {1,2}); // { dg-error "explicit" } + return {1,2}; // { dg-error "explicit" } +} + +struct B +{ + A a; + B(): a{1,2} {} + B(const B&): a({1,2}) {} // { dg-error "explicit" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist40.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist40.C new file mode 100644 index 0000000..6e6a11a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist40.C @@ -0,0 +1,13 @@ +// PR c++/54835, DR 1518 +// { dg-do compile { target c++11 } } + +struct A +{ + explicit A(int = 42); +}; + +int main() +{ + A a1 = { }; // { dg-error "explicit" } + A a2 = { 24 }; // { dg-error "explicit" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist41.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist41.C new file mode 100644 index 0000000..7ae4928 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist41.C @@ -0,0 +1,14 @@ +// PR c++/44703 +// { dg-do compile { target c++11 } } + +#include <initializer_list> + +typedef std::initializer_list<int> type ; +void f(type) {} + +int main() +{ +// error: could not convert '{1, 2, 3}' to 'type' + f({1,2,3}) ; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist42.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist42.C new file mode 100644 index 0000000..fcd71cc --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist42.C @@ -0,0 +1,13 @@ +// { dg-do compile { target c++11 } } + +enum Unscoped { }; +enum class Scoped { }; + +Unscoped bar(Unscoped x) { return x; } +Scoped bar(Scoped x) { return x; } + +auto var1u = bar(Unscoped()); // OK +auto var1s = bar(Scoped()); // OK + +auto var2u = bar(Unscoped{}); // #1 Error, but should work +auto var2s = bar(Scoped{}); // #2 Error, but should work diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist43.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist43.C new file mode 100644 index 0000000..1cae23a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist43.C @@ -0,0 +1,7 @@ +// Test that using T{} at file scope doesn't create a static temporary. +// { dg-do compile { target c++11 } } +// { dg-final { scan-assembler-not "local" } } + +struct A { }; + +A a = A{}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist44.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist44.C new file mode 100644 index 0000000..609e07b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist44.C @@ -0,0 +1,5 @@ +// { dg-do compile { target c++11 } } + +#include <initializer_list> + +auto value = std::initializer_list<int>{ 1, 2, 3 }; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist45.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist45.C new file mode 100644 index 0000000..31bd18d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist45.C @@ -0,0 +1,13 @@ +// PR c++/46289 +// { dg-do compile { target c++11 } } + +struct A +{ + int i[2]; +}; + +struct B +{ + A a; + B(): a({{1,2}}) { } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist46.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist46.C new file mode 100644 index 0000000..39a3b5e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist46.C @@ -0,0 +1,14 @@ +// PR c++/48281 +// { dg-options "-O2" } +// { dg-do run { target c++11 } } + +#include <initializer_list> + +typedef std::initializer_list<int> int1; +typedef std::initializer_list<int1> int2; +static int2 ib = {{42,2,3,4,5},{2,3,4,5,1},{3,4,5,2,1}}; + +int main() +{ + return *(ib.begin()->begin()) != 42; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist47.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist47.C new file mode 100644 index 0000000..0b34ff9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist47.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +struct A { ~A() = delete; }; // { dg-message "declared" } + +int main() +{ + typedef const A cA[2]; + cA{}; // { dg-error "deleted" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist48.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist48.C new file mode 100644 index 0000000..7a79c67 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist48.C @@ -0,0 +1,11 @@ +// PR c++/48726 +// { dg-do compile { target c++11 } } + +#include <memory> + +struct Foo{ + int i; +}; +typedef std::unique_ptr<Foo> up; + +std::initializer_list<up> il{up{new Foo}, up{new Foo}}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist49.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist49.C new file mode 100644 index 0000000..0fa4e3f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist49.C @@ -0,0 +1,17 @@ +// Test for non-trivial list-initialization with array new. +// { dg-do run { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/initlist5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist5.C new file mode 100644 index 0000000..5f253ca --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist5.C @@ -0,0 +1,35 @@ +// Test for narrowing diagnostics +// { dg-do compile { target c++11 } } + +#include <initializer_list> + +struct A { int i; int j; }; +A a2 { 1.2 }; // { dg-error "narrowing" } +A a1 { 1, 2 }; // aggregate initialization +struct B { + B(std::initializer_list<int>); +}; +B b1 { 1, 2 }; // creates initializer_list<int> and calls constructor +B b2 { 1, 2.0 }; // { dg-error "narrowing" } +struct C { + C(int i, double j); +}; +C c1 = { 1, 2.2 }; // calls constructor with arguments (1, 2.2) +C c2 = { 1.1, 2 }; // { dg-error "narrowing" } + +int j { 1 }; // initialize to 1 +int k {}; // initialize to 0 + +// PR c++/36963 +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-4.9/gcc/testsuite/g++.dg/cpp0x/initlist50.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist50.C new file mode 100644 index 0000000..41fb03b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist50.C @@ -0,0 +1,21 @@ +// PR c++/45418 +// { dg-do compile { target c++11 } } + +struct A1 { }; +struct A2 { + A2(); +}; + +template <class T> struct B { + T ar[1]; + B(T t):ar{t} {} +}; + +int main(){ + B<int> bi{1}; + A1 a1; + B<A1> ba1{a1}; + A2 a2; + A2 a2r[1]{{a2}}; + B<A2> ba2{a2}; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist51.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist51.C new file mode 100644 index 0000000..9fd750d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist51.C @@ -0,0 +1,15 @@ +// PR c++/47184 +// { dg-do compile { target c++11 } } + +struct S +{ + int a; +}; +struct T +{ + T(S s) {} +}; +int main() +{ + T t(S{1}); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist52.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist52.C new file mode 100644 index 0000000..3ca8781 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist52.C @@ -0,0 +1,7 @@ +// PR c++/45378 +// { dg-do compile { target c++11 } } + +int main() +{ + int x { 22.2 }; // { dg-error "narrowing" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist53.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist53.C new file mode 100644 index 0000000..998e4c8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist53.C @@ -0,0 +1,21 @@ +// PR c++/49216 +// { dg-do run { target c++11 } } + +#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-4.9/gcc/testsuite/g++.dg/cpp0x/initlist54.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist54.C new file mode 100644 index 0000000..52a8ff9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist54.C @@ -0,0 +1,13 @@ +// PR c++/49355 +// { dg-do compile { target c++11 } } + +#include <string> + +struct T { + std::string foobar; +}; + +int main() +{ + T* x = new T({""}); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist55.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist55.C new file mode 100644 index 0000000..a40edd3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist55.C @@ -0,0 +1,6 @@ +// Test for -Wno-narrowing +// { dg-do compile { target c++11 } } +// { dg-options "-pedantic-errors -Wno-narrowing" } + +int i; +float d = { i }; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist56.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist56.C new file mode 100644 index 0000000..5339dbf --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist56.C @@ -0,0 +1,37 @@ +// PR c++/47453 +// { dg-do compile { target c++11 } } + +// 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-4.9/gcc/testsuite/g++.dg/cpp0x/initlist57.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist57.C new file mode 100644 index 0000000..5c59f40 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist57.C @@ -0,0 +1,8 @@ +// PR c++/50054 +// { dg-do compile { target c++11 } } + +void g( const int& (a)[1] ) {} // { dg-error "array of references" } + +int main () { + g( { 1, 2 } ); // { dg-error "initializer list" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist58.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist58.C new file mode 100644 index 0000000..aab21e3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist58.C @@ -0,0 +1,17 @@ +// PR c++/50209 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/initlist59.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist59.C new file mode 100644 index 0000000..6371c16 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist59.C @@ -0,0 +1,18 @@ +// PR c++/49996 +// { dg-do compile { target c++11 } } + +struct A +{ + ~A() + { } +}; + +struct B +{ + const A& ref; +}; + +int main() +{ + B* p = new B{A()}; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist6.C new file mode 100644 index 0000000..3d02960 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist6.C @@ -0,0 +1,29 @@ +// Test for initlist lifetime +// { dg-do run { target c++11 } } + +#include <initializer_list> + +int c; + +struct A +{ + A(int,int) { ++c; } + ~A() { --c; } +}; + +void f (std::initializer_list<A> l) { } + +int main() +{ + f({ {1,2}, {3,4} }); + if (c != 0) + return 1; + + { + std::initializer_list<A> l { {1,2}, {3,4} }; + if (c != 2) + return 2; + } + if (c != 0) + return 3; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist61.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist61.C new file mode 100644 index 0000000..28eccc2 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/initlist62.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist62.C new file mode 100644 index 0000000..d739ea3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist62.C @@ -0,0 +1,10 @@ +// PR c++/51399 +// { dg-do compile { target c++11 } } + +#include <initializer_list> + +struct A +{ + std::initializer_list<int> x[1] = { 0 }; // { dg-error "could not convert" } + A() {} +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist63.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist63.C new file mode 100644 index 0000000..0094047 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist63.C @@ -0,0 +1,16 @@ +// Origin PR c++/51475 +// { dg-do compile { target c++11 } } + +#include <initializer_list> + +struct A +{ + A(int*); +}; + +struct B +{ + const std::initializer_list<A>& x; +}; + +B b = {{1}}; // { dg-error "" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist64.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist64.C new file mode 100644 index 0000000..78e5308 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist64.C @@ -0,0 +1,29 @@ +// PR c++/51553 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/initlist65.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist65.C new file mode 100644 index 0000000..061734f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist65.C @@ -0,0 +1,9 @@ +// Core 1270 +// { dg-do compile { target c++11 } } + +struct A +{ + int i[2]; +}; + +A f() { return {1,2}; } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist66.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist66.C new file mode 100644 index 0000000..4fc162e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist66.C @@ -0,0 +1,29 @@ +// PR c++/52510 +// { dg-do compile { target c++11 } } + +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned long long uint64_t; +typedef uint64_t upad64_t; + +typedef struct _pthread_cond { + struct { + uint8_t __pthread_cond_flag[4]; + uint16_t __pthread_cond_type; + uint16_t __pthread_cond_magic; + } __pthread_cond_flags; + upad64_t __pthread_cond_data; +} pthread_cond_t; + +class gtm_rwlock +{ + pthread_cond_t c_readers; + public: + gtm_rwlock(); +}; + +gtm_rwlock::gtm_rwlock() + : c_readers ({{{0, 0, 0, 0}, 0, 0x4356}, 0}) +{ } + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist67.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist67.C new file mode 100644 index 0000000..491d4cf --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist67.C @@ -0,0 +1,27 @@ +// PR c++/50478 +// { dg-do compile { target c++11 } } + +#include <initializer_list> + +namespace std +{ + template<typename _Key> + struct set + { + void insert(const _Key&); + void insert(initializer_list<_Key>); + }; + + struct string + { + string(const string&, __SIZE_TYPE__, __SIZE_TYPE__ = -1); + string(const char*); + string(initializer_list<char>); + }; +} + +int main() +{ + std::set<std::string> s; + s.insert( { "abc", "def", "hij"} ); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist68.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist68.C new file mode 100644 index 0000000..7cfe1a3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist68.C @@ -0,0 +1,20 @@ +// PR c++/56772 +// { dg-require-effective-target c++11 } + +typedef __SIZE_TYPE__ size_t; +void* operator new[](size_t, void *p) { return p; } +template <typename T = size_t> +void f () +{ + size_t coord [2][2]; + new (&coord) size_t [2][2] + { + {0,0}, + {0,0}, + }; +} + +int main () +{ + f<>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist69.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist69.C new file mode 100644 index 0000000..5d59dfe --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist69.C @@ -0,0 +1,29 @@ +// PR c++/50261 +// { dg-require-effective-target c++11 } + +template <typename T> +struct ca { + T elem[1]; + + ca(const T (&s)[1]): elem{{s}} { } // { dg-error "braces" } + ca(const T (&s)[1],int): elem({{s}}) { } // { dg-error "paren|invalid" } + ca(const T (&s)[1],char): elem(s) { } // { dg-error "array" } + ca(const T (&s)[1],double): elem{s} { } // { dg-error "invalid" } + + ca(const T &v): elem{{v}} { } // { dg-error "braces" } + ca(const T &v,int): elem{{{v}}} { } // { dg-error "braces" } + ca(const T &v,char): elem{v} { } // OK + ca(const T &v,double): elem({v}) { } // { dg-error "paren" } +}; + +int main() { + int a[1] = {0}; + ca<int> d(a); + ca<int> d1(a,1); + ca<int> d2(a,'2'); + ca<int> d3(a,3.0); + ca<int> e(a[0]); + ca<int> e1(a[0],1); + ca<int> e2(a[0],'2'); + ca<int> e3(a[0],3.0); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist7.C new file mode 100644 index 0000000..7dbbf2d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist7.C @@ -0,0 +1,12 @@ +// PR c++/37932 +// { dg-do compile { target c++11 } } + +typedef enum { AA=1, BB=2 } my_enum; + +typedef struct { my_enum a:4 ; unsigned b:28; } stru; + +void foo (char c, my_enum x, int i) +{ + char arr[2] = {c+'0', 0}; // { dg-error "narrowing" } + stru s = {x,0}; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist70.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist70.C new file mode 100644 index 0000000..f215b9d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist70.C @@ -0,0 +1,27 @@ +// PR c++/57196 +// { dg-require-effective-target c++11 } + +#include <initializer_list> + +template<class T> +struct set { + set() = default; + set(std::initializer_list<T>){} +}; + +struct string { + string(const char*){} + ~string(){} +}; + +typedef decltype(sizeof(0)) size_t; + +template <size_t> struct EqHelper { }; + +int IsNullLiteralHelper(...); + +void Fn() { + EqHelper<sizeof IsNullLiteralHelper(set<int>{1})> eq1; // ok + EqHelper<sizeof IsNullLiteralHelper(set<string>())> eq2; // ok + EqHelper<sizeof IsNullLiteralHelper(set<string>{"foo"})> eq3; // error +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist71.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist71.C new file mode 100644 index 0000000..1d14390 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist71.C @@ -0,0 +1,10 @@ +// PR c++/56930 +// { dg-require-effective-target c++11 } +// { dg-options -Wconversion } + +int main() +{ + int x = sizeof(int); + int y { sizeof(int) }; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist72.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist72.C new file mode 100644 index 0000000..98fc79f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist72.C @@ -0,0 +1,22 @@ +// DR 1589 +// { dg-require-effective-target c++11 } + +#include <initializer_list> + +struct Pair +{ + Pair(const char *, const char *); +}; + +struct String +{ + String(const char *); +}; + +void f1(int); // #1 +int f1(std::initializer_list<long>); // #2 +int g1() { return f1({42}); } // chooses #2 + +void f2(Pair); // #3 +int f2(std::initializer_list<String>); // #4 +int g2() { return f2({"foo","bar"}); } // chooses #4 diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist73.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist73.C new file mode 100644 index 0000000..de9748d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist73.C @@ -0,0 +1,13 @@ +// PR c++/57682 +// { dg-do compile { target c++11 } } + +struct Class +{ + Class (int func) + try + : f { func } { } + catch ( ... ) { } + +private: + int f; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist74.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist74.C new file mode 100644 index 0000000..4305b59 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist74.C @@ -0,0 +1,7 @@ +// Core 1591 +// { dg-require-effective-target c++11 } + +template<class T, int N> void g(T const (&)[N]); +void f() { + g( { 1, 2, 3, 4 } ); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist75.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist75.C new file mode 100644 index 0000000..f185401 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist75.C @@ -0,0 +1,6 @@ +// PR c++/59080 +// { dg-require-effective-target c++11 } + +#include <initializer_list> + +auto foo[] = {}; // { dg-error "auto|unable to deduce" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist76.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist76.C new file mode 100644 index 0000000..ac419dd --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist76.C @@ -0,0 +1,5 @@ +// PR c++/58812 +// { dg-require-effective-target c++11 } + +int i; +int&& j{{ i }}; // { dg-error "too many braces" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist77.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist77.C new file mode 100644 index 0000000..49b9079 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist77.C @@ -0,0 +1,10 @@ +// PR c++/58651 +// { dg-require-effective-target c++11 } + +struct A +{ + int i; + A(int j) : i{{j}} {} // { dg-error "too many braces" } +}; + +A a(0); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist78.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist78.C new file mode 100644 index 0000000..648ec53 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist78.C @@ -0,0 +1,12 @@ +// PR c++/58639 +// { dg-require-effective-target c++11 } + +struct node { + node &parent; +}; + +struct vector { + node n; +}; + +vector v({}); // { dg-error "" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist79.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist79.C new file mode 100644 index 0000000..5a1914d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist79.C @@ -0,0 +1,8 @@ +// PR c++/59646 +// { dg-require-effective-target c++11 } + +#include <initializer_list> + +struct A {}; + +std::initializer_list<volatile A> x = {{}}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist8.C new file mode 100644 index 0000000..ca0bc46 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist8.C @@ -0,0 +1,19 @@ +// PR c++/37740 +// { dg-do compile { target c++11 } } + +struct A +{ + int i; +}; + +struct B +{ + double d; + A i; +}; + +int main() +{ + A a; + new B{3.2, a}; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist80.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist80.C new file mode 100644 index 0000000..7947f1f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist80.C @@ -0,0 +1,6 @@ +// PR c++/60051 +// { dg-require-effective-target c++11 } + +#include <initializer_list> + +auto x[2] = {}; // { dg-error "" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist9.C new file mode 100644 index 0000000..bb6414c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist9.C @@ -0,0 +1,29 @@ +// PR c++/37860 +// { dg-do compile { target c++11 } } + +struct b +{ + bool t; + + b() = default; + ~b() = default; + b& operator=(const b&) = delete; + b(const b&) = delete; // { dg-message "declared" } + + b(bool _t): t (_t) { } +}; + +int main() +{ + // copy list initialization + b tst1 = { false }; + + // copy initialization. + b tst2 = false; // { dg-error "use" } + + // direct list initialization + b tst3 { false }; + + // default initialization + b tst4; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns1.C new file mode 100644 index 0000000..69813b6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns1.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } +// { dg-final { scan-assembler "_ZN1Q2V11fEv" } } +// { dg-final { scan-assembler "_ZN1Q2V11iE" } } + +namespace Q { + inline namespace V1 { + extern int i; + void f(); + } +} +int Q::i = 1; +void Q::f() { } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns2.C new file mode 100644 index 0000000..6ad9d65 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns2.C @@ -0,0 +1,25 @@ +// { dg-do compile { target c++11 } } + +namespace Q { + inline namespace V1 { + extern int i; // { dg-message "" } + extern int j; // { dg-message "" } + void f(); // { dg-message "" } + void g(); // { dg-message "" } + } + inline namespace V2 { + extern int j; // { dg-message "" } + void g(); // { dg-message "" } + } + extern int i; // { dg-message "" } + void f(); // { dg-message "" } + void h(); +} +namespace R { + using namespace Q; +} +int Q::i = 1; // { dg-error "ambiguous" } +int Q::j = 1; // { dg-error "ambiguous" } +void Q::f() { } // { dg-error "ambiguous" } +void Q::g() { } // { dg-error "ambiguous" } +void R::h() { } // { dg-error "" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns3.C new file mode 100644 index 0000000..7e24e80 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns3.C @@ -0,0 +1,26 @@ +// { dg-do compile { target c++11 } } + +namespace C +{ + void f(); +} + +namespace B +{ + using namespace C; + + inline namespace B1 + { + void f(); + } +} + +namespace A +{ + using namespace B; +} + +int main() +{ + A::f(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns4.C new file mode 100644 index 0000000..25caefc --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns4.C @@ -0,0 +1,2 @@ +// { dg-options "-std=gnu++98 -pedantic" } +inline namespace { } // { dg-warning "inline namespaces" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns5.C new file mode 100644 index 0000000..20a3dc6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/inline-ns5.C @@ -0,0 +1,2 @@ +// { dg-options "-std=gnu++98 -pedantic-errors" } +inline namespace { } // { dg-error "inline namespaces" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/iop.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/iop.C new file mode 100644 index 0000000..0a78be9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/iop.C @@ -0,0 +1,41 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test that the implicit object parameter is *not* an rvalue reference, but is instead +// identical to that specified in C++03. That is, the implicit object parameter is +// an lvalue reference that can bind to an rvalue. :-\ +// See http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2118.html under the +// section "Revision 1 Summary and Rationale" for more details. + +// { dg-do compile { target c++11 } } +// { dg-skip-if "packed attribute missing for struct one" { "epiphany-*-*" } { "*" } { "" } } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {long x[1];}; +struct two {long x[2];}; + +struct os +{ + one operator<<(int); +}; + +struct A +{ + A(int); +}; + +two operator<<(os&, const A&); + +void test() +{ + os o; + sa<sizeof(o << 1) == 1 * sizeof(long)> t1; // Calls os::operator<<(int) + // Would be ambiguous if the implicit object parameter + // was an rvalue reference. +} + +int main() +{ + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-50220.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-50220.C new file mode 100644 index 0000000..4da9d46 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-50220.C @@ -0,0 +1,9 @@ +// PR c++/50220 +// { dg-do compile { target c++11 } } + +template<typename Foo> struct Foobar {}; + +void foobar(const Foobar<void>& obj) +{ + [obj](){}(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-98.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-98.C new file mode 100644 index 0000000..ff1085f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-98.C @@ -0,0 +1,8 @@ +// PR c++/46159 +// { dg-options -std=c++98 } + +void +f() +{ + int **p = new(int(*[2])); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-__func__.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-__func__.C new file mode 100644 index 0000000..52bb874 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-__func__.C @@ -0,0 +1,8 @@ +// PR c++/44160 +// { dg-do link { target c++11 } } + +int main() +{ + const char *p = []() { return __func__; }(); + return p == 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-anon1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-anon1.C new file mode 100644 index 0000000..482193e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-anon1.C @@ -0,0 +1,18 @@ +// DR 1612 +// { dg-require-effective-target c++11 } + +int main() { + static int result; + struct A { int x; }; + struct B { int y; }; + union { + A a; B b; + }; + a.x = 1; + [=]() mutable { + a.x = 2; // { dg-error "anonymous union" } + result = b.y; // { dg-error "anonymous union" } + }(); + if (result == 1) return 0; + throw 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-array.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-array.C new file mode 100644 index 0000000..adb40ed --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-array.C @@ -0,0 +1,19 @@ +// Test that array capture by copy works. +// { dg-do run { target c++11 } } + +struct A +{ + int i; + A(int i): i(i) {} + A(const A& a): i(a.i+1) {} +}; + +int main() +{ + A ar[4][3] = { { 10, 20, 30 }, + { 40, 50, 60 }, + { 70, 80, 90 }, + { 100, 110, 120 } }; + int i = [ar] { return ar[1][1]; }().i; + return (i!= 52); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto1.C new file mode 100644 index 0000000..d13e2c0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto1.C @@ -0,0 +1,14 @@ +// PR c++/50437 +// { dg-do compile { target c++11 } } + +template <typename T> +void f() +{ + auto g = [](T t){ return t == 0; }; + g(T()); +} + +int main() +{ + f<int>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto2.C new file mode 100644 index 0000000..05fadf5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto2.C @@ -0,0 +1,16 @@ +// PR c++/56901 +// { dg-require-effective-target c++11 } + +template <typename> +void foo_impl() +{ + int data; + auto L = [&](){ return data; }; + [&](){ L(); }(); + [&L](){ L(); }(); +} + +void foo() +{ + foo_impl<int>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto3.C new file mode 100644 index 0000000..013ed52 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto3.C @@ -0,0 +1,24 @@ +// PR c++/57526 +// { dg-require-effective-target c++11 } + +template<class T> +struct A +{ + void bar( ) { } + + void foo( ) + { + auto* this_ptr = this; + auto lc = [&]( ) + { + this_ptr->bar(); + }; + lc(); + } +}; + +int main() +{ + A<int> a; + a.foo(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-const-ref-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-const-ref-neg.C new file mode 100644 index 0000000..9c9632c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-const-ref-neg.C @@ -0,0 +1,14 @@ +// { dg-do compile { target c++11 } } +#include <cassert> + +int main() { + int i = 1, j = 2; + const int& ci = i; + [&ci, &j] () -> void { j = ci; } (); + assert(i == 1); + assert(j == 1); + [&ci] () -> void { ci = 0; } (); // { dg-error "" "cannot assign to const int&" } + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-const-ref.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-const-ref.C new file mode 100644 index 0000000..16fd0a7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-const-ref.C @@ -0,0 +1,14 @@ +// { dg-do run { target c++11 } } +#include <cassert> + +int main() { + int i = 1, j = 2; + const int& ci = i; + [&ci, &j] () -> void { j = ci; } (); + assert(i == 1); + assert(j == 1); + //[&ci] () -> void { ci = 0; } (); { dg-error: cannot assign to const int& } + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-neg.C new file mode 100644 index 0000000..3f9da7e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-neg.C @@ -0,0 +1,15 @@ +// PR c++/50736 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-redundancy.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-redundancy.C new file mode 100644 index 0000000..49fbdf3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-redundancy.C @@ -0,0 +1,13 @@ +// FDIS 5.1.2/8 +// { dg-do compile { target c++11 } } +// { dg-options "-pedantic-errors" } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const-neg.C new file mode 100644 index 0000000..28ea533 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const-neg.C @@ -0,0 +1,19 @@ +// { dg-do compile { target c++11 } } + +#include <cassert> + +template<typename F> +void call(const F& f) { f(); } + +int main() { + call([] () -> void {}); + call([] () mutable -> void {}); + + int i = -1; + call([&i] () -> void { i = 0; }); + assert(i == 0); + call([i] () -> void { i = 0; }); // { dg-error "" "assignment to non-reference capture in const lambda" } + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const.C new file mode 100644 index 0000000..c6150f1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const.C @@ -0,0 +1,19 @@ +// { dg-do run { target c++11 } } + +#include <cassert> + +template<typename F> +void call(const F& f) { f(); } + +int main() { + call([] () -> void {}); + //call([] () mutable -> void {}); // { dg-error: "`f' does not have const `operator()'" } + + int i = -1; + call([&i] () -> void { i = 0; }); + assert(i == 0); + //call([i] () -> void { i = 0; }); // { dg-error: "assignment to non-reference capture in const lambda" } + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const2.C new file mode 100644 index 0000000..884163a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const2.C @@ -0,0 +1,15 @@ +// PR c++/52026 +// { dg-options "-O" } +// { dg-do run { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv.C new file mode 100644 index 0000000..08d8bbf --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv.C @@ -0,0 +1,14 @@ +// Test for conversion from stateless lambda to function pointer. + +// { dg-do compile { target c++11 } } +// { dg-final { scan-assembler "weak\[^\n\r\]*_?_ZZ1fvENKUlvE_cvPFvvEEv" { target { ! { *-*-darwin* *-*-mingw* *-*-cygwin *-*-hpux10* } } } } } + +inline void f() +{ + void (*pfn)() = []{}; +} + +int main() +{ + f(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv2.C new file mode 100644 index 0000000..cd4cf7e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv2.C @@ -0,0 +1,11 @@ +// Test for conversion from stateless lambda to function pointer. + +// { dg-do run { target c++11 } } + +typedef int (*pfn)(int); + +int main() +{ + pfn p = [](int i) { return i-42; }; + return p (42); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv3.C new file mode 100644 index 0000000..ebc6c14 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv3.C @@ -0,0 +1,12 @@ +// Conversion to a function pointer uses a generic thunk, which doesn't +// work properly for variadics. Make sure that we can still use the lambda +// normally. + +// { dg-do compile { target c++11 } } + +void f() +{ + auto l = [](...){}; + void (*p1)(...) = l; // { dg-bogus "sorry" "" { xfail *-*-* } } + l(); // OK +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv4.C new file mode 100644 index 0000000..66c0910 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv4.C @@ -0,0 +1,13 @@ +// PR c++/43641 +// { dg-do compile { target c++11 } } + +struct B +{ + int i; +}; + +void func() +{ + [](const B& b) -> const int& { return b.i; }; + [](const B& b) { return b; }; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv5.C new file mode 100644 index 0000000..f5408a9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv5.C @@ -0,0 +1,15 @@ +// PR c++/45080 +// { dg-do compile { target c++11 } } + +typedef void(*pfn)(); + +template<typename=int> +void f() +{ + pfn fn = []{}; +} + +void test() +{ + f(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv6.C new file mode 100644 index 0000000..3b3fda9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv6.C @@ -0,0 +1,6 @@ +// PR c++/55015 +// { dg-do link { target c++11 } } + +typedef void (*VoidFunc)(); +inline VoidFunc GetFunc() { return [](){}; } +int main() { VoidFunc func = GetFunc(); } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv7.C new file mode 100644 index 0000000..89e4e4b --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv8.C new file mode 100644 index 0000000..abe272a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv8.C @@ -0,0 +1,15 @@ +// PR c++/56447 +// { dg-do compile { target c++11 } } + +template <class T> +void f() +{ + int i; + // This lambda should not have a conversion op, since it captures i + int (*p)() = [=]{ return i; }; // { dg-error "cannot convert" } +} + +int main() +{ + f<int>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-default-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-default-neg.C new file mode 100644 index 0000000..91f5d62 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-default-neg.C @@ -0,0 +1,13 @@ +// { dg-do compile { target c++11 } } + +int main() { + int i; + const char* s; + [=] () -> void { i; s; i; s; } (); + + [] () -> void { i; } (); // { dg-error "" "`i' is not captured" } + [1] () -> void {} (); // { dg-error "expected identifier" } + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-default.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-default.C new file mode 100644 index 0000000..232c56b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-default.C @@ -0,0 +1,13 @@ +// { dg-do run { target c++11 } } + +int main() { + int i; + const char* s; + [=] () -> void { i; s; i; s; } (); + + //[] () -> void { i; } (); // { dg-error: "`i' is not in scope" } + //[1] () -> void {} (); // { dg-error: "expected identifier" } + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-neg.C new file mode 100644 index 0000000..caffb7f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-neg.C @@ -0,0 +1,13 @@ +// { dg-do compile { target c++11 } } + +int main() { + int i; + const char* s; + [i, s] () -> void { i; s; } (); + + [] () -> void { i; } (); // { dg-error "" "`i' is not captured" } + [1] () -> void {} (); // { dg-error "expected identifier" } + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy.C new file mode 100644 index 0000000..6d27d75 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy.C @@ -0,0 +1,13 @@ +// { dg-do run { target c++11 } } + +int main() { + int i; + const char* s; + [i, s] () -> void { i; s; } (); + + //[] () -> void { i; } (); // { dg-error: "`i' is not in scope" } + //[1] () -> void {} (); // { dg-error: "expected identifier" } + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ctor-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ctor-neg.C new file mode 100644 index 0000000..4a63d00 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ctor-neg.C @@ -0,0 +1,25 @@ +// { dg-do compile { target c++11 } } + +void f() +{ + int i; + auto lam = [i]{}; // { dg-message "" } + decltype(lam) lam2 = { 1 }; // { dg-error "" "not an aggregate" } + decltype(lam) lam3; // { dg-error "" "deleted default ctor" } + lam3 = lam; // { dg-error "" "deleted assignment op" } +} + +template <class T> +void g(T i) +{ + auto lam = [i]{}; // { dg-message "" } + decltype(lam) lam2 = { 1 }; // { dg-error "" "not an aggregate" } + decltype(lam) lam3; // { dg-error "" "deleted default ctor" } + lam3 = lam; // { dg-error "" "deleted assignment op" } +} + +int main() +{ + f(); + g(1); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ctors.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ctors.C new file mode 100644 index 0000000..8dfb2fa --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ctors.C @@ -0,0 +1,17 @@ +// { dg-do run { target c++11 } } + +struct A +{ + A() { } + A(A&) { } + A(A&&) { } +}; + +int main() +{ + A a; + auto lam4 = [a]{}; // OK, implicit move ctor + lam4(); + auto lam5 = lam4; // OK, implicit copy ctor + lam5(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-debug.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-debug.C new file mode 100644 index 0000000..b8b15d0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-debug.C @@ -0,0 +1,16 @@ +// PR c++/43502 +// { dg-do compile { target c++11 } } +// { dg-options "-fcompare-debug" } + +void g (int n) +{ + int bef ([]{return 0;}()); +} +struct S { + void f (int = []{return 0;}(), int = [] { return 0;}()); +}; +int main () +{ + S ().f (); + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-decltype1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-decltype1.C new file mode 100644 index 0000000..b36ca21 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-decltype1.C @@ -0,0 +1,22 @@ +// PR c++/59791 +// We force the gimple dump to trigger use of lang_decl_name. +// { dg-do compile { target c++11 } } +// { dg-options "-fdump-tree-gimple" } +// { dg-final { cleanup-tree-dump "gimple" } } + +template < class T > void +f (T t) +{ + int i = t; + [](int)->decltype (i + t) + { + return 0; + } + (0); +} + +void +foo () +{ + f (0); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg.C new file mode 100644 index 0000000..88970a9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg.C @@ -0,0 +1,22 @@ +// Testcase for DR 975. + +// { dg-do compile { target c++11 } } + +bool b; +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() +{ + 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-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg2.C new file mode 100644 index 0000000..fdbb4e1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg2.C @@ -0,0 +1,22 @@ +// Test that this is accepted even when pedantic now that it's part +// of the standard. + +// { dg-do compile { target c++11 } } +// { dg-options "-pedantic" } + +bool b; +template <class T> +T f (T t) +{ + [=] { return t+1; }; // OK + return [=] { + auto i = t+1; + return i+1; + }(); +} + +int main() +{ + if (f(1) != 3) + return 1; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-neg.C new file mode 100644 index 0000000..6ada757 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-neg.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +int main() { + int i = 0; + int& r = [&] () { return i; } (); // { dg-error "" "invalid initialization of non-const reference of type .int&. from a temporary of type .int." } + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce.C new file mode 100644 index 0000000..b0e2d9f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce.C @@ -0,0 +1,28 @@ +// { dg-do run { target c++11 } } +#include <cassert> + +int main() { + [] {}; + [] {} (); + [] () {}; + [] () {} (); + [] () { return "lambda"; }; + + int i = 1, j = 2; + [&i, j] () { i = j; } (); + assert(i == 2); + assert(j == 2); + + i = [] () { return 3; } (); + assert(i == 3); + + int k = [&] () { return i; } (); + + []{ return; }; + + int array[] = { 1, 2, 3 }; + int* p = [&] () { return array; } (); + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce2.C new file mode 100644 index 0000000..5cf016c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce2.C @@ -0,0 +1,11 @@ +// PR c++/43875 +// { dg-do compile { target c++11 } } + +void f(); +void f(int); + +int main() +{ + auto x1 = []{ return f; }; // { dg-error "return|overloaded" } + auto x2 = []{ return { 1, 2 }; }; // { dg-error "return|list" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg.C new file mode 100644 index 0000000..cefa24d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg.C @@ -0,0 +1,6 @@ +// { dg-do compile { target c++11 } } + +int main() +{ + [](int a = 1) { return a; }(); // { dg-error "" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg2.C new file mode 100644 index 0000000..35104c3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg2.C @@ -0,0 +1,7 @@ +// PR c++/43886 +// { dg-do compile { target c++11 } } + +void f2() { + int i = 1; + void g5(int = ([]{ return sizeof i; })()); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg3.C new file mode 100644 index 0000000..1c59393 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg3.C @@ -0,0 +1,19 @@ +// PR c++/55223 +// { dg-do compile { target c++11 } } +// { dg-options "-fabi-version=0" } +// { dg-final { scan-assembler "_ZN8functionC1IZN1CIiE4testES_Ed_UliE_EET_" } } + +struct function +{ + template <class U> function(U u) { } +}; + +template<typename T> struct C +{ + static T test(function f = [](int i){return i;}) { } +}; + +int main() +{ + C<int>::test(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg4.C new file mode 100644 index 0000000..2217954 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg4.C @@ -0,0 +1,8 @@ +// PR c++/54764 +// { dg-require-effective-target c++11 } + +template<class T = void> +struct c +{ + int (*f)(int) = [](int i){return i + i;}; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg5.C new file mode 100644 index 0000000..d85918d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg5.C @@ -0,0 +1,30 @@ +// PR c++/58083 +// { dg-do compile { target c++11 } } + +namespace details { +struct iterator_concept_checker +{ + typedef char yes_type; + typedef char (&no_type)[2]; + + template <typename T> + static no_type test(...); + + template <typename T> + static yes_type test( + int* + , void (*)(T) = [](T it) + { + auto copy = T{it}; // copy constructible + copy = it; // copy assignable + copy.~T(); // destroyable + ++it; // incrementable + } + ); +}; +} + +int main() +{ + details::iterator_concept_checker::test<int>(0); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-diag1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-diag1.C new file mode 100644 index 0000000..dc1043b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-diag1.C @@ -0,0 +1,8 @@ +// { dg-require-effective-target c++11 } + +int main() +{ + int x; + auto f = [x]{ }; + f.__x.foo; // { dg-error "<lambda\\(\\)>::<x capture>" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-direct-init.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-direct-init.C new file mode 100644 index 0000000..7cc3f8f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-direct-init.C @@ -0,0 +1,14 @@ +// Test that capture by copy uses direct-initialization. +// { dg-do compile { target c++11 } } + +struct A +{ + A(); + explicit A(const A&); +}; + +int main() +{ + A a; + [a]{}; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh.C new file mode 100644 index 0000000..7516fe0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh.C @@ -0,0 +1,35 @@ +// Test that we properly clean up if we get an exception in the middle of +// constructing the closure object. + +// This test fails because of PR 41449; it isn't a lambda issue. +// { dg-do run { xfail *-*-* } } +// { dg-require-effective-target c++11 } + +struct A +{ + A() {} + A(const A&) { throw 1; } +}; + +int bs; +struct B +{ + B() { ++bs; } + B(const B&) { ++bs; } + ~B() { --bs; } +}; + +int main() +{ + { + B b1, b2; + A a; + + try + { + [b1, a, b2]{ }; + } + catch(...) {} + } + return bs; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh2.C new file mode 100644 index 0000000..1ef510a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh2.C @@ -0,0 +1,17 @@ +// PR c++/47263 +// PR c++/49260 +// { dg-options "-fno-asynchronous-unwind-tables -fno-dwarf2-cfi-asm" } +// { dg-do run { target c++11 } } + +#include <exception> + +int main( void ) +{ + std::set_unexpected( []{ throw 0; } ); + try + { + []() throw( int ) { throw nullptr; }(); + } + catch( int ) + { } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh3.C new file mode 100644 index 0000000..10dc6e3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh3.C @@ -0,0 +1,14 @@ +// PR c++/56388 +// { dg-require-effective-target c++11 } + +int main() +{ + bool /*const*/ condition = false; + + [&]{ + try{} + catch(...){ + if(condition){} + } + }(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err1.C new file mode 100644 index 0000000..932ff1b --- /dev/null +++ b/gcc-4.9/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" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err2.C new file mode 100644 index 0000000..aaa80f4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err2.C @@ -0,0 +1,12 @@ +// PR c++/53158 +// { dg-do compile { target c++11 } } + +int main() +{ + auto a = []() { return true; }; + auto b = []() { return a(); }; // { dg-error "'a' is not captured" } + int c, d; + while (b() && c < d) // { dg-error "could not convert" } + { + } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err3.C new file mode 100644 index 0000000..fec01ac --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-err3.C @@ -0,0 +1,10 @@ +// PR c++/51412 +// { dg-do compile { target c++11 } } + +void foo(int); + +template<int> void bar() +{ + foo([]{}...); // { dg-error "<lambda>" } + foo([]{}=0 ...); // { dg-error "<lambda>" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc.C new file mode 100644 index 0000000..3dc7f87 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc.C @@ -0,0 +1,18 @@ +// Test that error messages about creating the closure object refer to +// the lambda-introducer. +// { dg-do compile { target c++11 } } + +struct A +{ + A(); + A(const A& a) = delete; // { dg-message "declared" } +}; + +int main() +{ + A ar[4][3]; + [ar] { }; // { dg-error "3:" } + + A a; + [a] { }; // { dg-error "3:" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc2.C new file mode 100644 index 0000000..4ddd38c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc2.C @@ -0,0 +1,19 @@ +// PR c++/42399 +// { dg-do compile { target c++11 } } + +struct A { + A(); + A(const A&) = delete; // { dg-message "declared" } +}; + +template <class T> +void f() +{ + T t; + [t] { return 0; }; // { dg-error "use" } +} + +int main() +{ + f<A>(); // { dg-message "required" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-field-names.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-field-names.C new file mode 100644 index 0000000..1c5cfdb --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-field-names.C @@ -0,0 +1,21 @@ +// "For each entity captured by copy, an unnamed non-static data member is +// declared in the closure type" -- test that there isn't a member of the +// closure with the same name as the captured variable. + +// { dg-do compile { target c++11 } } + +template <class T> +struct A: public T +{ + A(T t): T(t) { } + int f() { return this->i; } // { dg-error "" "no member named i" } +}; + +int main() +{ + int i = 42; + auto lam = [i]{ }; + lam.i = 24; // { dg-error "" "no member named i" } + A<decltype(lam)> a(lam); + return a.f(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-for.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-for.C new file mode 100644 index 0000000..0123034 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-for.C @@ -0,0 +1,13 @@ +// PR c++/50114 +// { dg-do compile { target c++11 } } +// { dg-options "-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-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice1.C new file mode 100644 index 0000000..e4a11ea --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice1.C @@ -0,0 +1,13 @@ +// PR c++/43790 +// { dg-do compile { target c++11 } } + +struct A +{ + int f(); +}; + +int main() +{ + A a; + auto l = [] () { return a.f(); }; // { dg-error "not captured|return" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice10.C new file mode 100644 index 0000000..1ea59c2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice10.C @@ -0,0 +1,8 @@ +// PR c++/58568 +// { dg-do compile { target c++11 } } + +template<int> struct A +{ + static const int i; + template<int N> const int A<N>::i = []{ return 0; }(); // { dg-error "invalid use" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice11.C new file mode 100644 index 0000000..58f0fa3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice11.C @@ -0,0 +1,12 @@ +// PR c++/60252 +// { dg-require-effective-target c++11 } + +struct A +{ + int i; // { dg-message "" } + + void foo() + { + [&](){ [&](int[i]){}; }; // { dg-error "" } + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice12.C new file mode 100644 index 0000000..d18aadf --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice12.C @@ -0,0 +1,15 @@ +// PR c++/54250 +// { dg-do compile { target c++11 } } + +struct T +{ + int a; + int foo() + { + return [&]()->int { + return [&](decltype(/*this->*/a) _)->int { + return 1; + }(a); + }(); + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice2.C new file mode 100644 index 0000000..6a31e0a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice2.C @@ -0,0 +1,17 @@ +// PR c++/42083 +// { dg-do compile { target c++11 } } + +template<typename F> +decltype(F()) run(F f) // { dg-message "note" } +{ + return f(); +} + +int main() +{ + 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-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice3.C new file mode 100644 index 0000000..03a7a4b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice3.C @@ -0,0 +1,23 @@ +// PR c++/47795 +// { dg-do compile { target c++11 } } + +class Klass +{ + unsigned int local; +public: + bool dostuff(); +}; + +bool Klass::dostuff() +{ + auto f = []() -> bool { + if (local & 1) { return true; } // { dg-error "not captured" } + return false; + }; +} + +int main() +{ + Klass c; + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice4.C new file mode 100644 index 0000000..8c08e90 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice4.C @@ -0,0 +1,14 @@ +// PR c++/47242 +// { dg-do compile { target c++11 } } + +template < typename > void +bar () +{ + [i]{}; // { dg-error "declared|invalid" } +} + +void +foo () +{ + bar<int>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice5.C new file mode 100644 index 0000000..914e0f7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice5.C @@ -0,0 +1,12 @@ +// PR c++/51227 +// { dg-do compile { target c++11 } } + +template<int> int foo() +{ + [] (void i) { return 0; } (0); // { dg-error "incomplete|invalid|no match" } +} + +void bar() +{ + foo<0>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice6.C new file mode 100644 index 0000000..408af42 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice6.C @@ -0,0 +1,4 @@ +// PR c++/51464 +// { dg-do compile { target c++11 } } + +template<int = sizeof([])> struct A {}; // { dg-error "lambda" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice7.C new file mode 100644 index 0000000..d0ee866 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice7.C @@ -0,0 +1,9 @@ +// PR c++/52487 +// { dg-do compile { target c++11 } } + +struct A; // { dg-error "forward declaration" } + +void foo(A& a) +{ + [=](){a;}; // { dg-error "invalid use of incomplete type" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice8.C new file mode 100644 index 0000000..00078d5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice8.C @@ -0,0 +1,10 @@ +// PR c++/51422 +// { dg-do compile { target c++11 } } + +template<typename> struct A {}; + +void foo() +{ + [i] { A<decltype(i)>(); }; // { dg-error "not declared|invalid" } + [i] { A<decltype(i)>(); }; // { dg-error "invalid" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice9.C new file mode 100644 index 0000000..0a88bc8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice9.C @@ -0,0 +1,18 @@ +// PR c++/53741 +// { dg-do compile { target c++11 } } + +struct X +{ + template <class T> static void bar() {} + + template <class T> void foo(T p) + { + [&] { bar<T>(); }; + } +}; + +int main() +{ + X x; + x.foo(3); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-in-class-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-in-class-neg.C new file mode 100644 index 0000000..92a165d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-in-class-neg.C @@ -0,0 +1,35 @@ +// { dg-do compile { target c++11 } } + +#include <cassert> + +class C { + private: + int m_i; + + public: + C() : m_i(-1) { + [] { this; } (); // { dg-error "not captured" } + [this] () -> void { m_i = 0; } (); + assert(m_i == 0); + [this] () -> void { this->m_i = 1; } (); + assert(m_i == 1); + [&] () -> void { m_i = 2; } (); + assert(m_i == 2); + [&] () -> void { this->m_i = 3; } (); + assert(m_i == 3); + [=] () -> void { m_i = 4; } (); // copies 'this' or --copies-m_i--? + assert(m_i == 4); + [=] () -> void { this->m_i = 5; } (); + assert(m_i == 5); + } + +}; + +int main() { + C c; + + [this] () -> void {} (); // { dg-error "use of 'this' in non-member function" } + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-in-class.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-in-class.C new file mode 100644 index 0000000..9298110 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-in-class.C @@ -0,0 +1,35 @@ +// { dg-do run { target c++11 } } + +#include <cassert> + +class C { + private: + int m_i; + + public: + C() : m_i(-1) { + //[] { this; } (); + [this] () -> void { m_i = 0; } (); + assert(m_i == 0); + [this] () -> void { this->m_i = 1; } (); + assert(m_i == 1); + [&] () -> void { m_i = 2; } (); + assert(m_i == 2); + [&] () -> void { this->m_i = 3; } (); + assert(m_i == 3); + [=] () -> void { m_i = 4; } (); // copies 'this' or --copies-m_i--? + assert(m_i == 4); + [=] () -> void { this->m_i = 5; } (); + assert(m_i == 5); + } + +}; + +int main() { + C c; + + //[this] () -> void {} (); // { dg-error: "cannot capture `this' outside of class method" } + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist1.C new file mode 100644 index 0000000..029576e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist1.C @@ -0,0 +1,12 @@ +// PR c++/50863 +// { dg-do compile { target c++11 } } + +struct T { + template<typename F> + T(F) { } +}; + +int main() +{ + T t{ []{ } }; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist2.C new file mode 100644 index 0000000..3c25f0e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist2.C @@ -0,0 +1,27 @@ +// PR c++/54947 +// { dg-do compile { target c++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-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist3.C new file mode 100644 index 0000000..f7b82ef --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist3.C @@ -0,0 +1,11 @@ +// PR c++/56567 +// { dg-require-effective-target c++11 } + +#include <initializer_list> + +int main() +{ + []{ return { 1, 2 }; }(); // { dg-error "initializer.list" } +} + +// { dg-prune-output "return-statement with a value" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-intname.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-intname.C new file mode 100644 index 0000000..4c268c6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-intname.C @@ -0,0 +1,6 @@ +// PR c++/54420 + +class __lambda +{ + virtual bool is_sub (); +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-lookup-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-lookup-neg.C new file mode 100644 index 0000000..a952526 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-lookup-neg.C @@ -0,0 +1,7 @@ +// Test that we don't crash on a failed lookup. +// { dg-do compile { target c++11 } } + +int main() +{ + [i]{}; // { dg-error "not declared" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle.C new file mode 100644 index 0000000..220817a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle.C @@ -0,0 +1,104 @@ +// Test lambda mangling +// { dg-require-weak "" } +// { dg-do compile { target c++11 } } +// { dg-options "-fno-inline" } + +template<typename F> int algo(F fn) { return fn(); } +inline void g(int n) { + int bef(int i = []{ return 1; }()); + // Default arguments of block-extern function declarations + // remain in the context of the encloding function body. + // The closure type is encoded as Z1giEUlvE_. + // The call operator of that type is _ZZ1giENKUlvE_clEv. + +// { dg-final { scan-assembler "_ZZ1giENKUlvE_clEv" } } +// { dg-final { scan-assembler "weak\[^\n\r\]*_?_ZZ1giENKUlvE_clEv" { target { ! { *-*-darwin* *-*-mingw* *-*-cygwin } } } } } + + algo([=]{return n+bef();}); + // The captured entities do not participate in <lambda-sig> + // and so this closure type has the same <lambda-sig> as + // the previous one. It encoding is therefore Z1giEUlvE0_ + // and the call operator is _ZZ1giENKUlvE0_clEv. The + // instance of "algo" being called is then + // _Z4algoIZ1giEUlvE0_EiT_. + +// { dg-final { scan-assembler "_Z4algoIZ1giEUlvE0_EiT_" } } +// { dg-final { scan-assembler "_ZZ1giENKUlvE0_clEv" } } + + int i = []{return 1;}(); + +} + +struct S { + void f(int = + // Type: ZN1S1fEiiEd0_UlvE_ + // Operator: _ZZN1S1fEiiEd0_NKUlvE_clEv +// { dg-final { scan-assembler "_ZZN1S1fEiiEd0_NKUlvE_clEv" } } +// { dg-final { scan-assembler "weak\[^\n\r\]*_?_ZZN1S1fEiiEd0_NKUlvE_clEv" { target { ! { *-*-darwin* *-*-mingw* *-*-cygwin } } } } } + []{return 1;}() + // Type: ZN1S1fEiiEd0_UlvE0_ + // Operator: _ZZN1S1fEiiEd0_NKUlvE0_clEv +// { dg-final { scan-assembler "_ZZN1S1fEiiEd0_NKUlvE0_clEv" } } + + []{return 2;}(), + int = + // Type: ZN1S1fEiiEd_UlvE_ + // Operator: _ZZN1S1fEiiEd_NKUlvE_clEv +// { dg-final { scan-assembler "_ZZN1S1fEiiEd_NKUlvE_clEv" } } + []{return 3;}()); +}; + +template<typename T> struct R { + static int x; +}; +template<typename T> int R<T>::x = []{return 1;}(); +template int R<int>::x; +// Type of lambda in intializer of R<int>::x: N1RIiE1xMUlvE_E +// Corresponding operator(): _ZNK1RIiE1xMUlvE_clEv +// { dg-final { scan-assembler "_ZNK1RIiE1xMUlvE_clEv" } } +// { dg-final { scan-assembler "weak\[^\n\r\]*_?_ZNK1RIiE1xMUlvE_clEv" { target { ! { *-*-mingw* *-*-cygwin } } } } } + +void bar() +{ + // lambdas in non-vague linkage functions have internal linkage. + // { dg-final { scan-assembler-not "weak\[^\n\r\]*bar\[^\n\r\]*Ul" } } + []{}(); +} + +// lambdas used in non-template, non-class body initializers are internal. +// { dg-final { scan-assembler-not "weak\[^\n\r\]*_ZNKUlv" } } +// { dg-final { scan-assembler-not "weak\[^\n\r\]*variable" } } +int variable = []{return 1;}(); + +// And a template instantiated with such a lambda is also internal. +// { dg-final { scan-assembler-not "weak\[^\n\r\]*algoIUl" } } +int var2 = algo([]{return 1;}); + +// As are lambdas used in non-class-body default arguments. +// { dg-final { scan-assembler-not "weak\[^\n\r\]*function" } } +void function (int i = []{return 1;}()+[]{return 1;}()); + +struct Foo +{ + static int Int; + void Bar(int); +}; + +int Foo::Int = []{return 1;}(); +// Even default arguments for member functions that appear outside the +// class body are internal. +// { dg-final { scan-assembler-not "weak\[^\n\r\]*Foo" } } +void Foo::Bar(int i = []{return 1;}()) {} + +// Even default arguments for function templates. +// { dg-final { scan-assembler-not "weak\[^\n\r\]*fn2\[^\n\r\]*Ulv" } } +template <class T> +void fn2 (T t = []{return 1;}()) {} + +int main() +{ + g(42); + S().f(); + function(); + Foo().Bar(); + fn2<int>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle2.C new file mode 100644 index 0000000..54309a9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle2.C @@ -0,0 +1,20 @@ +// PR c++/49276 +// { dg-do compile { target c++11 } } + +template <int N> +struct F +{ + template <typename U> F (U); +}; + +struct S +{ + void foo (F <0> x = [] {}) {} +}; + +int +main () +{ + S s; + s.foo (); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle3.C new file mode 100644 index 0000000..5f17a21 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle3.C @@ -0,0 +1,15 @@ +// PR c++/51818 +// { dg-do compile { target c++11 } } +// { dg-final { scan-assembler "_ZN1AC1IN3foo3barMUlvE_EEET_" } } + +struct A +{ + template <class T> A(T) { } +}; + +struct foo +{ + A bar = []{}; +}; + +foo f; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle4.C new file mode 100644 index 0000000..0d37637 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle4.C @@ -0,0 +1,13 @@ +// PR c++/54538 +// { dg-do compile { target c++11 } } + +template <class T> +struct A +{ + // { dg-final { scan-assembler "_ZNK1AIcE1pMUlvE_cvPFvvEEv" } } + // { dg-final { scan-assembler "_ZNK1AIiE1pMUlvE_cvPFvvEEv" } } + void (*p)() = []{}; +}; + +A<int> a1; +A<char> a2; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mixed.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mixed.C new file mode 100644 index 0000000..d3f4341 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mixed.C @@ -0,0 +1,12 @@ +// { dg-do run { target c++11 } } +#include <cassert> + +int main() { + int i = 1, j = 2; + [&i, j] () mutable -> void { i = 0; j = 0; } (); + assert(i == 0); + assert(j == 2); + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mutable.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mutable.C new file mode 100644 index 0000000..2c6b0f2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mutable.C @@ -0,0 +1,15 @@ +// { dg-do run { target c++11 } } +#include <cassert> + +int main() { + int i = 1; + const char* s1 = "hello"; + const char* s2 = s1; + [i, s2] () mutable -> void { i = 2; s2 = "world"; } (); + //[i, s2] () -> void { i = 2; s2 = "world"; } (); // { dg-error: "assignment of data-member in read-only structure" } + assert(i == 1); + assert(s1 == s2); + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mutable2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mutable2.C new file mode 100644 index 0000000..c54ff5c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mutable2.C @@ -0,0 +1,23 @@ +// PR c++/55532 +// { dg-do compile { target c++11 } } + +struct Foo { + void doit() { + } +}; + +template<typename T> +void oops(Foo &foo, const T &) { + auto fun = [&] () mutable { + foo.doit(); + }; + auto fun2 = [=]() { + fun(); // { dg-error "" } + }; + fun2(); +} + +int main() { + Foo foo; + oops(foo, 1); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-names1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-names1.C new file mode 100644 index 0000000..a09af89 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-names1.C @@ -0,0 +1,10 @@ +// PR c++/56710 +// { dg-do compile { target c++11 } } +// { dg-options "-Wall" } + +int main() +{ + int t = 0; + return [&]() -> int {int __t; __t = t; return __t; }(); + return [&t]() -> int {int __t; __t = t; return __t; }(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested.C new file mode 100644 index 0000000..c8ea46a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested.C @@ -0,0 +1,62 @@ +// { dg-do run { target c++11 } } + +#include <cassert> + +struct A { + int i; + A(): i(42) { } + int f() { + return [this]{ + return [=]{ return i; }(); + }(); + } +}; + +int main() { + int i = 1; + + [] (int& i) -> void { + [&] () -> void { + i = 2; + } (); + } (i); + + assert(i == 2); + + [&] () -> void { + [&i] () -> void { + i = 3; + } (); + } (); + + assert(i == 3); + + [&] () -> void { + [&] () -> void { + i = 4; + } (); + } (); + + assert(i == 4); + i = 4; + + [&] () -> void { + [=] () mutable -> void { + i = 5; + } (); + } (); + + assert(i == 4); + + [=] () mutable -> void { + [&] () -> void { + i = 6; + } (); + } (); + + assert(i == 4); + + assert (A().f() == 42); + + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested2.C new file mode 100644 index 0000000..9e50951 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested2.C @@ -0,0 +1,31 @@ +// Testcase from N2998 +// { dg-do compile { target c++11 } } + +void f1(int i) { + int const N = 20; + auto m1 = [=]{ + int const M = 30; + auto m2 = [i]{ + int x[N][M]; // OK: N and M are not "used" + x[0][0] = i; // OK: i is explicitly captured by m2 + // and implicitly captured by m1 + }; + }; + struct s1 { + int f; + int work(int n) { + int m = n*n; + int j = 40; + auto m3 = [this,m]{ + /*auto m4=*/[&,j]{ // { dg-error "j. is not captured" } + int x = n; // { dg-error "n. is not captured" } + x += m; // OK: m implicitly captured by m4 + // and explicitly captured by m3 + x += i; // { dg-error "i. is not captured" } + x += f; // OK: this captured implicitly by m4 + // and explicitly by m3 + }; + }; + } + }; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested3.C new file mode 100644 index 0000000..f7894fb --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested3.C @@ -0,0 +1,12 @@ +// PR c++/41896 +// { dg-do compile { target c++11 } } + +void nested_lambda() +{ + float val; + + [val]() + { + [val](){}; + }; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested4.C new file mode 100644 index 0000000..140ed30 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested4.C @@ -0,0 +1,9 @@ +// PR c++/47687 +// { dg-do compile { target c++11 } } + +template <class T> struct A { }; + +auto inl = []{ return []{}; }(); +typedef decltype(inl) inlt; + +A<inlt> a; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-non-const.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-non-const.C new file mode 100644 index 0000000..b5a335e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-non-const.C @@ -0,0 +1,18 @@ +// { dg-do run { target c++11 } } + +#include <cassert> + +template<typename F> +void call(F f) { f(); } + +int main() { + call([] () -> void {}); + call([] () mutable -> void {}); + + int i = -1; + call([i] () mutable -> void { i = 0; }); + assert(i == -1); + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nop.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nop.C new file mode 100644 index 0000000..4a04cfb --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nop.C @@ -0,0 +1,18 @@ +// { dg-do run { target c++11 } } +#include <cassert> + +int main() { + int i = 1, j = 2; + [i, j] () -> void {} (); + assert(i == 1); + assert(j == 2); + [&i, &j] () -> void {} (); + assert(i == 1); + assert(j == 2); + [] (int x) -> void {} (1); + [] (int& x) -> void {} (i); + [] (int x, int y) -> void {} (i, j); + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ns-scope.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ns-scope.C new file mode 100644 index 0000000..4729bb3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ns-scope.C @@ -0,0 +1,17 @@ +// { dg-do run { target c++11 } } + +auto f = [](int i) { return i+1; }; + +int g(int i = [] { return 237; }()) +{ + return i; +} + +int main() +{ + if (f(41) != 42) + return 1; + if (g() != 237) + return 2; + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi1.C new file mode 100644 index 0000000..94dc254 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi1.C @@ -0,0 +1,10 @@ +// PR c++/56464 +// { dg-do run { target c++11 } } + +struct bug { bug*a = [&]{ return [=]{return this;}(); }(); }; +int main() +{ + bug b; + if (b.a != &b) + __builtin_abort (); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi2.C new file mode 100644 index 0000000..73106d7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi2.C @@ -0,0 +1,4 @@ +// PR c++/56565 +// { dg-do compile { target c++11 } } + +struct bug { int a; int *b = [&]{ return &a; }(); }; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi3.C new file mode 100644 index 0000000..da7e0bf --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi3.C @@ -0,0 +1,9 @@ +// PR c++/55972 +// { dg-do compile { target c++11 } } + +class C +{ + void f(); + int j = 10; + int i = [this]() { return this->j; }(); +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi4.C new file mode 100644 index 0000000..b592f15 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi4.C @@ -0,0 +1,14 @@ +// PR c++/51927 +// { dg-do compile { target c++11 } } + +struct function +{ + template<typename Functor> + function(Functor); +}; + +struct testee +{ + function l1 = []() { }; + function l2 = [=]() { l1; }; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi5.C new file mode 100644 index 0000000..1d2778f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi5.C @@ -0,0 +1,7 @@ +// PR c++/58596 +// { dg-do compile { target c++11 } } + +struct A +{ + int i = [] { return decltype(i)(); }(); +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nullptr.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nullptr.C new file mode 100644 index 0000000..1aadbb4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nullptr.C @@ -0,0 +1,47 @@ +// PR c++/54170 +// { dg-do run { target c++11 } } + +#include <cassert> + +struct A; +typedef A* ptr; +typedef int (A::*pmf) (int); +typedef int (A::*pdm); + +int total; + +void add(int n) +{ + total += n; +} + +template <typename RType, typename Callable> +RType Call(Callable native_func, int arg) +{ + return native_func(arg); +} + +template <typename RType> +RType do_test(int delta) +{ + return Call<RType>([=](int delta) { add(delta); return nullptr; }, delta); +} + +template <typename RType> +void test() +{ + total = 0; + assert (!do_test<RType>(5)); + assert (total == 5); + assert (!do_test<RType>(20)); + assert (total == 25); + assert (!do_test<RType>(-256)); + assert (total == -231); +} + +int main() +{ + test<ptr>(); + test<pdm>(); + test<pmf>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-pass.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-pass.C new file mode 100644 index 0000000..d904ebe --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-pass.C @@ -0,0 +1,26 @@ +// { dg-do run { target c++11 } } + +#include <cassert> +#include <algorithm> + +template <typename F, typename A1> +void call(F f, const A1& arg1) { + f(arg1); +} + +int main() { + int i = 1; + call( + [&i] (int j) -> void { i = j; }, + 2 + ); + assert(i == 2); + + int A[] = {1, 2, 3, 4}; + int sum = 0; + std::for_each(A, A+4, [&sum] (int n) -> void { sum += n; }); + assert(sum == 10); + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-qualified.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-qualified.C new file mode 100644 index 0000000..40b539a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-qualified.C @@ -0,0 +1,17 @@ +// PR c++/50089 +// { dg-do compile { target c++11 } } + +struct TestBase +{ + void foo() {} +}; + +struct Test : TestBase +{ + void foo() + { + [this]{ + /*this->*/TestBase::foo(); // ICE without this-> + }(); + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-recursive.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-recursive.C new file mode 100644 index 0000000..cbaeb16 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-recursive.C @@ -0,0 +1,20 @@ +// { dg-do run { target c++11 } } + +//#include <iostream> +#include <functional> +#include <cassert> + +int main() { + + std::function<int(int)> fib = [&fib] (int n) -> int { + //std::cerr << "fib(" << n << ")\n"; + if (n <= 2) return 1; + else return fib(n-1) + fib(n-2); + }; + + assert(fib(5) == 5); + assert(fib(10) == 55); + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref-default.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref-default.C new file mode 100644 index 0000000..6b86369 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref-default.C @@ -0,0 +1,14 @@ +// { dg-do run { target c++11 } } + +#include <cassert> + +int main() { + int i = 1; + float j = 2.0; + [&] () -> void { i = 3; j = 4.0; } (); + assert(i == 3); + assert(j == 4.0); + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref.C new file mode 100644 index 0000000..def13fd --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref.C @@ -0,0 +1,14 @@ +// { dg-do run { target c++11 } } + +#include <cassert> + +int main() { + int i = 1; + float j = 2.0; + [&i, &j] () -> void { i = 3; j = 4.0; } (); + assert(i == 3); + assert(j == 4.0); + + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref2.C new file mode 100644 index 0000000..49705f5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref2.C @@ -0,0 +1,12 @@ +// PR c++/49598 +// { dg-do run { target c++11 } } + +int +main() +{ + int i = 10; + int& ir = i; + + if ([=]{ return ir; }() != 10) + return 1; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-return1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-return1.C new file mode 100644 index 0000000..4b353b6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-return1.C @@ -0,0 +1,26 @@ +// PR c++/57437 +// { dg-require-effective-target c++11 } + +struct A { + int i; + + A(): i(42) {} + A(const A&) = default; + A(A&& a): i(a.i) { a.i = 0; } +}; + +int main() +{ + A x; + + auto y = [x] () mutable { + x.i++; + return x; + }; + + if (y().i != 43) + __builtin_abort (); + + if (y().i != 44) + __builtin_abort (); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-sfinae1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-sfinae1.C new file mode 100644 index 0000000..973f8a7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-sfinae1.C @@ -0,0 +1,55 @@ +// PR c++/56039 +// { dg-do compile { target c++11 } } + +template <bool> struct BoolSink { typedef void type; }; + +template <typename T, typename U> +struct AddRvalueReferenceImpl { typedef T type; }; + +template <typename T> +struct AddRvalueReferenceImpl<T, typename BoolSink<false && + [] { + extern T &&tref; + }>::type> { // { dg-error "lambda" } + typedef T &&type; +}; + +template <typename T> +struct AddRvalueReference : AddRvalueReferenceImpl<T, void> { }; + +namespace ImplHelpers { + template <typename T> + typename AddRvalueReference<T>::type create(void) { } +} + +template <typename T, typename U, typename ...Args> +struct IsConstructibleImpl { enum { value = 0 }; }; + +template <typename T, typename ...Args> +struct IsConstructibleImpl<T, typename BoolSink<false && + [] { + T t( ::ImplHelpers::create<Args>() ...); + }>::type, Args ...> { // { dg-error "lambda" } + enum { value = 1 }; +}; + +template <typename T, typename ...Args> +struct IsConstructible : IsConstructibleImpl<T, void, Args ...> { }; + +struct DestroyMe { + ~DestroyMe() = delete; +}; + +static_assert(+IsConstructible<int>::value, "error"); +static_assert(!IsConstructible<void>::value, "error"); +static_assert(+IsConstructible<int [1]>::value, "error"); +static_assert(!IsConstructible<DestroyMe>::value, "error"); +static_assert(!IsConstructible<int *, char *>::value, "error"); + +static_assert(+IsConstructible<int &&, int>::value, "error"); +static_assert(!IsConstructible<int &&, int &>::value, "error"); +static_assert(+IsConstructible<int &&, int &&>::value, "error"); + +// { dg-prune-output "expected" } +// { dg-prune-output "does not name a class" } +// { dg-prune-output "static assertion" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-shadow1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-shadow1.C new file mode 100644 index 0000000..fcfc39e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-shadow1.C @@ -0,0 +1,10 @@ +// PR c++/55357 +// { dg-do compile { target c++11 } } +// { dg-options "-Wshadow" } + +int main() { + int x = 1; // { dg-message "shadowed" } + auto const lambda = [](int x) { // { dg-warning "shadows" } + return x; + }; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-shadow2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-shadow2.C new file mode 100644 index 0000000..6c042ca --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-shadow2.C @@ -0,0 +1,11 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-Wshadow" } + +struct A +{ + int i; + void f() + { + [=]{ int i; }; // { dg-warning "shadows" } + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-std-function.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-std-function.C new file mode 100644 index 0000000..a410384 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-std-function.C @@ -0,0 +1,21 @@ +// Test using std::function wrapper. +// { dg-do run { target c++11 } } + +#include <functional> + +typedef std::function<int()> FN; + +template<typename T> +FN f(T fn) +{ + return [fn]{return fn(2);}; +} + +int main() +{ + auto fn = f([](int i){return i*21;}); + + if (fn() != 42) + return 1; + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-switch.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-switch.C new file mode 100644 index 0000000..1cac211 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-switch.C @@ -0,0 +1,26 @@ +// PR c++/49867 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-syntax1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-syntax1.C new file mode 100644 index 0000000..cb3ca94 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-syntax1.C @@ -0,0 +1,5 @@ +// PR c++/46124 +// { dg-do compile { target c++11 } } + +void foo() { [] () -> void (); } // { dg-error "returning a function" "returning" } +// { dg-error "expected .\{" "expected" { target *-*-* } 4 } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template.C new file mode 100644 index 0000000..66cc7a4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template.C @@ -0,0 +1,40 @@ +// { dg-do run { target c++11 } } + +extern "C" void abort(); + +template <class T> +auto apply (T t) -> decltype (t()) +{ + return t(); +} + +template <class T> +T f(T t) +{ + T t2 = t; + if (t != [=]()->T { return t; }()) + abort (); + if (t != [=] { return t; }()) + abort (); + if (t != [=] { return t2; }()) + abort (); + if (t != [&] { return t; }()) + abort (); + if (t != apply([=]{return t;})) + abort (); + + int i; + [&] (int a) { return a+i+t; } (0); + [&] (int a) -> decltype(a) { return a+i+t; } (0); + [&] (int a) -> decltype(i) { return a+i+t; } (0); + [&] (int a) -> decltype(t) { return a+i+t; } (0); + [&] (int a) -> decltype(a+i) { return a+i+t; } (0); + [&] (int a) -> decltype(a+t) { return a+i+t; } (0); + [&] (int a) -> decltype(i+t) { return a+i+t; } (0); + [&] (int a) -> decltype(a+i+t) { return a+i+t; } (0); +} + +int main() +{ + f(0xbeef); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template10.C new file mode 100644 index 0000000..4fcc965 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template10.C @@ -0,0 +1,23 @@ +// PR c++/50276 +// { dg-options "-Wuninitialized" } +// { dg-do run { target c++11 } } + +template<typename T> +unsigned testfun(const T& func) +{ + return func(); +} + +template<int i> +unsigned test() +{ + if (unsigned value = testfun( [] () { return 0; })) + return value; + return i; +} + +int main() +{ + if (test<42>() != 42) + __builtin_abort (); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template11.C new file mode 100644 index 0000000..520b804 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template11.C @@ -0,0 +1,25 @@ +// PR c++/56915 +// { dg-require-effective-target c++11 } + +template <typename T> +class A +{ + typename T::type b(); // { dg-error "int" } +}; + +template <typename T, typename U> +void waldo(T, U) {} + +template <typename T> +void bar() +{ + waldo([](A<T> a){ return a; }, + []{}); +} + +int main() +{ + bar<int>(); +} + +// { dg-prune-output "used but never defined" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template12.C new file mode 100644 index 0000000..635af97 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template12.C @@ -0,0 +1,19 @@ +// PR c++/57568 +// { dg-require-effective-target c++11 } + +template < class T > +struct remove_reference +{ typedef int type; }; +template < class T > +class X +{ + enum Q { }; + bool f () + { + Q a; + [&a]{ + typename remove_reference < decltype (a) >::type t; + }; + } +}; +template class X< int >; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template2.C new file mode 100644 index 0000000..29f63af --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template2.C @@ -0,0 +1,20 @@ +// PR c++/47049 +// { dg-do compile { target c++11 } } + +enum { E = 0, F = 1 }; +template <int N, int M = ((N == 1) ? F : E)> class S {}; +template <int N> +struct T +{ + static void + foo (S<N> *p) + { + S<N> u; + [&u] ()->bool {} (); + } +}; + +int main() +{ + T<0>().foo(0); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template3.C new file mode 100644 index 0000000..dea9e0e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template3.C @@ -0,0 +1,33 @@ +// PR c++/49554 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template4.C new file mode 100644 index 0000000..a65727a --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template5.C new file mode 100644 index 0000000..b91b89f --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template6.C new file mode 100644 index 0000000..5e85619 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template7.C new file mode 100644 index 0000000..5b098d0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template7.C @@ -0,0 +1,5 @@ +// PR c++/53783 +// { dg-do compile { target c++11 } } + +template <class T> void foo() { [] { [] {}; }; } +int main() { foo<void>(); } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template8.C new file mode 100644 index 0000000..720941d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template8.C @@ -0,0 +1,7 @@ +// PR c++/55680 +// { dg-do compile { target c++11 } } + +template <class T> struct X { + static void (* code ) (); +}; +template <> void (* X<int>::code ) () = [](){}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template9.C new file mode 100644 index 0000000..c1d010b --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this.C new file mode 100644 index 0000000..b32f8d7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this.C @@ -0,0 +1,13 @@ +// Test that implicit 'this' capture works, but that it's still an rvalue. +// { dg-do compile { target c++11 } } + +struct A +{ + int i; + void f() + { + [=] { i = 0; }; + [&] { i = 0; }; + [=] { this = 0; }; // { dg-error "lvalue" } + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this10.C new file mode 100644 index 0000000..b4b8e72 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this10.C @@ -0,0 +1,4 @@ +// PR c++/54383 +// { dg-do compile { target c++11 } } + +auto foo = [&](int a) { return a > this->b; }; // { dg-error "this" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this11.C new file mode 100644 index 0000000..2618295 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this11.C @@ -0,0 +1,22 @@ +// PR c++/51494, c++/56222 +// Uses of static members and creating pointers to members aren't odr-uses +// of 'this'. +// { dg-do compile { target c++11 } } + +struct A +{ + static void f() {} + static int i; + int j; + void f(int); + + void foo() + { + [] () { + ++i; + f(); + &A::j; + (void(*)())&A::f; + }; + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this12.C new file mode 100644 index 0000000..ef573b1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this12.C @@ -0,0 +1,13 @@ +// Uses of 'this' in unevaluated context are not odr-uses. +// { dg-do compile { target c++11 } } + +struct A +{ + int f() {} + int i; + + void foo() + { + [] () { sizeof(i); sizeof(f()); }; + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this13.C new file mode 100644 index 0000000..090d0a1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this13.C @@ -0,0 +1,20 @@ +// PR c++/52374 +// { dg-do compile { target c++11 } } + +struct B +{ + int get() const { return 42; } +}; + +template<typename X> +struct D + : public X +{ + int get() const { return [this]() -> int { return X::get(); }(); } +}; + +int main() +{ + D<B> d; + d.get(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this14.C new file mode 100644 index 0000000..9834bfd --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this14.C @@ -0,0 +1,49 @@ +// PR c++/52014 +// { dg-require-effective-target c++11 } + +template <class Iterator, class Func> +void for_each(const Iterator first, const Iterator last, Func func) +{ + for (Iterator it = first; it != last; ++it) { + func(*it); + } +} + +template <class T> +struct helper +{ + typedef typename T::size_type type; +}; + +template <class T> +struct helper<T&> +{ + typedef typename T::size_type type; +}; + +template <class T> +struct helper<T*> +{ + typedef typename T::size_type type; +}; + +struct bar +{ + struct foo + { + typedef int size_type; + } foo_; + + void test() + { + int arr[] = { 1, 2, 3 }; + for_each(arr, arr + 3, [&](helper<foo>::type i) { + for_each(arr, arr + 3, [&](helper<decltype(foo_)>::type j) { }); + }); + } +}; + +int main() +{ + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this15.C new file mode 100644 index 0000000..d44bec9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this15.C @@ -0,0 +1,12 @@ +// PR c++/56692 +// { dg-require-effective-target c++11 } + +struct Class { + void f () { } + static void f (int) { } +}; + +int main () +{ + []{ Class::f(0); }; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this16.C new file mode 100644 index 0000000..736d5f5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this16.C @@ -0,0 +1,28 @@ +// PR c++/56699 +// { dg-require-effective-target c++11 } + +struct A +{ + int a; +}; + +struct T +{ + int x; + + T() : x([]{ + sizeof(::A::a); + return 0; + }()) + {} +}; + +struct B +{ + int a; +}; + +void f() +{ + []{sizeof(B::a);}; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this17.C new file mode 100644 index 0000000..2386e6b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this17.C @@ -0,0 +1,21 @@ +// PR c++/58481 +// { dg-require-effective-target c++11 } + +struct Test { + template<typename... Args> inline void triggerTest (Args&&... fargs) { } +}; + +struct TestPickled : Test { + template<typename... Args> void triggerTest (Args&&... fargs) { + [=](Args... as) { + Test::triggerTest (as...); + } (); + } +}; + +int main() +{ + TestPickled test; + test.triggerTest (); + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this2.C new file mode 100644 index 0000000..5029a4a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this2.C @@ -0,0 +1,17 @@ +// PR c++/43856 +// Test for implicit 'this' capture via rewriting. +// { dg-do compile { target c++11 } } + +struct S1 { + int operator()(int); + int i; + void g(); + void f() { + [=]() { + i; + g(); + S1::g(); + operator()(42); + }; + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this3.C new file mode 100644 index 0000000..2defa99 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this3.C @@ -0,0 +1,14 @@ +// PR c++/45520 +// { dg-do compile { target c++11 } } + +struct M { + int i; +}; + +struct S { + M m; + + void f() { + auto lambda=[&](decltype(m.i) & i) { }; + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this4.C new file mode 100644 index 0000000..f14a272 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this4.C @@ -0,0 +1,13 @@ +// PR c++/48523 +// { dg-do compile { target c++11 } } + +template<typename> +struct X +{ + bool b; + + void f() + { + [this]{ return b; }; + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this5.C new file mode 100644 index 0000000..8974641 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this5.C @@ -0,0 +1,22 @@ +// PR c++/53619 +// { dg-do run { target c++11 } } + +struct C { + int x; +}; +struct B { + int q; +}; +struct A : public B , C { + void foo(); +}; + +void A::foo() { + auto k = [this]() {return (void *)(&x);}; + if (k() != (void*)&x) + __builtin_abort(); +} + +int main(int l, char **) { + A a; a.foo(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this6.C new file mode 100644 index 0000000..8c35126 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this6.C @@ -0,0 +1,32 @@ +// PR c++/53137 +// { dg-do compile { target 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-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this7.C new file mode 100644 index 0000000..ee20203 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this7.C @@ -0,0 +1,11 @@ +// PR c++/54122 +// { dg-do compile { target 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-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this8.C new file mode 100644 index 0000000..d7c5d2c --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this9.C new file mode 100644 index 0000000..07ddd08 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-type.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-type.C new file mode 100644 index 0000000..a0c17ad --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-type.C @@ -0,0 +1,74 @@ +// Every id-expression that is a use (_basic.def.odr_ 3.2) of an entity +// captured by copy is transformed into an access to the corresponding +// unnamed data member of the closure type. +//... +// Every occurrence of decltype((x)) where x is a possibly parenthesized +// id-expression that names an entity of automatic storage duration is +// treated as if x were transformed into an access to a corresponding data +// member of the closure type that would have been declared if x were a use +// of the denoted entity. + +// So, other appearances of 'x' within decltype do not refer to the closure +// member, because they are not "use"s in the sense of 3.2. + +// { dg-do compile { target c++11 } } + +template<class T, class U> +struct same_type; +template <class T> +struct same_type<T,T> { }; + +int main() +{ + int i; + [=] { + same_type<decltype(i),int>(); + same_type<decltype((i)),int const&>(); + i+1; + same_type<decltype((i)),int const&>(); + same_type<decltype(i),int>(); + }; + [=] { + same_type<decltype(i),int>(); + same_type<decltype((i)),int const&>(); + same_type<decltype(i),int>(); + }; + [=] () mutable { + same_type<decltype(i),int>(); + same_type<decltype((i)),int &>(); + same_type<decltype(i),int>(); + }; + [&] { + same_type<decltype(i),int>(); + same_type<decltype((i)),int &>(); + same_type<decltype(i),int>(); + }; + [i] { + same_type<decltype(i),int>(); + same_type<decltype((i)),int const&>(); + }; + [&,i] { + same_type<decltype(i),int>(); + same_type<decltype((i)),int const&>(); + }; + [i] () mutable { + same_type<decltype(i),int>(); + same_type<decltype((i)),int &>(); + }; + [&,i] () mutable { + same_type<decltype(i),int>(); + same_type<decltype((i)),int &>(); + }; + [&i] { + same_type<decltype(i),int>(); + same_type<decltype((i)),int &>(); + }; + [=,&i] { + same_type<decltype(i),int>(); + same_type<decltype((i)),int &>(); + }; + [] { + same_type<decltype(i),int>(); + same_type<decltype((i)),int const&>(); // { dg-error "" "not captured" } + }; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-typedef.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-typedef.C new file mode 100644 index 0000000..e1d1b50 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-typedef.C @@ -0,0 +1,26 @@ +// PR c++/54975 +// { dg-do compile { target c++11 } } + +template<typename T> +struct identity +{ + typedef T type; +}; + +template<typename T> +void f() +{ + typedef typename T::type A; + int i = 42; + int const &cri = i; + int volatile &vri = i; + [&]() { + A const &x = cri; // Problem here + A volatile &y = vri; // Likewise + }; +} + +int main() +{ + f<identity<int> >(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval.C new file mode 100644 index 0000000..898f685 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval.C @@ -0,0 +1,7 @@ +// 5.1.2/2: A lambda-expression shall not appear in an unevaluated operand. +// { dg-do compile { target c++11 } } + +template <class T> +struct A { }; +A<decltype([]{ return 1; }())> a; // { dg-error "lambda.*unevaluated context" } + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use.C new file mode 100644 index 0000000..73677c0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } + +int main(int argc, char** argv) +{ + int i; + int &ir = i; + const int ci = 1; + const int &cir = ci; + + [] { sizeof (argc); sizeof (i); sizeof (ir); sizeof (ci); sizeof (cir); }; + [] { int ia[ci]; }; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use2.C new file mode 100644 index 0000000..96af09c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use2.C @@ -0,0 +1,12 @@ +// PR c++/50224 +// { dg-do compile { target c++11 } } +// { dg-options "-Wunused-parameter" } + +struct T; + +void m(T& t) // ERROR here +{ + [&]{ + t; // ``t`` is referenced here + }; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-variadic1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-variadic1.C new file mode 100644 index 0000000..e85f2bc --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-variadic1.C @@ -0,0 +1,15 @@ +// PR c++/49672 +// { dg-do compile { target c++11 } } + +template<typename ... Args> +static void foo() +{ + [](Args..., int x) { + x; + }; +} + +int main() +{ + foo(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-variadic2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-variadic2.C new file mode 100644 index 0000000..fab1f6c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-variadic2.C @@ -0,0 +1,57 @@ +// { dg-do run { target c++11 } } + +int g() { return 0; } +template <class T, class... U> +int g(T t, U... u) +{ + return t + g(u...); +} + +template <class... T> +int f1(T... t) +{ + return [t...] { + return g(t...); + }(); +} + +template <class... T> +int f2(T... t) +{ + return [&t...] { + return g(t...); + }(); +} + +template <class... T> +int f3(T... t) +{ + return [=] { + return g(t...); + }(); +} + +template <class... T> +int f4(T... t) +{ + return [&] { + return g(t...); + }(); +} + +#define assert(E) do { if (!(E)) __builtin_abort(); } while(0) +int main() +{ + assert (f1() == 0); + assert (f2() == 0); + assert (f3() == 0); + assert (f4() == 0); + assert (f1(42) == 42); + assert (f2(42) == 42); + assert (f3(42) == 42); + assert (f4(42) == 42); + assert (f1(1,2,3) == 6); + assert (f2(1,2,3) == 6); + assert (f3(1,2,3) == 6); + assert (f4(1,2,3) == 6); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn1.C new file mode 100644 index 0000000..f86c4b6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn1.C @@ -0,0 +1,9 @@ +// PR c++/41920 +// { dg-do compile { target c++11 } } +// { dg-options "-Wall -Wextra" } + +int foo(int i) +{ + auto bar = [=](){ return i; }; + return bar(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn2.C new file mode 100644 index 0000000..6542392 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn2.C @@ -0,0 +1,8 @@ +// PR c++/42370 +// { dg-do compile { target c++11 } } +// { dg-options "-Wall" } + +void foo() +{ + []{ return 0; }(); +} // { dg-bogus "no return statement" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn3.C new file mode 100644 index 0000000..5c5b24c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn3.C @@ -0,0 +1,13 @@ +// PR c++/49482 +// { dg-do compile { target c++11 } } +// { dg-options "-Wunused-but-set-parameter" } + +template<class T> +void f() { + []( bool b ){ return b; }; +} + +int main() +{ + f<int>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn4.C new file mode 100644 index 0000000..059c198 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn4.C @@ -0,0 +1,8 @@ +// PR c++/52845 +// { dg-do compile { target c++11 } } +// { dg-options "-Wall" } + +void f() +{ + [](){}; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/linkage2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/linkage2.C new file mode 100644 index 0000000..5285868 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/linkage2.C @@ -0,0 +1,33 @@ +// DR 743: A type without linkage shall not be used as the type of a +// variable or function with linkage, unless +// o the variable or function has extern "C" linkage (7.5 [dcl.link]), or +// o the variable or function is not used (3.2 [basic.def.odr]) or is +// defined in the same translation unit. + +// { dg-do compile { target c++11 } } + +template <typename T> struct B { + void g(T){} + void h(T); // { dg-error "never defined" } + friend void i(B, T){} + static T t1; // { dg-error "never defined" } + static T t2; +}; + +template <typename T> T B<T>::t2 = { }; + +enum { E1 } e1; // OK, defined +extern enum { E2 } e2; // { dg-error "never defined" } +extern "C" enum { E3 } e3; // OK, extern "C" + +void f() { + struct A { int x; }; // no linkage + A a = {1}; + B<A> ba; // declares B<A>::g(A) and B<A>::h(A) + ba.t1 = a; // error, B<T>::t never defined + ba.t2 = a; // OK + ba.g(a); // OK + ba.h(a); // error, B<T>::h never defined + i(ba, a); // OK + e1+e2+e3; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/local-targ1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/local-targ1.C new file mode 100644 index 0000000..588149a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/local-targ1.C @@ -0,0 +1,31 @@ +// PR c++/51884 +// { dg-do compile { target c++11 } } +// { dg-final { scan-assembler "_ZN1BIZN3fooIivE3barILb1EEEvvE1CEC1ERKS4_" } } + +template<typename TT> + struct test { static const int value = 0; }; +template<int I> + struct enable_if { typedef void type; }; + +struct A { virtual void f() {} }; +template<typename U> struct B : A { B(); B(const B&); }; +template<typename U> B<U>::B() { } +template<typename U> B<U>::B(const B&) { } + +template<class T> void g(T) { } + +template<typename T, typename = void> struct foo; +template<typename T> +struct foo<T,typename enable_if<test<T>::value>::type> +{ + template <bool P> void bar() { + struct C { } c; + B<C> b; + g(b); + } +}; + +int main() { + foo<int> f; + f.bar<true>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/long_long.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/long_long.C new file mode 100644 index 0000000..6a602c6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/long_long.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-pedantic" } + +void foo() +{ + long long x = 17; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/move1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/move1.C new file mode 100644 index 0000000..5b9b17e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/move1.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } + +#include <utility> + +class A { }; + +static void g ( A && ) { } + +template < class T > class B { +public: + void f ( ) { + A a; + g ( std :: move ( a ) ); + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/named.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/named.C new file mode 100644 index 0000000..7bd2093 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/named.C @@ -0,0 +1,41 @@ +// { dg-do link { target c++11 } } + +template<typename _Tp> +inline _Tp&& +movel(_Tp& __t) +{ return static_cast<_Tp&&>(__t); } + +struct S {}; +struct T +{ + T(S && s_) : s(movel(s_)) {} + S && get() { return movel(s); } + operator S&&() { return movel(s); } + S && s; + S s2; +}; + +void named(S const &) {} +void named(S&&); + +void unnamed(S const &); +void unnamed(S&&) {} + +void f(S && p) +{ + S && s(movel(p)); + T t(movel(s)); + + named(s); // variable reference + named(p); // parameter reference + named(t.s); // class member access + + 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-4.9/gcc/testsuite/g++.dg/cpp0x/named_refs.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/named_refs.C new file mode 100644 index 0000000..850179c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/named_refs.C @@ -0,0 +1,28 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test: Named rvalue references are treated as lvalues. + +// { dg-do compile { target c++11 } } +// { dg-skip-if "packed attribute missing for struct one" { "epiphany-*-*" } { "*" } { "" } } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {long x[1];}; +struct two {long x[2];}; + +struct A {}; + +one foo(const A&) {return one();} +two foo(A&&) {return two();} + +int test1(A&& a) +{ + sa<sizeof(foo(a)) == 1 * sizeof(long)> t1; + return 0; +} + +int main() +{ + return test1(A()); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/new1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/new1.C new file mode 100644 index 0000000..2f002db --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/new1.C @@ -0,0 +1,8 @@ +// PR c++/52216 +// { dg-require-effective-target c++11 } + +#include <new> + +int n; + +static_assert(!noexcept(::new (std::nothrow) int[n]), ""); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept01.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept01.C new file mode 100644 index 0000000..9f42535 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept01.C @@ -0,0 +1,84 @@ +// Test for noexcept-expression +// { dg-do compile { target c++11 } } +// { dg-options "-O2" } + +#include <typeinfo> + +#define SA(X) static_assert(X, #X) + +void f(); +void g() throw(); +SA(noexcept(g())); +SA(!noexcept(f())); +SA(!noexcept(throw 1)); +SA(noexcept(42)); + +struct A +{ + virtual ~A(); +}; + +struct B: public A +{ + virtual ~B(); +}; + +A* ap; + +struct C { }; +C* cp; + +SA (noexcept (dynamic_cast<B*>(ap))); +SA (!noexcept (dynamic_cast<B&>(*ap))); +SA (!noexcept (typeid (*ap))); +SA (noexcept (typeid (*cp))); + +SA (!noexcept (true ? 1 : throw 1)); +SA (!noexcept (true || true ? 1 : throw 1)); + +SA (noexcept (C())); + +struct D +{ + D() throw(); +}; + +SA (noexcept (D())); + +struct E +{ + E() throw(); + ~E(); +}; + +SA (noexcept (E())); + +struct F +{ + virtual void f(); +}; + +SA (noexcept (F())); + +struct G +{ + G() = default; + ~G() = default; +}; + +SA (noexcept (G())); + +template <class T, bool b> +void tf() +{ + SA (noexcept (T()) == b); +} + +template void tf<int,true>(); +template void tf<E, true>(); + +// Make sure that noexcept uses the declared exception-specification, not +// any knowledge we might have about whether or not the function really +// throws. +void h() { } +SA(!noexcept(h())); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept02.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept02.C new file mode 100644 index 0000000..5d5867a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept02.C @@ -0,0 +1,54 @@ +// Test for noexcept-specification +// { dg-do compile { target c++11 } } + +#define SA(X) static_assert(X, #X) + +void f(); +void f() noexcept(false); +void f() noexcept(1 == 0); +void f(); + +SA(!noexcept(f())); + +void g() throw (int); // { dg-error "previous declaration" } +void g() noexcept(false); // { dg-error "different exception" } +void g(); + +void h() throw(); +void h() noexcept; +void h() throw(); +void h() noexcept; + +template <class T> +void g (T) noexcept(noexcept(T())); // { dg-error "previous declaration" } +template <class T> +void g (T) noexcept(noexcept(T(0))); // { dg-error "different exception" } + +template <class T> +void f (T) noexcept(noexcept(T()) && noexcept(T())); +template <class T> +void f (T) noexcept(noexcept(T()) && noexcept(T())); +template <class T> +void f2(T a) noexcept (noexcept (f (a))); + +struct A { A(); }; +SA(noexcept(f(1))); +SA(!noexcept(f(A()))); +SA(noexcept(f2(1))); +SA(!noexcept(f2(A()))); + +template <class... Ts> +void f3(Ts... ts) noexcept (noexcept (f(ts...))); + +SA(noexcept(f3(1))); +SA(!noexcept(f3(A()))); + +template <class T1, class T2> +void f (T1, T2) noexcept(noexcept(T1(), T2())); + +struct B { }; + +SA(noexcept(f3(1,B()))); +SA(!noexcept(f3(1,A()))); +SA(!noexcept(f3(A(),1))); +SA(!noexcept(f3(A(),A()))); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept03.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept03.C new file mode 100644 index 0000000..2d37867 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept03.C @@ -0,0 +1,52 @@ +// Runtime test for noexcept-specification. +// { dg-options "-Wnoexcept" } +// { dg-do run { target nonpic } } +// { dg-require-effective-target c++11 } + +#include <exception> +#include <cstdlib> + +void my_terminate () +{ + std::exit (0); +} + +void my_unexpected () +{ + throw; +} + +void g() { throw 1; } +void (*p)() = g; +void f () noexcept (false) +{ + p(); +} + +template <class T> +void f(T) noexcept (noexcept (T())) // { dg-warning "false" } +{ + p(); +} + +template <class T> +void f2(T a) noexcept (noexcept (f (a))) +{ + f(a); +} + +struct A { A() { } }; // { dg-warning "does not throw" } + +int main() +{ + // noexcept(false) allows throw. + try { f(); } catch (int) { } + // noexcept(noexcept(A())) == noexcept(false). + try { f(A()); } catch (int) { } + try { f2(A()); } catch (int) { } + + std::set_terminate (my_terminate); + // noexcept(noexcept(int())) == noexcept(true). + try { f2(1); } catch (...) { } + return 1; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept04.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept04.C new file mode 100644 index 0000000..56ea1f4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept04.C @@ -0,0 +1,30 @@ +// Make sure that we call terminate when a noexcept spec is violated. +// The function pointers are there to make sure that +// the compiler doesn't get clever about optimizing the calls based on +// knowledge about the called functions. + +// { dg-do run { target c++11 } } + +#include <exception> +#include <cstdlib> + +void my_terminate () +{ + std::exit (0); +} + +void g() { throw 1; } +void (*p1)() = g; +void f() noexcept { p1(); } +void (*p2)() = f; +void h() { p2(); } + +int main() +{ + std::set_terminate (my_terminate); + + try { h(); } + catch (int) { } + + return 1; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept05.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept05.C new file mode 100644 index 0000000..a6c425d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept05.C @@ -0,0 +1,19 @@ +// Make sure that we force an LSDA for a noexcept spec so +// that the personality routine will call terminate. Also check that we +// optimize away the EH cleanup for var because the personality routine +// will call terminate before unwinding: there should not be an EH region +// (i.e. LEHB/LEHE labels) around the call to g(). + +// { dg-final { scan-assembler-not "_ZSt9terminatev" } } +// { dg-final { scan-assembler-not "EHB" } } +// { dg-final { scan-assembler "LSDA" } } + +// { dg-do compile { target c++11 } } + +struct A { ~A(); }; +void g(); +void f() noexcept +{ + A var; + g(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept06.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept06.C new file mode 100644 index 0000000..7e1db66 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept06.C @@ -0,0 +1,29 @@ +// Test that checking of a nothrow specification uses the one on the +// definition. +// { dg-do run { target c++11 } } + +#include <exception> +#include <cstdlib> + +void my_unexpected () +{ + std::abort (); +} +void my_terminate () +{ + std::exit (0); +} + +void f() throw(); +void f() noexcept +{ + throw 1; +} + +int main() +{ + std::set_unexpected (my_unexpected); + std::set_terminate (my_terminate); + f(); + return 1; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept07.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept07.C new file mode 100644 index 0000000..90c50a9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept07.C @@ -0,0 +1,24 @@ +// Test that checking of a nothrow specification uses the one on the +// definition. +// { dg-do run { target c++11 } } + +#include <exception> +#include <cstdlib> + +void my_unexpected () +{ + std::exit (0); +} + +void f() noexcept; +void f() throw() +{ + throw 1; +} + +int main() +{ + std::set_unexpected (my_unexpected); + f(); + return 1; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept08.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept08.C new file mode 100644 index 0000000..96af0fe --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept08.C @@ -0,0 +1,56 @@ +// { dg-do compile { target c++11 } } +// { dg-prune-output "overriding" } + +struct A +{ + virtual void f(); + virtual void g() throw(); + virtual void h() noexcept; + virtual void i() noexcept(false); + virtual void j() throw(int); +}; + +struct B: A +{ + void f() noexcept; + void g() noexcept; + void h() noexcept; + void i() noexcept; + void j() noexcept; +}; + +struct C: A +{ + void f() throw(); + void g() throw(); + void h() throw(); + void i() throw(); + void j() throw(); +}; + +struct D: A +{ + void f() noexcept(false); + void g() noexcept(false); // { dg-error "looser" } + void h() noexcept(false); // { dg-error "looser" } + void i() noexcept(false); + void j() noexcept(false); // { dg-error "looser" } +}; + +struct E: A +{ + void f() throw(int); + void g() throw(int); // { dg-error "looser" } + void h() throw(int); // { dg-error "looser" } + void i() throw(int); + void j() throw(int); +}; + +struct F: A +{ + void f(); + void g(); // { dg-error "looser" } + void h(); // { dg-error "looser" } + void i(); + void j(); // { dg-error "looser" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept09.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept09.C new file mode 100644 index 0000000..d26a3ae --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept09.C @@ -0,0 +1,15 @@ +// Test that -Wnoexcept works with templates +// { dg-do compile { target c++11 } } +// { dg-options "-Wnoexcept" } + +template <class T> +T f (T t) { return t; } // { dg-warning "does not throw" } + +#define SA(X) static_assert(X, #X) + +SA (!noexcept(f(1))); // { dg-warning "noexcept" } + +int main() +{ + f(1); // Use f(int) so it gets instantiated +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept10.C new file mode 100644 index 0000000..b802282 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept10.C @@ -0,0 +1,27 @@ +// PR c++/49082 +// { dg-do compile { target c++11 } } + +namespace std { template <class T> T&& declval() noexcept; } + +struct Base +{ + Base(const Base&) noexcept(false); + Base(Base&&) noexcept(false); + ~Base() noexcept(false); +}; + +struct Derived +: Base +{ + // Derived(const Derived&) = default; + // Derived(Derived&&) = default; +}; + +static_assert(!noexcept(Base(std::declval<const Base&>())), "Error"); +static_assert(!noexcept(Derived(std::declval<const Derived&>())), "Error"); // Error + +static_assert(!noexcept(Base(std::declval<Base&&>())), "Error"); +static_assert(!noexcept(Derived(std::declval<Derived&&>())), "Error"); // Error + +static_assert(!noexcept(std::declval<Base&>().~Base()), "Error"); // OK +static_assert(!noexcept(std::declval<Derived&>().~Derived()), "Error"); // Error diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept11.C new file mode 100644 index 0000000..6597f40 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept11.C @@ -0,0 +1,53 @@ +// PR c++/49107 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept12.C new file mode 100644 index 0000000..185364b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept12.C @@ -0,0 +1,11 @@ +// Test that we handle merging with deferred noexcept. +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept13.C new file mode 100644 index 0000000..e52e9a0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept13.C @@ -0,0 +1,78 @@ +// PR c++/49107 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept14.C new file mode 100644 index 0000000..913f2ef --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept14.C @@ -0,0 +1,4 @@ +// PR c++/50309 +// { dg-do compile { target c++11 } } + +void foo () noexcept () { } // { dg-error "expected" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept15.C new file mode 100644 index 0000000..909ee97 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept15.C @@ -0,0 +1,34 @@ +// PR c++/50391 +// { dg-do compile { target c++11 } } + +#include <type_traits> + +template<class Tp> + struct single + { + Tp elem; // { dg-error "incomplete type" } + + constexpr single(const Tp& e) + : elem(e) { } + + single(single&& s) + noexcept(std::is_nothrow_move_constructible<Tp>::value) + : elem(s.elem) { } + }; + +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-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept16.C new file mode 100644 index 0000000..10e0be9 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept17.C new file mode 100644 index 0000000..b27acef --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept17.C @@ -0,0 +1,54 @@ +// PR c++/50043 +// { dg-do compile { target c++11 } } + +struct True1 {}; +struct True2 { ~True2(); }; +struct True3 { ~True3(){ throw 0; } }; +struct False { ~False() noexcept(false); }; + +template <typename Base> +struct A : Base +{ +}; + +template <typename Member> +struct B +{ + Member mem; +}; + +template <typename Base, typename Member> +struct C : Base +{ + Member mem; +}; + +#define SA(X) static_assert(X, #X) + +SA( noexcept(True1())); +SA( noexcept(True2())); +SA( noexcept(True3())); +SA(!noexcept(False())); + +SA( noexcept(A<True1>())); +SA( noexcept(A<True2>())); +SA( noexcept(A<True3>())); +SA(!noexcept(A<False>())); + +SA( noexcept(B<True1>())); +SA( noexcept(B<True2>())); +SA( noexcept(B<True3>())); +SA(!noexcept(B<False>())); + +SA( noexcept(C<True1, True2>())); +SA( noexcept(C<True1, True3>())); +SA( noexcept(C<True2, True3>())); +SA( noexcept(C<True2, True1>())); +SA( noexcept(C<True3, True1>())); +SA( noexcept(C<True3, True2>())); +SA(!noexcept(C<False, True1>())); +SA(!noexcept(C<False, True2>())); +SA(!noexcept(C<False, True3>())); +SA(!noexcept(C<True1, False>())); +SA(!noexcept(C<True2, False>())); +SA(!noexcept(C<True3, False>())); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept18.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept18.C new file mode 100644 index 0000000..e851b86 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept18.C @@ -0,0 +1,10 @@ +// PR c++/54207 +// { dg-do compile { target c++11 } } + +typedef bool B; +constexpr B foo () { return true; } + +void +bar () noexcept (foo ()) +{ +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept19.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept19.C new file mode 100644 index 0000000..d303a8c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept19.C @@ -0,0 +1,28 @@ +// PR c++/55652 +// { dg-do compile { target 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-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept20.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept20.C new file mode 100644 index 0000000..ec4f3a1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept20.C @@ -0,0 +1,22 @@ +// PR c++/56071 +// { dg-do compile { target 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-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept21.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept21.C new file mode 100644 index 0000000..ec88e1d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept21.C @@ -0,0 +1,87 @@ +// PR c++/57645 +// { dg-do compile { target c++11 } } + +struct Thrower +{ + ~Thrower() noexcept(false) { throw 1; } +}; + +struct ExplicitA +{ + ~ExplicitA() {} + + Thrower t; +}; + +struct ExplicitB +{ + ~ExplicitB(); + + Thrower t; +}; + +ExplicitB::~ExplicitB() {} + +struct ExplicitC +{ + ~ExplicitC() = default; + + Thrower t; +}; + +struct ExplicitD +{ + ~ExplicitD(); + + Thrower t; +}; + +ExplicitD::~ExplicitD() = default; + +struct NoThrower +{ + ~NoThrower() noexcept(true) {} +}; + +struct ExplicitE +{ + ~ExplicitE() {} + + NoThrower t; +}; + +struct ExplicitF +{ + ~ExplicitF(); + + NoThrower t; +}; + +ExplicitF::~ExplicitF() {} + +struct ExplicitG +{ + ~ExplicitG() = default; + + NoThrower t; +}; + +struct ExplicitH +{ + ~ExplicitH(); + + NoThrower t; +}; + +ExplicitH::~ExplicitH() = default; + +#define SA(X) static_assert(X, #X) + +SA( !noexcept(ExplicitA()) ); +SA( !noexcept(ExplicitB()) ); +SA( !noexcept(ExplicitC()) ); +SA( !noexcept(ExplicitD()) ); +SA( noexcept(ExplicitE()) ); +SA( noexcept(ExplicitF()) ); +SA( noexcept(ExplicitG()) ); +SA( noexcept(ExplicitH()) ); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept22.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept22.C new file mode 100644 index 0000000..7aab0f4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept22.C @@ -0,0 +1,21 @@ +// PR c++/60046 +// { dg-require-effective-target c++11 } + +constexpr bool foo () { return noexcept (true); } +template <typename T> +struct V +{ + void bar (V &) noexcept (foo ()) {} +}; +template <typename T> +struct W : public V <int> +{ + void bar (W &x) { V <int>::bar (x); } +}; + +int +main () +{ + W <int> a, b; + a.bar (b); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nolinkage1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nolinkage1.C new file mode 100644 index 0000000..d38028c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nolinkage1.C @@ -0,0 +1,21 @@ +// DR 757 allows using types without linkage in declarations with linkage. +// Test that this doesn't lead to link-time collisions. + +// { dg-additional-sources "nolinkage1a.cc" } +// { dg-do link { target c++11 } } + +#include "nolinkage1.h" + +typedef struct { int i; } *AP; + +void f(AP) { } + +A<AP> a; + +static void g() +{ + struct B { }; + A<B> a; +} + +int main() { g(); f(0); } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nolinkage1.h b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nolinkage1.h new file mode 100644 index 0000000..3cb5f63 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nolinkage1.h @@ -0,0 +1,8 @@ +template <class T> +struct A +{ + A(); +}; + +template <class T> +A<T>::A() { } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nolinkage1a.cc b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nolinkage1a.cc new file mode 100644 index 0000000..f8528f3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nolinkage1a.cc @@ -0,0 +1,15 @@ +#include "nolinkage1.h" + +typedef struct { double d; } *BP; + +void f(BP) { } + +A<BP> b; + +static void g() +{ + struct B { }; + A<B> a; +} + +int dummy() { g(); f(0); } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/not_special.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/not_special.C new file mode 100644 index 0000000..22054ea --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/not_special.C @@ -0,0 +1,52 @@ +// 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 cause compiler declared +// copy ctor or assignment to be deleted. + +// { dg-do compile { target c++11 } } + +#include <assert.h> + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {char x[1];}; +struct two {char x[2];}; + +int copy = 0; +int assign = 0; + +struct base +{ + base() {} + base(const base&) {++copy;} + base& operator=(const base&) {++assign; return *this;} +}; + +struct derived // { dg-message "declares a move" } + : base +{ + derived() {} + derived(derived&&) {} + derived& operator=(derived&&) {return *this;} +}; + +int test1() +{ + derived d; + derived d2(static_cast<derived&&>(d)); // should not call base::(const base&) + assert(copy == 0); + 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 "deleted" } + assert(assign == 1); + return 0; +} + +int main() +{ + return test1(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-const1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-const1.C new file mode 100644 index 0000000..b5b8dab --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-const1.C @@ -0,0 +1,10 @@ +// PR c++/50707 +// { dg-do compile { target c++11 } } + +int g; + +struct S { + int const v=g; +}; + +S s; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer1.C new file mode 100644 index 0000000..e1b9d69 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer1.C @@ -0,0 +1,14 @@ +// { dg-do compile { target c++11 } } + +#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-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer2.C new file mode 100644 index 0000000..96ed2c8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer2.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +struct A +{ + int i = f(); + static int f(int i = 42) { return i; } +}; + +A a; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer3.C new file mode 100644 index 0000000..90f9102 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer3.C @@ -0,0 +1,19 @@ +// Do NSDMI get deferred instantiation? +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer4.C new file mode 100644 index 0000000..60ca88d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer4.C @@ -0,0 +1,17 @@ +// { dg-do run { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer5.C new file mode 100644 index 0000000..a83d40b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer5.C @@ -0,0 +1,20 @@ +// PR c++/51666 (DR 325) +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer6.C new file mode 100644 index 0000000..033c142 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer6.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } + +struct A // { dg-error "non-static data member" } +{ + int i = (A(), 42); // { dg-message "required here" } +}; + +A a; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-eh1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-eh1.C new file mode 100644 index 0000000..edcf588 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-eh1.C @@ -0,0 +1,18 @@ +// Core issue 1351 +// { dg-do run { xfail *-*-* } } +// { dg-require-effective-target c++11 } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-list1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-list1.C new file mode 100644 index 0000000..e54be05 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-list1.C @@ -0,0 +1,14 @@ +// PR c++/50563 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-list2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-list2.C new file mode 100644 index 0000000..d366986 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-list2.C @@ -0,0 +1,32 @@ +// PR c++/50930 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-list3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-list3.C new file mode 100644 index 0000000..a554f93 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-list3.C @@ -0,0 +1,21 @@ +// PR c++/54998 +// { dg-do compile { target c++11 } } + +class Foo { +public: +private: + static const int kRows = 4; + static const int kCols = 4; + + union { + float m_n[kRows][kCols]; + float m_m[kRows * kCols] = { + 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f + }; + }; +}; + +Foo myFoo; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-local.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-local.C new file mode 100644 index 0000000..2330365 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-local.C @@ -0,0 +1,8 @@ +// PR c++/55240 +// { dg-do compile { target c++11 } } + +int main() +{ + int q = 1; // { dg-message "declared here" } + struct test { int x = q; } instance; // { dg-error "local variable" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-sizeof.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-sizeof.C new file mode 100644 index 0000000..fac979b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-sizeof.C @@ -0,0 +1,7 @@ +// PR c++/57673 +// { dg-do compile { target c++11 } } + +template< int ... p > +struct d { + int n = sizeof ... ( p ); +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template1.C new file mode 100644 index 0000000..7316dc6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template1.C @@ -0,0 +1,20 @@ +// { dg-do run { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template2.C new file mode 100644 index 0000000..fcb405c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template2.C @@ -0,0 +1,15 @@ +// PR c++/50614 +// { dg-do compile { target c++11 } } +// { dg-options "-fcompare-debug" } + +struct A +{ + int f (); +}; + +template <int> struct B : A +{ + int i = this->f (); +}; + +B<0> b; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template3.C new file mode 100644 index 0000000..8a6f913 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template3.C @@ -0,0 +1,16 @@ +// PR c++/58760 +// { dg-do compile { target c++11 } } + +enum en +{ + a,b,c +}; + +struct B +{ + template<en N> + struct A + { + const int X = N; + }; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template4.C new file mode 100644 index 0000000..ff8dc7e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template4.C @@ -0,0 +1,24 @@ +// PR c++/57887 +// { dg-do compile { target c++11 } } + +struct B +{ + template<int N> + struct A + { + int X = N; + }; +}; + +template<int M> +struct C +{ + int Y = M; + + template<int N> + struct A + { + int X = N; + int Y = M; + }; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template5.C new file mode 100644 index 0000000..fdaf461 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template5.C @@ -0,0 +1,38 @@ +// PR c++/58599 +// { dg-do compile { target c++11 } } + +template<int> struct A1; + +template<> struct A1<0> +{ + template<typename, typename...> struct B1 + { + template<typename> int foo1() {} + + int i1 = foo1<int>(); + }; +}; + +template<int> struct A2; + +template<> struct A2<0> +{ + template<typename, typename> struct B2 + { + template<typename> int foo2() {} + + int i2 = foo2<int>(); + }; +}; + +template<int> struct A3; + +template<> struct A3<0> +{ + template<typename> struct B3 + { + template<typename> int foo3() {} + + int i3 = foo3<int>(); + }; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template6.C new file mode 100644 index 0000000..33ed82d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template6.C @@ -0,0 +1,13 @@ +// PR c++/58829 +// { dg-do compile { target c++11 } } + +struct A { + int f() {return 0;} +} a; + +struct B { + template<int=0> struct C { + int i = a.f(); + }; +}; +B::C<> c; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template7.C new file mode 100644 index 0000000..cec7b7b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template7.C @@ -0,0 +1,15 @@ +// PR c++/58725 +// { dg-do compile { target c++11 } } + +struct A { + template<int=0> + struct B { + struct C { + int x = 0; + double y = x; + } c; + }; +}; +int main() { + A::B<>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template8.C new file mode 100644 index 0000000..ef0dddd --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-template8.C @@ -0,0 +1,27 @@ +// PR c++/58188 +// { dg-do compile { target c++11 } } + +struct B {}; +struct A +{ + A( B ); +}; + +struct Bar +{ + template< unsigned v > + struct Foo + { + A z = B(); + unsigned value; + Foo(): value( v ) {} + }; + + struct Baz + { + Foo< 8 > foo1; + Foo< 1 > foo3; + }; +}; + +Bar::Baz baz; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union1.C new file mode 100644 index 0000000..11bdd88 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union1.C @@ -0,0 +1,25 @@ +// PR c++/52377 +// { dg-do run { target c++11 } } + +union Test +{ + int a{4}; +}; + +union B +{ + int i = 42; + double d; + B() = default; + B(double d): d(d) { } +}; + +int main() +{ + Test t; + B b; + B b2(4.2); + + if (t.a != 4 || b.i != 42 || b2.d != 4.2) + __builtin_abort(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union2.C new file mode 100644 index 0000000..0692327 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union2.C @@ -0,0 +1,18 @@ +// PR c++/52377 +// { dg-require-effective-target c++11 } + +union A // { dg-error "multiple" } +{ + int i = 4; + int j = 2; +}; + +A a; + +union B +{ + int i,j; + B(): i(1), j(2) {} // { dg-error "multiple" } +}; + +B b; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union3.C new file mode 100644 index 0000000..35f6509 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union3.C @@ -0,0 +1,10 @@ +// PR c++/58965 +// { dg-require-effective-target c++11 } + +void foo() +{ + static union + { + int i = i; + }; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union4.C new file mode 100644 index 0000000..c21fdca --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union4.C @@ -0,0 +1,12 @@ +// PR c++/59269 +// { dg-require-effective-target c++11 } + +union U +{ + int& i = 0; // { dg-error "reference" } +}; + +void foo() +{ + U(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union5.C new file mode 100644 index 0000000..57dfd59 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-union5.C @@ -0,0 +1,11 @@ +// PR c++/58701 +// { dg-require-effective-target c++11 } +// { dg-final { scan-assembler "7" } } + +static union +{ + union + { + int i = 7; + }; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-virtual1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-virtual1.C new file mode 100644 index 0000000..aeafe1c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-virtual1.C @@ -0,0 +1,25 @@ +// PR c++/51611 +// { dg-do run { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-virtual2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-virtual2.C new file mode 100644 index 0000000..157854c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi-virtual2.C @@ -0,0 +1,8 @@ +// PR c++/51474 +// { dg-do compile { target c++11 } } + +struct A +{ + virtual int foo() = 0; + int i = foo(); // { dg-warning "pure virtual" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi1.C new file mode 100644 index 0000000..976b8f4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi1.C @@ -0,0 +1,52 @@ +// { dg-do run { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi2.C new file mode 100644 index 0000000..31a638f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi2.C @@ -0,0 +1,21 @@ +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi3.C new file mode 100644 index 0000000..a8e8cdf --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi3.C @@ -0,0 +1,18 @@ +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi4.C new file mode 100644 index 0000000..6f97b06 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi4.C @@ -0,0 +1,23 @@ +// { dg-do run { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi5.C new file mode 100644 index 0000000..bade28f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi5.C @@ -0,0 +1,20 @@ +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi6.C new file mode 100644 index 0000000..e78f500 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi6.C @@ -0,0 +1,8 @@ +// Origin PR c++/51477 +// { dg-do compile { target 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-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi7.C new file mode 100644 index 0000000..4b08474 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi7.C @@ -0,0 +1,17 @@ +// PR c++/53594 +// { dg-do compile { target c++11 } } +// { dg-options "-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-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi8.C new file mode 100644 index 0000000..f89bec6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi8.C @@ -0,0 +1,8 @@ +// PR c++/55670 +// { dg-do compile { target c++11 } } + +template <class T> using F = T; +struct X { + F<void ()>* fp = nullptr; +}; +int main () { return 0; } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi9.C new file mode 100644 index 0000000..febe0ec --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nsdmi9.C @@ -0,0 +1,13 @@ +// PR c++/58162 +// { dg-require-effective-target c++11 } + +struct A { + A(); + A(A&&); +}; + +struct B { + A const a = A(); +}; + +B b; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr01.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr01.C new file mode 100644 index 0000000..90917d7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr01.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +// Test assignment to pointer + +char* const cp1 = nullptr; +char* const cp2 = __null; +char* const cp3 = 0; +decltype(nullptr) mynull = 0; +char* const cp4 = mynull; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr02.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr02.C new file mode 100644 index 0000000..50b3d07 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr02.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } + +// Test assignment to nullptr_t + +typedef decltype(nullptr) nullptr_t; + +const nullptr_t np1 = nullptr; +const nullptr_t np2 = __null; +const nullptr_t np3 = 0; +const nullptr_t np4 = np1; +const nullptr_t np5 = np2; +const nullptr_t np6 = np3; +const nullptr_t np7 = np4; +const nullptr_t np8 = np5; +const nullptr_t np9 = np6; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr03.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr03.C new file mode 100644 index 0000000..cc3c031 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr03.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } + +// Test assignment to int + +const int n1 = nullptr; // { dg-error "cannot convert " } +decltype(nullptr) mynull = 0; +const int n2 = mynull; // { dg-error "cannot convert " } + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr04.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr04.C new file mode 100644 index 0000000..372ac51 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr04.C @@ -0,0 +1,16 @@ +// { dg-do compile { target c++11 } } + +// Test cast to int + +__extension__ typedef __INTPTR_TYPE__ intptr_t; + +const int n4 = static_cast<const int>(nullptr); // { dg-error "invalid static_cast " } +const short int n5 = reinterpret_cast<short int>(nullptr); // { dg-error "loses precision" } +const intptr_t n6 = reinterpret_cast<intptr_t>(nullptr); +const intptr_t n7 = (intptr_t)nullptr; + +decltype(nullptr) mynull = 0; +const int n8 = static_cast<const int>(mynull); // { dg-error "invalid static_cast " } +const short int n9 = reinterpret_cast<short int>(mynull); // { dg-error "loses precision" } +const intptr_t n10 = reinterpret_cast<intptr_t>(mynull); +const intptr_t n11 = (intptr_t)mynull; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr05.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr05.C new file mode 100644 index 0000000..65121b6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr05.C @@ -0,0 +1,13 @@ +// { dg-do compile { target c++11 } } + +// Test assignment to method pointer + +class F { }; + +typedef void (F::*pmf)(); + +const pmf pmf1 = nullptr; +const pmf pmf2 = __null; +const pmf pmf3 = 0; +decltype(nullptr) mynull = 0; +const pmf pmf4 = mynull; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr06.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr06.C new file mode 100644 index 0000000..e933c35 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr06.C @@ -0,0 +1,14 @@ +// { dg-do compile { target c++11 } } + +// Test compare to pointer + +#define assert_true(b) do { char c[2 * bool(b) - 1]; } while(0) + +char* const cp1 = nullptr; + +void fun() +{ + assert_true(cp1 == nullptr); + decltype(nullptr) mynull = 0; + assert_true(cp1 == mynull); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr07.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr07.C new file mode 100644 index 0000000..b2ef515 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr07.C @@ -0,0 +1,14 @@ +// { dg-do compile { target c++11 } } + +// Test compare to int + +void fun() +{ + int n = 0; + if( n == nullptr ); // { dg-error "invalid operands of types " } + const int m = 1; + if( m == nullptr ); // { dg-error "invalid operands of types " } + decltype(nullptr) mynull = 0; + if( n == mynull ); // { dg-error "invalid operands of types " } + if( m == mynull ); // { dg-error "invalid operands of types " } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr08.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr08.C new file mode 100644 index 0000000..dbf1632 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr08.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } + +// Test conversion to bool + +#define assert_true(b) do { char c[2 * bool(b) - 1]; } while(0) + +void fun() +{ + assert_true(nullptr ? false : true); + decltype(nullptr) mynull = 0; + assert_true(mynull ? false : true); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr09.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr09.C new file mode 100644 index 0000000..1422a35 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr09.C @@ -0,0 +1,10 @@ +// { dg-do compile { target c++11 } } + +// Test compare to literal 0 + +void fun() +{ + if( nullptr == 0 ); + decltype(nullptr) mynull = 0; + if( mynull == 0 ); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr10.C new file mode 100644 index 0000000..e27d658 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr10.C @@ -0,0 +1,13 @@ +// { dg-do compile { target c++11 } } + +// Test arithmetic operations + +void fun() +{ + nullptr = 0; // { dg-error "lvalue required as left operand" } + nullptr + 2; // { dg-error "invalid operands of types " } + decltype(nullptr) mynull = 0; + mynull = 1; // { dg-error "cannot convert" } + mynull = 0; + mynull + 2; // { dg-error "invalid operands of types " } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr11.C new file mode 100644 index 0000000..f81f0c3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr11.C @@ -0,0 +1,39 @@ +// { dg-do compile { target c++11 } } + +// Test relational operators + +#define assert_true(b) do { char c[2 * bool(b) - 1]; } while(0) +#define assert_false(b) do { char c[1 - 2 * bool(b)]; } while(0) + +void fun() +{ + assert_true(nullptr == nullptr); + assert_false(nullptr != nullptr); + assert_false(nullptr < nullptr); + assert_false(nullptr > nullptr); + assert_true(nullptr <= nullptr); + assert_true(nullptr >= nullptr); + + decltype(nullptr) mynull = 0; + + assert_true(mynull == nullptr); + assert_false(mynull != nullptr); + assert_false(mynull < nullptr); + assert_false(mynull > nullptr); + assert_true(mynull <= nullptr); + assert_true(mynull >= nullptr); + + assert_true(nullptr == mynull); + assert_false(nullptr != mynull); + assert_false(nullptr < mynull); + assert_false(nullptr > mynull); + assert_true(nullptr <= mynull); + assert_true(nullptr >= mynull); + + assert_true(mynull == mynull); + assert_false(mynull != mynull); + assert_false(mynull < mynull); + assert_false(mynull > mynull); + assert_true(mynull <= mynull); + assert_true(mynull >= mynull); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr12.C new file mode 100644 index 0000000..4397082 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr12.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } + +// Test sizeof + +static_assert(sizeof(nullptr) == sizeof(void*), "sizeof(nullptr) is wrong"); +const decltype(nullptr) mynull = 0; +static_assert(sizeof(mynull) == sizeof(void*), "sizeof(nullptr) is wrong"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr13.C new file mode 100644 index 0000000..e788c16 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr13.C @@ -0,0 +1,12 @@ +// { dg-do run { target c++11 } } + +// Test typeid + +#include <typeinfo> + +int main() +{ + const decltype(nullptr) mynull = 0; + if (typeid(nullptr) != typeid(mynull)) + __builtin_abort(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr14.C new file mode 100644 index 0000000..6a79c49 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr14.C @@ -0,0 +1,24 @@ +// { dg-do compile { target c++11 } } + +// Test overload preference char*/int + +template <typename T, typename U> struct tType_equal; +template <typename T> struct tType_equal<T, T> { typedef void type; }; + +template <typename T, typename U> +inline typename tType_equal<T, U>::type +type_equal(U) { } + +char* f( char* ); +int f( int ); +long int f( long int ); + +void test_f() +{ + // Overloading cases + // + type_equal<char*>(f(nullptr)); + type_equal<int>(f(0)); + decltype(nullptr) mynull = 0; + type_equal<char*>(f(mynull)); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr15.C new file mode 100644 index 0000000..939d449 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr15.C @@ -0,0 +1,26 @@ +// { dg-do compile { target c++11 } } + + +// Test template deduction + +template <typename T, typename U> struct tType_equal; +template <typename T> struct tType_equal<T, T> { typedef void type; }; + +template <typename T, typename U> +inline typename tType_equal<T, U>::type +type_equal(U) { } + +template<typename T> T* g( T* t ); // { dg-message "note" } + +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|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|mismatched types)" "candidate note" { target *-*-* } 23 } + type_equal<float*>(g((float*)mynull)); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr16.C new file mode 100644 index 0000000..62029b3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr16.C @@ -0,0 +1,24 @@ +// { dg-do compile { target c++11 } } + +// Test template deduction + +typedef decltype(nullptr) nullptr_t; + +template <typename T, typename U> struct tType_equal; +template <typename T> struct tType_equal<T, T> { typedef void type; }; + +template <typename T, typename U> +inline typename tType_equal<T, U>::type +type_equal(U) { } + +template<typename T> T h( T t ); + +void test_h() +{ + type_equal<int>(h(0)); + type_equal<nullptr_t>(h(nullptr)); + type_equal<float*>(h((float*)nullptr)); + nullptr_t mynull = 0; + type_equal<nullptr_t>(h(mynull)); + type_equal<float*>(h((float*)mynull)); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr17.C new file mode 100644 index 0000000..96fea44 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr17.C @@ -0,0 +1,22 @@ +// { dg-do compile { target c++11 } } + +// Test that bool is a better overload match than int + +template <typename T, typename U> struct tType_equal; +template <typename T> struct tType_equal<T, T> { typedef void type; }; + +template <typename T, typename U> +inline typename tType_equal<T, U>::type +type_equal(U) { } + +int i( int ); +long int i( long int ); +bool i( bool ); + +void test_i() +{ + // Overload to bool, not int + type_equal<bool>(i(nullptr)); + decltype(nullptr) mynull = 0; + type_equal<bool>(i(mynull)); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr18.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr18.C new file mode 100644 index 0000000..17dd62c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr18.C @@ -0,0 +1,20 @@ +// { dg-do compile { target c++11 } } + +// Test overload of pointer versus bool when applied on a nullptr_t + +template <typename T, typename U> struct tType_equal; +template <typename T> struct tType_equal<T, T> { typedef void type; }; + +template <typename T, typename U> +inline typename tType_equal<T, U>::type +type_equal(U) { } + +char* j( char* ); +bool j( bool ); + +void test_j() +{ + type_equal<char*>(j(nullptr)); + decltype(nullptr) mynull = 0; + type_equal<char*>(j(mynull)); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr19.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr19.C new file mode 100644 index 0000000..8b6a0b4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr19.C @@ -0,0 +1,17 @@ +// { dg-do compile { target c++11 } } + + +// Test overload of pointer versus nullptr_t when applied on a literal 0/__null + +typedef decltype(nullptr) nullptr_t; + +char* k( char* ); /* { dg-message "note" } */ +nullptr_t k( nullptr_t ); /* { dg-message "note" } */ + +void test_k() +{ + k(0); /* { dg-error "is ambiguous" } */ + // { dg-message "candidate" "candidate note" { target *-*-* } 13 } + k(__null); /* { dg-error "is ambiguous" } */ + // { dg-message "candidate" "candidate note" { target *-*-* } 15 } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr20.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr20.C new file mode 100644 index 0000000..bbd0c7e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr20.C @@ -0,0 +1,19 @@ +// { dg-do run { target c++11 } } + +// Test passing to ellipisis + +#include <cstdio> +#include <cstring> + +int main() +{ + char buf1[64]; + char buf2[64]; + char buf3[64]; + + std::sprintf(buf1, "%p", (void*)0); + std::sprintf(buf2, "%p", nullptr); + decltype(nullptr) mynull = 0; + std::sprintf(buf3, "%p", nullptr); + return std::strcmp(buf1, buf2) != 0 || std::strcmp(buf1, buf3) != 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr21.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr21.C new file mode 100644 index 0000000..89884b9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr21.C @@ -0,0 +1,54 @@ +// { dg-do run { target c++11 } } + +// Test throw and catch + +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*) { + foo (0, 1); + } catch (bool) { + foo (0, 2); + } catch (int) { + foo (0, 3); + } catch (long int) { + foo (0, 4); + } catch (nullptr_t) { + foo (0, 5); + } catch (...) { + foo (0, 6); + } + + nullptr_t mynull = 0; + try { + throw mynull; + } catch (void*) { + foo (1, 1); + } catch (bool) { + foo (1, 2); + } catch (int) { + foo (1, 3); + } catch (long int) { + foo (1, 4); + } catch (nullptr_t) { + foo (1, 5); + } catch (...) { + foo (1, 6); + } + + if (result[0] != 5 || result[1] != 5) + abort (); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr22.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr22.C new file mode 100644 index 0000000..5fbd124 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr22.C @@ -0,0 +1,20 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-Wall -Wformat=2 -Wstrict-null-sentinel" } + +// Test various warnings + +void f1(const char*, ...) __attribute__((format(printf, 1, 2))); +void f2(const char*) __attribute__((nonnull)); +void f3(const char*, ...) __attribute__((sentinel)); + +void f() +{ + f1("%p", nullptr); + f2(nullptr); // { dg-warning "null argument where non-null required " } + f3("x", "y", __null); // { dg-warning "missing sentinel in function call" } + f3("x", "y", nullptr); + decltype(nullptr) mynull = 0; + f1("%p", mynull); + f2(mynull); // { dg-warning "null argument where non-null required " } + f3("x", "y", mynull); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr23.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr23.C new file mode 100644 index 0000000..2fab690 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr23.C @@ -0,0 +1,24 @@ +// PR c++/50361 +// { dg-do compile { target c++11 } } + +#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-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr24.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr24.C new file mode 100644 index 0000000..de0c842 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr24.C @@ -0,0 +1,5 @@ +// PR c++/50371 +// { dg-do compile { target c++11 } } + +template<decltype(nullptr)> +struct nt; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr25.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr25.C new file mode 100644 index 0000000..a87a923 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr25.C @@ -0,0 +1,6 @@ +// { dg-do compile { target c++11 } } + +template<decltype(nullptr)> +struct nt{}; + +nt<nullptr> x; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr26.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr26.C new file mode 100644 index 0000000..f60fae0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr26.C @@ -0,0 +1,13 @@ +// PR c++/51530 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr27.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr27.C new file mode 100644 index 0000000..2510dc8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr27.C @@ -0,0 +1,9 @@ +// PR c++/52706 +// { dg-do compile { target c++11 } } +// { dg-options "-fabi-version=0" } +// { dg-final { scan-assembler "_Z1fIDnLDn0EEiT_" } } + +template<class T, decltype(nullptr) = nullptr> +int f(T); + +int i2 = f(nullptr); // 17 diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr28.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr28.C new file mode 100644 index 0000000..05fbe57 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr29.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr29.C new file mode 100644 index 0000000..d2325bb --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr29.C @@ -0,0 +1,5 @@ +// PR c++/53882 +// { dg-options "-O" } +// { dg-do compile { target c++11 } } + +void f(decltype(nullptr) &__restrict np) { } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr30.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr30.C new file mode 100644 index 0000000..3673999 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/nullptr30.C @@ -0,0 +1,40 @@ +// PR c++/58176 +// { dg-do compile { target c++11 } } + +// Nil +struct nil_ { constexpr nil_ () {} }; +constexpr nil_ nil; + +// Cons +template <class H, class T = nil_> +struct cons_ { + using head_ = H; + using tail_ = T; + + H head; + T tail; + + constexpr cons_() {} + constexpr cons_(H const &h, T const &t) : head(h), tail(t) {} +}; +template <class H, class T = nil_> +constexpr cons_<H, T> cons (H const &h, T const &t = nil) { return +cons_<H,T>(h,t); } + +// List +template <class... T> struct list_s; +template <class H, class... T> +struct list_s<H, T...> { + using type = cons_<H, typename list_s<T...>::type>; +}; +template <> +struct list_s<> { + using type = nil_; +}; +template <class... T> +using list_ = typename list_s<T...>::type; +constexpr nil_ list () { return nil; } +template <class H, class... T> +constexpr list_<H, T...> list (H h, T... t) { return cons(h, list(t...)); } + +constexpr auto l1 = list("monkey", 123.4, cons(1, 2), nullptr); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overflow1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overflow1.C new file mode 100644 index 0000000..b8591b4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overflow1.C @@ -0,0 +1,25 @@ +// { dg-prune-output "-Woverflow" } + +template <long long i> +struct Fib +{ + static const long long value // { dg-error "overflow" } + = Fib<i-1>::value + Fib<i-2>::value; +}; + +template <> +struct Fib<0> +{ + static const long long value = 0; +}; + +template <> +struct Fib<1> +{ + static const long long value = 1; +}; + +int main() +{ + return Fib<95>::value; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload-conv-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload-conv-1.C new file mode 100644 index 0000000..5817ad5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload-conv-1.C @@ -0,0 +1,28 @@ +// { dg-do link { target c++11 } } + +struct S {}; + +struct T +{ + operator S() { return S(); } +}; + +struct U +{ + operator S&() { return *static_cast<S*>(0); } +}; + +void f(const S&); +void f(S&&) {} + +void g(const S&) {} +void g(S&&); + +int main() +{ + T t; + f(t); + + U u; + g(u); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload-conv-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload-conv-2.C new file mode 100644 index 0000000..b95994d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload-conv-2.C @@ -0,0 +1,16 @@ +// { dg-do link { target c++11 } } + +struct T {}; +struct S +{ + S(T const &) {} +}; + +void f(const S&); +void f(S&&) {} + +int main() +{ + T t; + f(t); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload.C new file mode 100644 index 0000000..a52e7c0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload.C @@ -0,0 +1,707 @@ +// { dg-do link { target c++11 } } +// Generated by overload.py + +template<typename _Tp> +inline _Tp&& +movel(_Tp& __t) +{ return static_cast<_Tp&&>(__t); } + +struct S{}; + +S l; // lvalue (l) +S const cl = l; // const lvalue (cl) +S r() { return l; } // rvalue (r) +S const cr() { return l; } // const rvalue (cr) +S & nl = l; // named lvalue reference (nl) +S const & ncl = l; // named const lvalue reference (ncl) +S && nr = movel(l); // named rvalue reference (nr) +S const && ncr = movel(l); // named const rvalue reference (ncr) +S & ul() { return l; } // unnamed lvalue reference (ul) +S const & ucl() { return l; } // unnamed const lvalue reference (ucl) +S && ur() { return movel(l); } // unnamed rvalue reference (ur) +S const && ucr() { return movel(l); } // unnamed const rvalue reference (ucr) + +void l0001(const S&&) {} + +void l0010(S&&) {} + +void l0011(S&&) {} +void l0011(const S&&); + +void l0100(const S&) {} + +void l0101(const S&) {} +void l0101(const S&&); + +void l0110(const S&) {} +void l0110(S&&); + +void l0111(const S&) {} +void l0111(S&&); +void l0111(const S&&); + +void l1000(S&) {} + +void l1001(S&) {} +void l1001(const S&&); + +void l1010(S&) {} +void l1010(S&&); + +void l1011(S&) {} +void l1011(S&&); +void l1011(const S&&); + +void l1100(S&) {} +void l1100(const S&); + +void l1101(S&) {} +void l1101(const S&); +void l1101(const S&&); + +void l1110(S&) {} +void l1110(const S&); +void l1110(S&&); + +void l1111(S&) {} +void l1111(const S&); +void l1111(S&&); +void l1111(const S&&); + +void cl0001(const S&&) {} + +void cl0011(S&&); +void cl0011(const S&&) {} + +void cl0100(const S&) {} + +void cl0101(const S&) {} +void cl0101(const S&&); + +void cl0110(const S&) {} +void cl0110(S&&); + +void cl0111(const S&) {} +void cl0111(S&&); +void cl0111(const S&&); + +void cl1001(S&); +void cl1001(const S&&) {} + +void cl1011(S&); +void cl1011(S&&); +void cl1011(const S&&) {} + +void cl1100(S&); +void cl1100(const S&) {} + +void cl1101(S&); +void cl1101(const S&) {} +void cl1101(const S&&); + +void cl1110(S&); +void cl1110(const S&) {} +void cl1110(S&&); + +void cl1111(S&); +void cl1111(const S&) {} +void cl1111(S&&); +void cl1111(const S&&); + +void r0001(const S&&) {} + +void r0010(S&&) {} + +void r0011(S&&) {} +void r0011(const S&&); + +void r0100(const S&) {} + +void r0101(const S&); +void r0101(const S&&) {} + +void r0110(const S&); +void r0110(S&&) {} + +void r0111(const S&); +void r0111(S&&) {} +void r0111(const S&&); + +void r1001(S&); +void r1001(const S&&) {} + +void r1010(S&); +void r1010(S&&) {} + +void r1011(S&); +void r1011(S&&) {} +void r1011(const S&&); + +void r1100(S&); +void r1100(const S&) {} + +void r1101(S&); +void r1101(const S&); +void r1101(const S&&) {} + +void r1110(S&); +void r1110(const S&); +void r1110(S&&) {} + +void r1111(S&); +void r1111(const S&); +void r1111(S&&) {} +void r1111(const S&&); + +void cr0001(const S&&) {} + +void cr0011(S&&); +void cr0011(const S&&) {} + +void cr0100(const S&) {} + +void cr0101(const S&); +void cr0101(const S&&) {} + +void cr0110(const S&) {} +void cr0110(S&&); + +void cr0111(const S&); +void cr0111(S&&); +void cr0111(const S&&) {} + +void cr1001(S&); +void cr1001(const S&&) {} + +void cr1011(S&); +void cr1011(S&&); +void cr1011(const S&&) {} + +void cr1100(S&); +void cr1100(const S&) {} + +void cr1101(S&); +void cr1101(const S&); +void cr1101(const S&&) {} + +void cr1110(S&); +void cr1110(const S&) {} +void cr1110(S&&); + +void cr1111(S&); +void cr1111(const S&); +void cr1111(S&&); +void cr1111(const S&&) {} + +void nl0001(const S&&) {} + +void nl0010(S&&) {} + +void nl0011(S&&) {} +void nl0011(const S&&); + +void nl0100(const S&) {} + +void nl0101(const S&) {} +void nl0101(const S&&); + +void nl0110(const S&) {} +void nl0110(S&&); + +void nl0111(const S&) {} +void nl0111(S&&); +void nl0111(const S&&); + +void nl1000(S&) {} + +void nl1001(S&) {} +void nl1001(const S&&); + +void nl1010(S&) {} +void nl1010(S&&); + +void nl1011(S&) {} +void nl1011(S&&); +void nl1011(const S&&); + +void nl1100(S&) {} +void nl1100(const S&); + +void nl1101(S&) {} +void nl1101(const S&); +void nl1101(const S&&); + +void nl1110(S&) {} +void nl1110(const S&); +void nl1110(S&&); + +void nl1111(S&) {} +void nl1111(const S&); +void nl1111(S&&); +void nl1111(const S&&); + +void ncl0001(const S&&) {} + +void ncl0011(S&&); +void ncl0011(const S&&) {} + +void ncl0100(const S&) {} + +void ncl0101(const S&) {} +void ncl0101(const S&&); + +void ncl0110(const S&) {} +void ncl0110(S&&); + +void ncl0111(const S&) {} +void ncl0111(S&&); +void ncl0111(const S&&); + +void ncl1001(S&); +void ncl1001(const S&&) {} + +void ncl1011(S&); +void ncl1011(S&&); +void ncl1011(const S&&) {} + +void ncl1100(S&); +void ncl1100(const S&) {} + +void ncl1101(S&); +void ncl1101(const S&) {} +void ncl1101(const S&&); + +void ncl1110(S&); +void ncl1110(const S&) {} +void ncl1110(S&&); + +void ncl1111(S&); +void ncl1111(const S&) {} +void ncl1111(S&&); +void ncl1111(const S&&); + +void nr0001(const S&&) {} + +void nr0010(S&&) {} + +void nr0011(S&&) {} +void nr0011(const S&&); + +void nr0100(const S&) {} + +void nr0101(const S&) {} +void nr0101(const S&&); + +void nr0110(const S&) {} +void nr0110(S&&); + +void nr0111(const S&) {} +void nr0111(S&&); +void nr0111(const S&&); + +void nr1000(S&) {} + +void nr1001(S&) {} +void nr1001(const S&&); + +void nr1010(S&) {} +void nr1010(S&&); + +void nr1011(S&) {} +void nr1011(S&&); +void nr1011(const S&&); + +void nr1100(S&) {} +void nr1100(const S&); + +void nr1101(S&) {} +void nr1101(const S&); +void nr1101(const S&&); + +void nr1110(S&) {} +void nr1110(const S&); +void nr1110(S&&); + +void nr1111(S&) {} +void nr1111(const S&); +void nr1111(S&&); +void nr1111(const S&&); + +void ncr0001(const S&&) {} + +void ncr0011(S&&); +void ncr0011(const S&&) {} + +void ncr0100(const S&) {} + +void ncr0101(const S&) {} +void ncr0101(const S&&); + +void ncr0110(const S&) {} +void ncr0110(S&&); + +void ncr0111(const S&) {} +void ncr0111(S&&); +void ncr0111(const S&&); + +void ncr1001(S&); +void ncr1001(const S&&) {} + +void ncr1011(S&); +void ncr1011(S&&); +void ncr1011(const S&&) {} + +void ncr1100(S&); +void ncr1100(const S&) {} + +void ncr1101(S&); +void ncr1101(const S&) {} +void ncr1101(const S&&); + +void ncr1110(S&); +void ncr1110(const S&) {} +void ncr1110(S&&); + +void ncr1111(S&); +void ncr1111(const S&) {} +void ncr1111(S&&); +void ncr1111(const S&&); + +void ul0001(const S&&) {} + +void ul0010(S&&) {} + +void ul0011(S&&) {} +void ul0011(const S&&); + +void ul0100(const S&) {} + +void ul0101(const S&) {} +void ul0101(const S&&); + +void ul0110(const S&) {} +void ul0110(S&&); + +void ul0111(const S&) {} +void ul0111(S&&); +void ul0111(const S&&); + +void ul1000(S&) {} + +void ul1001(S&) {} +void ul1001(const S&&); + +void ul1010(S&) {} +void ul1010(S&&); + +void ul1011(S&) {} +void ul1011(S&&); +void ul1011(const S&&); + +void ul1100(S&) {} +void ul1100(const S&); + +void ul1101(S&) {} +void ul1101(const S&); +void ul1101(const S&&); + +void ul1110(S&) {} +void ul1110(const S&); +void ul1110(S&&); + +void ul1111(S&) {} +void ul1111(const S&); +void ul1111(S&&); +void ul1111(const S&&); + +void ucl0001(const S&&) {} + +void ucl0011(S&&); +void ucl0011(const S&&) {} + +void ucl0100(const S&) {} + +void ucl0101(const S&) {} +void ucl0101(const S&&); + +void ucl0110(const S&) {} +void ucl0110(S&&); + +void ucl0111(const S&) {} +void ucl0111(S&&); +void ucl0111(const S&&); + +void ucl1001(S&); +void ucl1001(const S&&) {} + +void ucl1011(S&); +void ucl1011(S&&); +void ucl1011(const S&&) {} + +void ucl1100(S&); +void ucl1100(const S&) {} + +void ucl1101(S&); +void ucl1101(const S&) {} +void ucl1101(const S&&); + +void ucl1110(S&); +void ucl1110(const S&) {} +void ucl1110(S&&); + +void ucl1111(S&); +void ucl1111(const S&) {} +void ucl1111(S&&); +void ucl1111(const S&&); + +void ur0001(const S&&) {} + +void ur0010(S&&) {} + +void ur0011(S&&) {} +void ur0011(const S&&); + +void ur0100(const S&) {} + +void ur0101(const S&); +void ur0101(const S&&) {} + +void ur0110(const S&); +void ur0110(S&&) {} + +void ur0111(const S&); +void ur0111(S&&) {} +void ur0111(const S&&); + +void ur1001(S&); +void ur1001(const S&&) {} + +void ur1010(S&); +void ur1010(S&&) {} + +void ur1011(S&); +void ur1011(S&&) {} +void ur1011(const S&&); + +void ur1100(S&); +void ur1100(const S&) {} + +void ur1101(S&); +void ur1101(const S&); +void ur1101(const S&&) {} + +void ur1110(S&); +void ur1110(const S&); +void ur1110(S&&) {} + +void ur1111(S&); +void ur1111(const S&); +void ur1111(S&&) {} +void ur1111(const S&&); + +void ucr0001(const S&&) {} + +void ucr0011(S&&); +void ucr0011(const S&&) {} + +void ucr0100(const S&) {} + +void ucr0101(const S&); +void ucr0101(const S&&) {} + +void ucr0110(const S&) {} +void ucr0110(S&&); + +void ucr0111(const S&); +void ucr0111(S&&); +void ucr0111(const S&&) {} + +void ucr1001(S&); +void ucr1001(const S&&) {} + +void ucr1011(S&); +void ucr1011(S&&); +void ucr1011(const S&&) {} + +void ucr1100(S&); +void ucr1100(const S&) {} + +void ucr1101(S&); +void ucr1101(const S&); +void ucr1101(const S&&) {} + +void ucr1110(S&); +void ucr1110(const S&) {} +void ucr1110(S&&); + +void ucr1111(S&); +void ucr1111(const S&); +void ucr1111(S&&); +void ucr1111(const S&&) {} + + +int main() +{ + //l0001(l); + //l0010(l); + //l0011(l); + l0100(l); + l0101(l); + l0110(l); + l0111(l); + l1000(l); + l1001(l); + l1010(l); + l1011(l); + l1100(l); + l1101(l); + l1110(l); + l1111(l); + //cl0001(cl); + //cl0011(cl); + cl0100(cl); + cl0101(cl); + cl0110(cl); + cl0111(cl); + //cl1001(cl); + //cl1011(cl); + cl1100(cl); + cl1101(cl); + cl1110(cl); + cl1111(cl); + r0001(r()); + r0010(r()); + r0011(r()); + r0100(r()); + r0101(r()); + r0110(r()); + r0111(r()); + r1001(r()); + r1010(r()); + r1011(r()); + r1100(r()); + r1101(r()); + r1110(r()); + r1111(r()); + cr0001(cr()); + cr0011(cr()); + cr0100(cr()); + cr0101(cr()); + cr0110(cr()); + cr0111(cr()); + cr1001(cr()); + cr1011(cr()); + cr1100(cr()); + cr1101(cr()); + cr1110(cr()); + cr1111(cr()); + //nl0001(nl); + //nl0010(nl); + //nl0011(nl); + nl0100(nl); + nl0101(nl); + nl0110(nl); + nl0111(nl); + nl1000(nl); + nl1001(nl); + nl1010(nl); + nl1011(nl); + nl1100(nl); + nl1101(nl); + nl1110(nl); + nl1111(nl); + //ncl0001(ncl); + //ncl0011(ncl); + ncl0100(ncl); + ncl0101(ncl); + ncl0110(ncl); + ncl0111(ncl); + //ncl1001(ncl); + //ncl1011(ncl); + ncl1100(ncl); + ncl1101(ncl); + ncl1110(ncl); + ncl1111(ncl); + //nr0001(nr); + //nr0010(nr); + //nr0011(nr); + nr0100(nr); + nr0101(nr); + nr0110(nr); + nr0111(nr); + nr1000(nr); + nr1001(nr); + nr1010(nr); + nr1011(nr); + nr1100(nr); + nr1101(nr); + nr1110(nr); + nr1111(nr); + //ncr0001(ncr); + //ncr0011(ncr); + ncr0100(ncr); + ncr0101(ncr); + ncr0110(ncr); + ncr0111(ncr); + //ncr1001(ncr); + //ncr1011(ncr); + ncr1100(ncr); + ncr1101(ncr); + ncr1110(ncr); + ncr1111(ncr); + //ul0001(ul()); + //ul0010(ul()); + //ul0011(ul()); + ul0100(ul()); + ul0101(ul()); + ul0110(ul()); + ul0111(ul()); + ul1000(ul()); + ul1001(ul()); + ul1010(ul()); + ul1011(ul()); + ul1100(ul()); + ul1101(ul()); + ul1110(ul()); + ul1111(ul()); + //ucl0001(ucl()); + //ucl0011(ucl()); + ucl0100(ucl()); + ucl0101(ucl()); + ucl0110(ucl()); + ucl0111(ucl()); + //ucl1001(ucl()); + //ucl1011(ucl()); + ucl1100(ucl()); + ucl1101(ucl()); + ucl1110(ucl()); + ucl1111(ucl()); + ur0001(ur()); + ur0010(ur()); + ur0011(ur()); + ur0100(ur()); + ur0101(ur()); + ur0110(ur()); + ur0111(ur()); + ur1001(ur()); + ur1010(ur()); + ur1011(ur()); + ur1100(ur()); + ur1101(ur()); + ur1110(ur()); + ur1111(ur()); + ucr0001(ucr()); + ucr0011(ucr()); + ucr0100(ucr()); + ucr0101(ucr()); + ucr0110(ucr()); + ucr0111(ucr()); + ucr1001(ucr()); + ucr1011(ucr()); + ucr1100(ucr()); + ucr1101(ucr()); + ucr1110(ucr()); + ucr1111(ucr()); + + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload2.C new file mode 100644 index 0000000..2779f6d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload2.C @@ -0,0 +1,24 @@ +// Core 1321 +// { dg-do compile { target c++11 } } +// 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(); // { dg-error "g2. was not declared" } +int g2(int); +template <class T> decltype(g2(T())) f2() +{ return g2(T()); } +int i2 = f2<int>(); // { dg-error "no match" } + +int g3(); +template <class T> decltype(g3(T())) f3(); // { dg-error "too many arguments" } +int g3(int); +template <class T> decltype(g3(T())) f3() +{ return g3(T()); } +int i3 = f3<int>(); // { dg-error "no match" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload3.C new file mode 100644 index 0000000..2d95783 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overload3.C @@ -0,0 +1,17 @@ +// PR c++/59823 +// { dg-do compile { target c++11 } } + +struct X { }; + +void f(X&&); + +struct wrap +{ + operator const X&() const; +}; + +int main() +{ + wrap w; + f(w); // { dg-error "lvalue" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overloadn.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overloadn.C new file mode 100644 index 0000000..16c39a9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/overloadn.C @@ -0,0 +1,708 @@ +// { dg-do link { target c++11 } } +// { dg-options "" } +// Generated by overload.py + +template<typename _Tp> +inline _Tp&& +movel(_Tp& __t) +{ return static_cast<_Tp&&>(__t); } + +struct S{}; + +S l; // lvalue (l) +S const cl = l; // const lvalue (cl) +S r() { return l; } // rvalue (r) +S const cr() { return l; } // const rvalue (cr) +S & nl = l; // named lvalue reference (nl) +S const & ncl = l; // named const lvalue reference (ncl) +S && nr = movel(l); // named rvalue reference (nr) +S const && ncr = movel(l); // named const rvalue reference (ncr) +S & ul() { return l; } // unnamed lvalue reference (ul) +S const & ucl() { return l; } // unnamed const lvalue reference (ucl) +S && ur() { return movel(l); } // unnamed rvalue reference (ur) +S const && ucr() { return movel(l); } // unnamed const rvalue reference (ucr) + +void l0001(const S&&) {} // { dg-message "" } + +void l0010(S&&) {} // { dg-message "" } + +void l0011(S&&) {} // { dg-message "" } +void l0011(const S&&); + +void l0100(const S&) {} + +void l0101(const S&) {} +void l0101(const S&&); + +void l0110(const S&) {} +void l0110(S&&); + +void l0111(const S&) {} +void l0111(S&&); +void l0111(const S&&); + +void l1000(S&) {} + +void l1001(S&) {} +void l1001(const S&&); + +void l1010(S&) {} +void l1010(S&&); + +void l1011(S&) {} +void l1011(S&&); +void l1011(const S&&); + +void l1100(S&) {} +void l1100(const S&); + +void l1101(S&) {} +void l1101(const S&); +void l1101(const S&&); + +void l1110(S&) {} +void l1110(const S&); +void l1110(S&&); + +void l1111(S&) {} +void l1111(const S&); +void l1111(S&&); +void l1111(const S&&); + +void cl0001(const S&&) {} // { dg-message "" } + +void cl0011(S&&); +void cl0011(const S&&) {} // { dg-message "" } + +void cl0100(const S&) {} + +void cl0101(const S&) {} +void cl0101(const S&&); + +void cl0110(const S&) {} +void cl0110(S&&); + +void cl0111(const S&) {} +void cl0111(S&&); +void cl0111(const S&&); + +void cl1001(S&); +void cl1001(const S&&) {} // { dg-message "" } + +void cl1011(S&); +void cl1011(S&&); +void cl1011(const S&&) {} // { dg-message "" } + +void cl1100(S&); +void cl1100(const S&) {} + +void cl1101(S&); +void cl1101(const S&) {} +void cl1101(const S&&); + +void cl1110(S&); +void cl1110(const S&) {} +void cl1110(S&&); + +void cl1111(S&); +void cl1111(const S&) {} +void cl1111(S&&); +void cl1111(const S&&); + +void r0001(const S&&) {} + +void r0010(S&&) {} + +void r0011(S&&) {} +void r0011(const S&&); + +void r0100(const S&) {} + +void r0101(const S&); +void r0101(const S&&) {} + +void r0110(const S&); +void r0110(S&&) {} + +void r0111(const S&); +void r0111(S&&) {} +void r0111(const S&&); + +void r1001(S&); +void r1001(const S&&) {} + +void r1010(S&); +void r1010(S&&) {} + +void r1011(S&); +void r1011(S&&) {} +void r1011(const S&&); + +void r1100(S&); +void r1100(const S&) {} + +void r1101(S&); +void r1101(const S&); +void r1101(const S&&) {} + +void r1110(S&); +void r1110(const S&); +void r1110(S&&) {} + +void r1111(S&); +void r1111(const S&); +void r1111(S&&) {} +void r1111(const S&&); + +void cr0001(const S&&) {} + +void cr0011(S&&); +void cr0011(const S&&) {} + +void cr0100(const S&) {} + +void cr0101(const S&); +void cr0101(const S&&) {} + +void cr0110(const S&) {} +void cr0110(S&&); + +void cr0111(const S&); +void cr0111(S&&); +void cr0111(const S&&) {} + +void cr1001(S&); +void cr1001(const S&&) {} + +void cr1011(S&); +void cr1011(S&&); +void cr1011(const S&&) {} + +void cr1100(S&); +void cr1100(const S&) {} + +void cr1101(S&); +void cr1101(const S&); +void cr1101(const S&&) {} + +void cr1110(S&); +void cr1110(const S&) {} +void cr1110(S&&); + +void cr1111(S&); +void cr1111(const S&); +void cr1111(S&&); +void cr1111(const S&&) {} + +void nl0001(const S&&) {} // { dg-message "" } + +void nl0010(S&&) {} // { dg-message "" } + +void nl0011(S&&) {} // { dg-message "" } +void nl0011(const S&&); + +void nl0100(const S&) {} + +void nl0101(const S&) {} +void nl0101(const S&&); + +void nl0110(const S&) {} +void nl0110(S&&); + +void nl0111(const S&) {} +void nl0111(S&&); +void nl0111(const S&&); + +void nl1000(S&) {} + +void nl1001(S&) {} +void nl1001(const S&&); + +void nl1010(S&) {} +void nl1010(S&&); + +void nl1011(S&) {} +void nl1011(S&&); +void nl1011(const S&&); + +void nl1100(S&) {} +void nl1100(const S&); + +void nl1101(S&) {} +void nl1101(const S&); +void nl1101(const S&&); + +void nl1110(S&) {} +void nl1110(const S&); +void nl1110(S&&); + +void nl1111(S&) {} +void nl1111(const S&); +void nl1111(S&&); +void nl1111(const S&&); + +void ncl0001(const S&&) {} // { dg-message "" } + +void ncl0011(S&&); +void ncl0011(const S&&) {} // { dg-message "" } + +void ncl0100(const S&) {} + +void ncl0101(const S&) {} +void ncl0101(const S&&); + +void ncl0110(const S&) {} +void ncl0110(S&&); + +void ncl0111(const S&) {} +void ncl0111(S&&); +void ncl0111(const S&&); + +void ncl1001(S&); +void ncl1001(const S&&) {} // { dg-message "" } + +void ncl1011(S&); +void ncl1011(S&&); +void ncl1011(const S&&) {} // { dg-message "" } + +void ncl1100(S&); +void ncl1100(const S&) {} + +void ncl1101(S&); +void ncl1101(const S&) {} +void ncl1101(const S&&); + +void ncl1110(S&); +void ncl1110(const S&) {} +void ncl1110(S&&); + +void ncl1111(S&); +void ncl1111(const S&) {} +void ncl1111(S&&); +void ncl1111(const S&&); + +void nr0001(const S&&) {} // { dg-message "" } + +void nr0010(S&&) {} // { dg-message "" } + +void nr0011(S&&) {} // { dg-message "" } +void nr0011(const S&&); + +void nr0100(const S&) {} + +void nr0101(const S&) {} +void nr0101(const S&&); + +void nr0110(const S&) {} +void nr0110(S&&); + +void nr0111(const S&) {} +void nr0111(S&&); +void nr0111(const S&&); + +void nr1000(S&) {} + +void nr1001(S&) {} +void nr1001(const S&&); + +void nr1010(S&) {} +void nr1010(S&&); + +void nr1011(S&) {} +void nr1011(S&&); +void nr1011(const S&&); + +void nr1100(S&) {} +void nr1100(const S&); + +void nr1101(S&) {} +void nr1101(const S&); +void nr1101(const S&&); + +void nr1110(S&) {} +void nr1110(const S&); +void nr1110(S&&); + +void nr1111(S&) {} +void nr1111(const S&); +void nr1111(S&&); +void nr1111(const S&&); + +void ncr0001(const S&&) {} // { dg-message "" } + +void ncr0011(S&&); +void ncr0011(const S&&) {} // { dg-message "" } + +void ncr0100(const S&) {} + +void ncr0101(const S&) {} +void ncr0101(const S&&); + +void ncr0110(const S&) {} +void ncr0110(S&&); + +void ncr0111(const S&) {} +void ncr0111(S&&); +void ncr0111(const S&&); + +void ncr1001(S&); +void ncr1001(const S&&) {} // { dg-message "" } + +void ncr1011(S&); +void ncr1011(S&&); +void ncr1011(const S&&) {} // { dg-message "" } + +void ncr1100(S&); +void ncr1100(const S&) {} + +void ncr1101(S&); +void ncr1101(const S&) {} +void ncr1101(const S&&); + +void ncr1110(S&); +void ncr1110(const S&) {} +void ncr1110(S&&); + +void ncr1111(S&); +void ncr1111(const S&) {} +void ncr1111(S&&); +void ncr1111(const S&&); + +void ul0001(const S&&) {} // { dg-message "" } + +void ul0010(S&&) {} // { dg-message "" } + +void ul0011(S&&) {} // { dg-message "" } +void ul0011(const S&&); + +void ul0100(const S&) {} + +void ul0101(const S&) {} +void ul0101(const S&&); + +void ul0110(const S&) {} +void ul0110(S&&); + +void ul0111(const S&) {} +void ul0111(S&&); +void ul0111(const S&&); + +void ul1000(S&) {} + +void ul1001(S&) {} +void ul1001(const S&&); + +void ul1010(S&) {} +void ul1010(S&&); + +void ul1011(S&) {} +void ul1011(S&&); +void ul1011(const S&&); + +void ul1100(S&) {} +void ul1100(const S&); + +void ul1101(S&) {} +void ul1101(const S&); +void ul1101(const S&&); + +void ul1110(S&) {} +void ul1110(const S&); +void ul1110(S&&); + +void ul1111(S&) {} +void ul1111(const S&); +void ul1111(S&&); +void ul1111(const S&&); + +void ucl0001(const S&&) {} // { dg-message "" } + +void ucl0011(S&&); +void ucl0011(const S&&) {} // { dg-message "" } + +void ucl0100(const S&) {} + +void ucl0101(const S&) {} +void ucl0101(const S&&); + +void ucl0110(const S&) {} +void ucl0110(S&&); + +void ucl0111(const S&) {} +void ucl0111(S&&); +void ucl0111(const S&&); + +void ucl1001(S&); +void ucl1001(const S&&) {} // { dg-message "" } + +void ucl1011(S&); +void ucl1011(S&&); +void ucl1011(const S&&) {} // { dg-message "" } + +void ucl1100(S&); +void ucl1100(const S&) {} + +void ucl1101(S&); +void ucl1101(const S&) {} +void ucl1101(const S&&); + +void ucl1110(S&); +void ucl1110(const S&) {} +void ucl1110(S&&); + +void ucl1111(S&); +void ucl1111(const S&) {} +void ucl1111(S&&); +void ucl1111(const S&&); + +void ur0001(const S&&) {} + +void ur0010(S&&) {} + +void ur0011(S&&) {} +void ur0011(const S&&); + +void ur0100(const S&) {} + +void ur0101(const S&); +void ur0101(const S&&) {} + +void ur0110(const S&); +void ur0110(S&&) {} + +void ur0111(const S&); +void ur0111(S&&) {} +void ur0111(const S&&); + +void ur1001(S&); +void ur1001(const S&&) {} + +void ur1010(S&); +void ur1010(S&&) {} + +void ur1011(S&); +void ur1011(S&&) {} +void ur1011(const S&&); + +void ur1100(S&); +void ur1100(const S&) {} + +void ur1101(S&); +void ur1101(const S&); +void ur1101(const S&&) {} + +void ur1110(S&); +void ur1110(const S&); +void ur1110(S&&) {} + +void ur1111(S&); +void ur1111(const S&); +void ur1111(S&&) {} +void ur1111(const S&&); + +void ucr0001(const S&&) {} + +void ucr0011(S&&); +void ucr0011(const S&&) {} + +void ucr0100(const S&) {} + +void ucr0101(const S&); +void ucr0101(const S&&) {} + +void ucr0110(const S&) {} +void ucr0110(S&&); + +void ucr0111(const S&); +void ucr0111(S&&); +void ucr0111(const S&&) {} + +void ucr1001(S&); +void ucr1001(const S&&) {} + +void ucr1011(S&); +void ucr1011(S&&); +void ucr1011(const S&&) {} + +void ucr1100(S&); +void ucr1100(const S&) {} + +void ucr1101(S&); +void ucr1101(const S&); +void ucr1101(const S&&) {} + +void ucr1110(S&); +void ucr1110(const S&) {} +void ucr1110(S&&); + +void ucr1111(S&); +void ucr1111(const S&); +void ucr1111(S&&); +void ucr1111(const S&&) {} + + +int main() +{ + l0001(l); // { dg-error "lvalue" } + l0010(l); // { dg-error "lvalue" } + l0011(l); // { dg-error "lvalue" } + l0100(l); + l0101(l); + l0110(l); + l0111(l); + l1000(l); + l1001(l); + l1010(l); + l1011(l); + l1100(l); + l1101(l); + l1110(l); + l1111(l); + cl0001(cl); // { dg-error "lvalue" } + cl0011(cl); // { dg-error "lvalue" } + cl0100(cl); + cl0101(cl); + cl0110(cl); + cl0111(cl); + cl1001(cl); // { dg-error "lvalue" } + cl1011(cl); // { dg-error "lvalue" } + cl1100(cl); + cl1101(cl); + cl1110(cl); + cl1111(cl); + r0001(r()); + r0010(r()); + r0011(r()); + r0100(r()); + r0101(r()); + r0110(r()); + r0111(r()); + r1001(r()); + r1010(r()); + r1011(r()); + r1100(r()); + r1101(r()); + r1110(r()); + r1111(r()); + cr0001(cr()); + cr0011(cr()); + cr0100(cr()); + cr0101(cr()); + cr0110(cr()); + cr0111(cr()); + cr1001(cr()); + cr1011(cr()); + cr1100(cr()); + cr1101(cr()); + cr1110(cr()); + cr1111(cr()); + nl0001(nl); // { dg-error "lvalue" } + nl0010(nl); // { dg-error "lvalue" } + nl0011(nl); // { dg-error "lvalue" } + nl0100(nl); + nl0101(nl); + nl0110(nl); + nl0111(nl); + nl1000(nl); + nl1001(nl); + nl1010(nl); + nl1011(nl); + nl1100(nl); + nl1101(nl); + nl1110(nl); + nl1111(nl); + ncl0001(ncl); // { dg-error "lvalue" } + ncl0011(ncl); // { dg-error "lvalue" } + ncl0100(ncl); + ncl0101(ncl); + ncl0110(ncl); + ncl0111(ncl); + ncl1001(ncl); // { dg-error "lvalue" } + ncl1011(ncl); // { dg-error "lvalue" } + ncl1100(ncl); + ncl1101(ncl); + ncl1110(ncl); + ncl1111(ncl); + nr0001(nr); // { dg-error "lvalue" } + nr0010(nr); // { dg-error "lvalue" } + nr0011(nr); // { dg-error "lvalue" } + nr0100(nr); + nr0101(nr); + nr0110(nr); + nr0111(nr); + nr1000(nr); + nr1001(nr); + nr1010(nr); + nr1011(nr); + nr1100(nr); + nr1101(nr); + nr1110(nr); + nr1111(nr); + ncr0001(ncr); // { dg-error "lvalue" } + ncr0011(ncr); // { dg-error "lvalue" } + ncr0100(ncr); + ncr0101(ncr); + ncr0110(ncr); + ncr0111(ncr); + ncr1001(ncr); // { dg-error "lvalue" } + ncr1011(ncr); // { dg-error "lvalue" } + ncr1100(ncr); + ncr1101(ncr); + ncr1110(ncr); + ncr1111(ncr); + ul0001(ul()); // { dg-error "lvalue" } + ul0010(ul()); // { dg-error "lvalue" } + ul0011(ul()); // { dg-error "lvalue" } + ul0100(ul()); + ul0101(ul()); + ul0110(ul()); + ul0111(ul()); + ul1000(ul()); + ul1001(ul()); + ul1010(ul()); + ul1011(ul()); + ul1100(ul()); + ul1101(ul()); + ul1110(ul()); + ul1111(ul()); + ucl0001(ucl()); // { dg-error "lvalue" } + ucl0011(ucl()); // { dg-error "lvalue" } + ucl0100(ucl()); + ucl0101(ucl()); + ucl0110(ucl()); + ucl0111(ucl()); + ucl1001(ucl()); // { dg-error "lvalue" } + ucl1011(ucl()); // { dg-error "lvalue" } + ucl1100(ucl()); + ucl1101(ucl()); + ucl1110(ucl()); + ucl1111(ucl()); + ur0001(ur()); + ur0010(ur()); + ur0011(ur()); + ur0100(ur()); + ur0101(ur()); + ur0110(ur()); + ur0111(ur()); + ur1001(ur()); + ur1010(ur()); + ur1011(ur()); + ur1100(ur()); + ur1101(ur()); + ur1110(ur()); + ur1111(ur()); + ucr0001(ucr()); + ucr0011(ucr()); + ucr0100(ucr()); + ucr0101(ucr()); + ucr0110(ucr()); + ucr0111(ucr()); + ucr1001(ucr()); + ucr1011(ucr()); + ucr1100(ucr()); + ucr1101(ucr()); + ucr1110(ucr()); + ucr1111(ucr()); + + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/override1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/override1.C new file mode 100644 index 0000000..e05693f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/override1.C @@ -0,0 +1,60 @@ +// { dg-do compile { target c++11 } } +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-4.9/gcc/testsuite/g++.dg/cpp0x/override2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/override2.C new file mode 100644 index 0000000..c0b89de --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/override2.C @@ -0,0 +1,53 @@ +// { dg-do compile { target c++11 } } +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 class 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-message "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-4.9/gcc/testsuite/g++.dg/cpp0x/override3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/override3.C new file mode 100644 index 0000000..2d22cbf --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/override4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/override4.C new file mode 100644 index 0000000..7120984 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/override4.C @@ -0,0 +1,45 @@ +// { dg-do compile { target c++11 } } +// { dg-prune-output "expected ';'" } +// { dg-prune-output "expected unqualified-id" } +// { dg-prune-output "declaration does not declare anything" } + +struct B +{ + virtual auto f() -> void final; + virtual auto g() -> void; +}; + +struct B2 +{ + virtual auto f() -> void final {} +}; + +struct B3 +{ + virtual auto f() -> final void; // { dg-error "type" } +}; + +struct B4 +{ + virtual auto f() -> final void {} // { dg-error "type" } +}; + +struct D : B +{ + virtual auto g() -> void override; +}; + +struct D2 : B +{ + virtual auto g() -> void override {} +}; + +struct D3 : B +{ + virtual auto g() -> override void; // { dg-error "type" } +}; + +struct D4 : B +{ + virtual auto g() -> override void {} // { dg-error "type" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/parse1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/parse1.C new file mode 100644 index 0000000..5a11b73 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/parse1.C @@ -0,0 +1,5 @@ +// PR c++/43509 +// { dg-do compile { target c++11 } } + +typedef int B; // { dg-message "" } +B::B() {} // { dg-error "" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/parse2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/parse2.C new file mode 100644 index 0000000..77ea14a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/parse2.C @@ -0,0 +1,15 @@ +// PR c++/54526 +// { dg-do compile { target c++11 } } + +template <class T> +struct X { }; + +struct A { }; + +int main() +{ + X<::A> x; +} + +int a; +bool b = 0<::a; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31431-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31431-2.C new file mode 100644 index 0000000..6d8f565 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31431-2.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } +template<typename, typename..., typename> void foo(); // { dg-message "note" } + +void bar() +{ + foo<int>(); // { dg-error "no matching function" } + // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 6 } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31431.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31431.C new file mode 100644 index 0000000..428673d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31431.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } +template<typename..., typename> void foo(); // { dg-message "note" } + +void bar() +{ + foo<int>(); // { dg-error "no matching function" } + // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 6 } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31432.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31432.C new file mode 100644 index 0000000..1f2ea50 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31432.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } +template<typename..., typename> struct A // { dg-error "parameter pack" } +{ + static int i; +}; + +A<int, int> a; // { dg-error "mismatch|expected|invalid type" } +A<char,int> b; // { dg-error "mismatch|expected|invalid type" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31434.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31434.C new file mode 100644 index 0000000..e70bdd1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31434.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } +template<typename... T> int foo(const T&) // { dg-error "not expanded with|T" } +{ + union { T t; }; // { dg-error "not expanded with|T" } + return t; +} + +void bar() +{ + foo(0); // { dg-error "no matching" } + // { dg-message "(candidate|cannot convert)" "candidate note" { target *-*-* } 10 } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31437.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31437.C new file mode 100644 index 0000000..5f7010f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31437.C @@ -0,0 +1,10 @@ +// { dg-do compile { target c++11 } } +template <typename... T> struct A // { dg-message "candidates|A" } +{ + A(T* p) { // { dg-error "parameter packs|T" } + (A<T...>*)(p); + } +}; + +A<int> a(0); // { dg-error "no matching" } +// { dg-message "candidate" "candidate note" { target *-*-* } 9 } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31438.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31438.C new file mode 100644 index 0000000..272f402 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31438.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +template<typename> struct A; +template<typename T, typename... U> struct A<T(U)> // { dg-error "parameter packs|U" } +{ + template<typename X> A(X); +}; + +A<void(int)> a(0); // { dg-error "incomplete type" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31439.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31439.C new file mode 100644 index 0000000..f753735 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31439.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } +template<typename...> struct A; + +template<char> struct A<> {}; // { dg-error "not used in partial specialization|anonymous|declaration" } + +template<typename T, typename... U> struct A<T, U...> : A<U...> {}; // { dg-error "incomplete type" } + +A<int> a; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31442.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31442.C new file mode 100644 index 0000000..7fd20e7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31442.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } +template<typename... T, T = 0> struct A {}; // { dg-error "parameter packs|T|the end|parameter packs|anonymous" } + +struct B +{ + template <template <typename...> class C> B(C<int>); +}; + +B b = A<int>(); // { dg-error "mismatch|expected" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31443.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31443.C new file mode 100644 index 0000000..3169312 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31443.C @@ -0,0 +1,11 @@ +// { dg-do compile { target c++11 } } + +template<int, typename... T> struct A +{ + template<int N> void foo(A<N,T>); // { dg-error "parameter packs|T" } +}; + +void bar() +{ + A<0,int>().foo(A<0,int>()); // { dg-error "no member named" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31444.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31444.C new file mode 100644 index 0000000..955562d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31444.C @@ -0,0 +1,10 @@ +// { dg-do compile { target c++11 } } +template<typename... T> struct A +{ + template<int> void foo(A<T>); // { dg-error "not expanded|T" } +}; + +void bar() +{ + A<int>().foo<0>(A<int>()); // { dg-error "no member named" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31445.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31445.C new file mode 100644 index 0000000..89aae9a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31445.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } +template <typename... T> struct A +{ + void foo(T...); + A(T... t) { foo(t); } // { dg-error "parameter packs|t" } +}; + +A<int> a(0); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31993.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31993.C new file mode 100644 index 0000000..9c3411c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31993.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +template<typename...> struct A; + +template<template<int> class... T> struct A<T<0>...> +{ + template<int> struct B {}; + B<0> b; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32114.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32114.C new file mode 100644 index 0000000..0ae684c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32114.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } +template<typename ...T> struct A +{ + typedef typename T::X Y; // { dg-error "not expanded|T" } +}; + +A<int> a; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32115.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32115.C new file mode 100644 index 0000000..5722aa3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32115.C @@ -0,0 +1,4 @@ +// { dg-do compile { target c++11 } } +template<typename ...T, int = 0> struct A {}; // { dg-error "end of" } + +A<int> a; // { dg-error "mismatch|expected|invalid" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32125.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32125.C new file mode 100644 index 0000000..01844bd --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32125.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } +template<typename...> struct A; + +template<typename...T> struct A<T*> // { dg-error "not expanded|T" } +{ + A(); + A(T); +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32126.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32126.C new file mode 100644 index 0000000..dac1da5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32126.C @@ -0,0 +1,10 @@ +// { dg-do compile { target c++11 } } +template<typename...> struct A; + +template<typename...T> struct A<T> // { dg-error "not expanded|T|" } +{ + static int i; +}; + +A<char> a; // { dg-error "incomplete" } +A<int> b; // { dg-error "incomplete" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32127.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32127.C new file mode 100644 index 0000000..586469d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32127.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } +template<typename...T> struct A +{ + static T i; // { dg-error "parameter packs|T" } +}; + +int j = A<int>::i; // { dg-error "not a member" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32128.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32128.C new file mode 100644 index 0000000..147001e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32128.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } +template<typename...> struct A; + +template<typename...T, typename...U> + struct A<T..., U...> {}; // { dg-error "must be at the end" } + +A<int> a; // { dg-error "incomplete" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32252.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32252.C new file mode 100644 index 0000000..715ad27 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32252.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } +int x[5]; + +template<int M, int N, int (&... p)[N]> struct A; + +template<int M> struct A<M,5,x> {}; + +A<0,5,x> a; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32253.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32253.C new file mode 100644 index 0000000..2094b2d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32253.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } +template<void (*... fp)()> struct A +{ + A() { fp(); } // { dg-error "not expanded|fp" } +}; + +void foo(); + +A<foo> a; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32566.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32566.C new file mode 100644 index 0000000..fd07432 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr32566.C @@ -0,0 +1,4 @@ +// { dg-do compile { target c++11 } } +template<int...> struct A; + +template<template<int> class... T> struct A<T...> {}; // { dg-error "mismatch|expected" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr33839.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr33839.C new file mode 100644 index 0000000..50bcfe8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr33839.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } +template<int> struct A; + +void foo() +{ + __decltype A<0>; // { dg-error "invalid declarator|expected" } + __decltype (A<0>); // { dg-error "must be an expression" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr33930.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr33930.C new file mode 100644 index 0000000..8d9312c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr33930.C @@ -0,0 +1,10 @@ +// { dg-do compile { target c++11 } } +typedef const int* type; + +float& foo( const type& ggg ); +int& foo( type&& ggg ); + +void bar( int* someptr ) +{ + int& x = foo( someptr ); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr33955.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr33955.C new file mode 100644 index 0000000..7d3f6b6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr33955.C @@ -0,0 +1,39 @@ +// { dg-do compile { target c++11 } } +template<typename T> +struct uncvref +{ + typedef T type; +}; + +template<typename... Args> +struct args +{ + static const int size = sizeof...(Args); +}; + +template<typename G, typename E, typename S, typename V, long GN = G::size, long EN = E::size> +struct apply_args; + +template<typename... G, typename... E, typename S, typename V, long N> +struct apply_args<args<G...>, args<E...>, S, V, N, N> +{ + typedef args< + typename G::template apply<typename uncvref<E>::type, S, V>::type... + > type; +}; + +struct or_ +{ + template<typename E, typename S, typename V> + struct apply { + typedef typename E::type type; + }; +}; + +template<typename T> +struct identity +{ + typedef T type; +}; + +apply_args<args<or_>, args<identity<int>>, float, double> a1; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr33996.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr33996.C new file mode 100644 index 0000000..3fca7f2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr33996.C @@ -0,0 +1,52 @@ +// { dg-do compile { target c++11 } } + +#define BUG +struct type +{ + type() { } + type(const type&) { } + +private: + type(type&&); +}; + +template<typename _Tp> + struct identity + { + typedef _Tp type; + }; + +template<typename _Tp> + inline _Tp&& + forward(typename identity<_Tp>::type&& __t) + { return __t; } + +struct vec +{ + template<typename _Args> + void + bar(_Args&& __args) +#ifdef BUG + ; +#else + { + type(forward<_Args>(__args)); + } +#endif +}; + +#ifdef BUG +template<typename _Args> + void + vec::bar(_Args&& __args) + { + type(forward<_Args>(__args)); + } +#endif + +int main() +{ + vec v; + type c; + v.bar(c); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34054.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34054.C new file mode 100644 index 0000000..8043f96 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34054.C @@ -0,0 +1,4 @@ +// PR c++/34054 +// { dg-do compile { target c++11 } } + +template<typename... T> T foo() {} // { dg-error "not expanded|T" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34056.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34056.C new file mode 100644 index 0000000..9c5261d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34056.C @@ -0,0 +1,9 @@ +// PR c++/34056 +// { dg-do compile { target c++11 } } + +template<typename... T> struct A +{ + void foo (T *) { ++p; } // { dg-error "not expanded|T" } + void bar (T **) { } // { dg-error "not expanded|T" } + T *p; // { dg-error "not expanded|T" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34057.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34057.C new file mode 100644 index 0000000..d74018e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34057.C @@ -0,0 +1,7 @@ +// PR c++/34057 +// { dg-do compile { target c++11 } } + +template <typename... T> struct A +{ + typedef T X __attribute__ ((vector_size (8))); // { dg-error "not expanded|T" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34058.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34058.C new file mode 100644 index 0000000..dc9e836 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34058.C @@ -0,0 +1,9 @@ +// PR c++/34058 +// { dg-do compile { target c++11 } } + +template <typename...T> struct A +{ + typedef T X; // { dg-error "not expanded|T" } +}; + +A<int> a; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34060.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34060.C new file mode 100644 index 0000000..f485346 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34060.C @@ -0,0 +1,10 @@ +// PR c++/34060 +// { dg-do compile { target c++11 } } + +template <int> struct A +{ + template <typename... > struct B {}; + template <typename... T> struct B <int, T *> {}; // { dg-error "not expanded|T" } +}; + +A<0>::B<int>b; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34061.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34061.C new file mode 100644 index 0000000..64f0ded --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr34061.C @@ -0,0 +1,4 @@ +// PR c++/34061 +// { dg-do compile { target c++11 } } + +template<template<int> class ...T> struct A : T<0> {}; // { dg-error "not expanded|T" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr38646.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr38646.C new file mode 100644 index 0000000..7dd53ae --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr38646.C @@ -0,0 +1,11 @@ +/* PR c++/38646 */ +/* { dg-do compile { target c++11 } } */ + +template<int...> struct A; + +template<int... N> struct A<N..., N...> /* { dg-error "must be at the end" } */ +{ + template<typename> struct B; + + template<typename T> struct B<T*> {}; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr38795.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr38795.C new file mode 100644 index 0000000..89ce0d3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr38795.C @@ -0,0 +1,12 @@ +// PR c++/38795 +// { dg-do compile { target c++11 } } + +template<typename... T> int foo(int i) +{ + return *reinterpret_cast<T*>(i); // { dg-error "not expanded with|T" } +} + +void bar(int i) +{ + foo<int>(i); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr39639.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr39639.C new file mode 100644 index 0000000..5618e80 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr39639.C @@ -0,0 +1,20 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/39639 +// { dg-do compile { target c++11 } } +// { dg-prune-output "template argument 1 is invalid" } + +template <class... Types> +struct S + : S<...Types>, // { dg-error "expected parameter pack before '...'" } + S<...Types...>, // { dg-error "expected parameter pack before '...'" } + S<...> // { dg-error "expected parameter pack before '...'" } +{ + static int f () { return 1;} +}; + +int +main () +{ + return S<void>::f (); +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr42844-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr42844-2.C new file mode 100644 index 0000000..ff23966 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr42844-2.C @@ -0,0 +1,41 @@ +// PR c++/42844 +// { dg-do compile { target c++11 } } + +struct A // { dg-message "user-provided default constructor" } +{ + int i; + A() = default; // { dg-message "not user-provided" } +}; + +struct Base +{ + Base() {} +}; + +struct Derived : Base // { dg-message "user-provided default constructor" } +{ + int i; + Derived() = default; // { dg-message "not user-provided" } +}; + +struct Derived2 : Base // { dg-message "user-provided default constructor" } +{ + int i; + Derived2() = default; // { dg-message "not user-provided" } + Derived2( Derived2 const& ) = default; +}; + +struct Derived3 : Base // { dg-message "user-provided default constructor" } +{ + int i; + Derived3( Derived3 const& ) = default; + Derived3() = default; // { dg-message "not user-provided" } +}; + +void f() +{ + const A a; // { dg-error "uninitialized const" } + const Derived d; // { dg-error "uninitialized const" } + const Derived2 d2; // { dg-error "uninitialized const" } + const Derived3 d3; // { dg-error "uninitialized const" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr45908.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr45908.C new file mode 100644 index 0000000..dad8dfd --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr45908.C @@ -0,0 +1,17 @@ +// PR c++/45908 +// Testcase by Jonathan Wakely <redi@gcc.gnu.org> + +// { dg-do compile { target c++11 } } + +struct vector { + struct iterator { }; + struct const_iterator { }; + iterator begin(); + const_iterator begin() const; +}; + +class block { + vector v; + auto end() const -> decltype(v.begin()) + { return v.begin(); } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr47416.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr47416.C new file mode 100644 index 0000000..e4eb317 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr47416.C @@ -0,0 +1,224 @@ +// PR c++/47416 +// { dg-do compile { target c++11 } } + +namespace std +{ + template < typename _Tp, _Tp __v > struct integral_constant + { + static const _Tp value = __v; + }; + typedef integral_constant < bool, false > false_type; + template < typename > struct is_array:false_type + { + }; + template < typename > struct is_function:false_type + { + }; + template < typename _Tp > struct remove_const + { + typedef _Tp type; + }; + template < typename _Tp > struct remove_volatile + { + typedef _Tp type; + }; + template < typename _Tp > struct remove_cv + { + typedef typename remove_const < typename remove_volatile < + _Tp >::type >::type type; + }; + template < typename > struct remove_reference + { + }; + template < typename _Tp > struct remove_reference <_Tp & > + { + typedef _Tp type; + }; + template < typename _Up, bool = is_array < _Up >::value, bool = + is_function < _Up >::value > struct __decay_selector; + template < typename _Up > struct __decay_selector <_Up, false, false > + { + typedef typename remove_cv < _Up >::type __type; + }; + template < typename _Tp > class decay + { + typedef typename remove_reference < _Tp >::type __remove_type; + public:typedef typename __decay_selector < + __remove_type >::__type type; + }; + template < typename _Tp > struct __strip_reference_wrapper + { + typedef _Tp __type; + }; + template < typename _Tp > struct __decay_and_strip + { + typedef typename __strip_reference_wrapper < typename decay < + _Tp >::type >::__type __type; + }; + template < typename _Tp > _Tp forward (typename remove_reference < + _Tp >::type &) + { + } + template < class _T1, class _T2 > struct pair + { + _T1 first; + _T2 second; + constexpr pair (_T1, _T2 &):first (), second (__b) // { dg-error "was not declared in this scope" } + { + } + }; + template < class _T1, + class _T2 > pair < typename __decay_and_strip < _T1 >::__type, + typename __decay_and_strip < _T2 >::__type > make_pair (_T1 && __x, _T2 + && __y) + { + typedef typename __decay_and_strip < _T1 >::__type __ds_type1; + typedef typename __decay_and_strip < _T2 >::__type __ds_type2; + typedef pair < __ds_type1, __ds_type2 > __pair_type; + __pair_type (forward < _T1 > (__x), std::forward < _T2 > (__y)); + } +} + +typedef long size_t; +namespace std +{ + template < typename > class allocator; + template < class > struct char_traits; + template < typename _CharT, typename = char_traits < _CharT >, typename = + allocator < _CharT > >class basic_string; + typedef basic_string < char >string; +} +namespace __gnu_cxx +{ + template < bool > class __pool; + template < template < bool > class, bool > struct __common_pool + { + }; + template < template < bool > class, bool > struct __common_pool_base; + template < template < bool > class _PoolTp > + struct __common_pool_base <_PoolTp, true >:__common_pool < _PoolTp, true > + { + }; + template < template < bool > class _PoolTp, + bool _Thread > struct __common_pool_policy:__common_pool_base < _PoolTp, + _Thread > + { + template < typename, template < bool > class _PoolTp1 = + _PoolTp, bool _Thread1 = _Thread > struct _M_rebind + { + typedef __common_pool_policy < _PoolTp1, _Thread1 > other; + }; + }; + template < typename _Tp > class __mt_alloc_base + { + }; +template < typename _Tp, typename _Poolp = __common_pool_policy < __pool, true > >class __mt_alloc:public __mt_alloc_base < + _Tp + > + { + public:size_t size_type; + typedef _Tp value_type; + template < typename _Tp1, typename _Poolp1 = _Poolp > struct rebind + { + typedef typename _Poolp1::template _M_rebind < _Tp1 >::other pol_type; + typedef __mt_alloc < _Tp1, pol_type > other; + }; + }; +} + +namespace std +{ + template < typename _Tp > class allocator:public __gnu_cxx::__mt_alloc < + _Tp > + { + }; + template < typename, typename > struct unary_function + { + }; + template < typename, typename, typename > struct binary_function + { + }; + template < typename _Tp > struct equal_to:binary_function < _Tp, _Tp, bool > + { + }; +} + +namespace boost +{ + template < class > struct hash; + template < class K, class T, class = hash < K >, class = + std::equal_to < K >, class = + std::allocator < std::pair < const K, T > >>class unordered_map; + template < >struct hash <std::string >:std::unary_function < std::string, + size_t > + { + }; + namespace unordered_detail + { + template < class Alloc, class T > struct rebind_wrap + { + typedef typename Alloc::template rebind < T >::other type; + }; + } + namespace unordered_detail + { + size_t default_bucket_count; + template < class, class > struct map_extractor; + struct ungrouped + { + }; + template < class T > class hash_table:T::buckets, T::buffered_functions + { + }; + template < class, class, class H, class P, class A, class, class G > struct types + { + typedef H hasher; + typedef P key_equal; + typedef A value_allocator; + }; + template < class T > class hash_unique_table:T + { + public:typedef typename T::hasher hasher; + typedef typename T::key_equal key_equal; + typedef typename T::value_allocator value_allocator; + typedef typename T::table table; + hash_unique_table (size_t n, hasher, key_equal, + value_allocator & a):table (n, a) // { dg-error "is not a direct base" } + { + } + }; + template < class K, class H, class P, class A > struct map:types < K, + typename A::value_type, H, P, A, map_extractor < K, + typename A::value_type >, ungrouped > + { + typedef hash_unique_table < map < K, H, P, A > >impl; + typedef hash_table < map < K, H, P, A > >table; + }; + } + template < class K, class T, class H, class P, class A > class unordered_map + { + typedef std::pair < const K, T > value_type; + typedef H hasher; + typedef P key_equal; + typedef A allocator_type; + typedef typename unordered_detail::rebind_wrap < allocator_type, + value_type >::type value_allocator; + typedef boost::unordered_detail::map < K, H, P, value_allocator > types; + typedef typename types::impl table; + typedef size_t size_type; + 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 "required" } + { + } + }; +} + +void +foo (const int &a) +{ + typedef boost::unordered_map < std::string, int >Name2Port; + Name2Port b; // { dg-message "required" } + std::make_pair (a, b); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr47476.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr47476.C new file mode 100644 index 0000000..bf9a065 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr47476.C @@ -0,0 +1,9 @@ +// PR c++/47476 +// { dg-do compile { target c++11 } } + +int +foo (int a, int b) +{ + const bool c ((a != 0) == (b != 26)); + return c; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr48522.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr48522.C new file mode 100644 index 0000000..560e70b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr48522.C @@ -0,0 +1,24 @@ +// { dg-do compile { target c++11 } } + +template <typename T> +struct Handle +{ + Handle(T& t); +}; + +template<class T> +struct Class { + struct Struct {} data; + void f(); + void g(); +}; + +template<class T> +void Class<T>::f() { + Handle< decltype((data)) > handle(data); +} + +template<class T> +void Class<T>::g() { + Handle< decltype((data)) > handle(data); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr50025.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr50025.C new file mode 100644 index 0000000..1f7d8d5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr50025.C @@ -0,0 +1,40 @@ +// { dg-do compile { target c++11 } } + +#include <utility> + +class A +{ +public: + + A(int a, int& b, int&& c) + : m_a{a}, + m_b{b}, + m_c{std::move(c)} + {} + +private: + + int m_a; + int& m_b; + int&& m_c; +}; + + +struct X {}; + +class B +{ +public: + + B(X& q, X&& r, const X& s) + : m_q{q}, + m_r{std::move(r)}, + m_s{s} + {} + +private: + + X& m_q; + X&& m_r; + const X& m_s; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr50491.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr50491.C new file mode 100644 index 0000000..d203a33 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr50491.C @@ -0,0 +1,17 @@ +// { dg-do compile { target c++11 } } + +struct GrandParent { + void *get(); +}; + +template<class OBJ> +struct Parent : public GrandParent{ +}; + +template<typename T> +struct Child : public Parent<T> { + using GrandParent::get; + void Foo() { + void* ex = get(); + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr50901.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr50901.C new file mode 100644 index 0000000..de82435 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr50901.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/pr51150.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51150.C new file mode 100644 index 0000000..af1d1cf --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51150.C @@ -0,0 +1,20 @@ +// PR c++/51150 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/pr51216.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51216.C new file mode 100644 index 0000000..356b628 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51216.C @@ -0,0 +1,11 @@ +// PR c++/51216 +// { dg-do compile { target c++11 } } +// { dg-options "" } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/pr51225.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51225.C new file mode 100644 index 0000000..f80bd0e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51225.C @@ -0,0 +1,14 @@ +// PR c++/51225 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/pr51226.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51226.C new file mode 100644 index 0000000..1e048ef --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51226.C @@ -0,0 +1,9 @@ +// PR c++/51226 +// { dg-do compile { target c++11 } } + +template<int> struct A // { dg-error "provided" } +{ + enum E : int; +}; + +template<> enum A<>::E : int {} // { dg-error "wrong number|expected" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51313.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51313.C new file mode 100644 index 0000000..eb304ba --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51313.C @@ -0,0 +1,18 @@ +// PR c++/51313 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/pr51420.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51420.C new file mode 100644 index 0000000..7aa80e5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51420.C @@ -0,0 +1,8 @@ +// { dg-do compile { target 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-4.9/gcc/testsuite/g++.dg/cpp0x/pr51463.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51463.C new file mode 100644 index 0000000..6a57e47 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51463.C @@ -0,0 +1,7 @@ +// PR c++/51463 +// { dg-do compile { target c++11 } } + +struct A +{ + static virtual int i = 0; // { dg-error "both virtual and static|declared as" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51547.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51547.C new file mode 100644 index 0000000..578a799 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51547.C @@ -0,0 +1,50 @@ +// PR c++/51547 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/pr51619.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51619.C new file mode 100644 index 0000000..9a73188 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51619.C @@ -0,0 +1,6 @@ +// PR c++/51619 +// { dg-do compile { target c++11 } } + +struct A { virtual ~A(); }; +struct B { A a[1][1]; } b; +struct C { A a[3][3]; } c; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51786.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51786.C new file mode 100644 index 0000000..69b7441 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr51786.C @@ -0,0 +1,8 @@ +// PR c++/51786 +// { dg-do compile { target c++11 } } + +enum E {}; +struct A {}; + +void foo() { decltype(E{}); } // { dg-error "does not declare anything" } +void bar() { decltype(A{}); } // { dg-error "does not declare anything" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr52440.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr52440.C new file mode 100644 index 0000000..0210f53 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr52440.C @@ -0,0 +1,27 @@ +// PR c++/52440 +// { dg-do compile { target c++11 } } + +template<bool> +struct V +{ + typedef void type; +}; + +template<typename T> +struct X +{ + template<typename> + static constexpr bool always_true() + { + return true; + } + + template<typename U, + typename = typename V<always_true<U>()>::type> + X(U &&) {} +}; + +int main() +{ + X<int> x(42); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr52744.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr52744.C new file mode 100644 index 0000000..1a01fb2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr52744.C @@ -0,0 +1,83 @@ +// PR c++/52744 +// { dg-do compile { target c++11 } } + +struct T +{ + int a; + void b(){} + int c(int) + { + return 1; + } +}; + +template<typename CT, CT> struct member_helper; + +template<typename FT, FT(T::*mem)> +struct member_helper<FT(T::*), mem> +{ + static const char* worker() + { + return "for members"; + } +}; + +template<typename Return, typename... Args, Return(T::*fun)(Args...)> +struct member_helper<Return(T::*)(Args...), fun> +{ + static const char* worker() + { + return "for member functions returning non void"; + } +}; + +template<typename... Args, void(T::*fun)(Args...)> +struct member_helper<void(T::*)(Args...), fun> +{ + static const char* worker() + { + return "for member functions returning void"; + } +}; + +void member_test() +{ + member_helper<decltype(&T::a), &T::a>::worker(); + member_helper<decltype(&T::b), &T::b>::worker(); + member_helper<decltype(&T::c), &T::c>::worker(); +} + +typedef void lua_State; + +template<typename T, T> class function_helper +{ + static_assert(sizeof(T) != sizeof(T), + "Error: function_helper works with functions (duh)"); +}; + +template<typename Return, typename... Args, Return(*func)(Args...)> +struct function_helper<Return(*)(Args...), func> +{ + static int wrapper(lua_State* l) + { + return 1; + } +}; + +template<typename... Args, void(*func)(Args...)> +struct function_helper<void(*)(Args...), func> +{ + static int wrapper(lua_State* l) + { + return 0; + } +}; + +int ciao(int){ return 0; } +void ciao2(int){} + +void function_test() +{ + function_helper<decltype(&ciao), &ciao>::wrapper(0); + function_helper<decltype(&ciao2), &ciao2>::wrapper(0); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr52841.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr52841.C new file mode 100644 index 0000000..f6467f8 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/pr54318.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr54318.C new file mode 100644 index 0000000..4dac31b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr54318.C @@ -0,0 +1,24 @@ +// PR c++/54318 +// { dg-do compile { target c++11 } } + +template <typename T> +struct wrapped +{ + typedef T type; +}; + +template <typename T> +typename T::type unwrap1(T); + +int unwrap(int); + +template <typename T> +auto unwrap(T t) -> decltype(unwrap(unwrap1(t))) +{ + return unwrap(unwrap1(t)); +} + +int main() +{ + unwrap(wrapped<wrapped<int>>()); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr54323.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr54323.C new file mode 100644 index 0000000..71b6c71 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr54323.C @@ -0,0 +1,37 @@ +// PR c++/54323 +// { dg-do compile { target c++11 } } + +template<bool, typename T = void> +struct enable_if { }; + +template<typename T> +struct enable_if<true, T> +{ typedef T type; }; + +template<template<typename> class CRTP, typename T> +class Base +{ +public: + template<template<typename> class CRTP0, typename T0, class> + friend int func(const Base<CRTP0, T0>& rhs); + +protected: + int n; +}; + +template<template<typename> class CRTP0, typename T0, + class = typename enable_if<true>::type> +int func(const Base<CRTP0, T0>& rhs) +{ + return rhs.n; +} + +template<typename T> +class Derived : public Base<Derived, T> {}; + +int main() +{ + Derived<int> x; + func(x); + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr57101.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr57101.C new file mode 100644 index 0000000..94b576f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr57101.C @@ -0,0 +1,221 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-fcompare-debug" } + +typedef long unsigned size_t; +namespace +{ + template < typename _Tp, _Tp __v > struct integral_constant + { + static const _Tp value = __v; + }; + typedef integral_constant < bool, false > false_type; + template < typename > struct remove_cv; + template < typename > struct __is_void_helper:false_type + { + }; + template + < + typename + _Tp + > + struct + is_void:integral_constant + < bool, (__is_void_helper < typename remove_cv < _Tp >::type >::value) > + { + }; + template < typename > struct is_function:false_type + { + }; + template < typename _Tp > struct remove_const + { + typedef _Tp type; + }; + template < typename _Tp > struct remove_volatile + { + typedef _Tp type; + }; + template < typename _Tp > struct remove_cv + { + typedef + typename + remove_const < typename remove_volatile < _Tp >::type >::type type; + }; + template < typename > struct is_lvalue_reference:false_type + { + }; + template < typename _Tp, bool = is_void < _Tp >::value > struct __add_rvalue_reference_helper + { + typedef _Tp type; + }; + template + < + typename + _Tp > struct add_rvalue_reference:__add_rvalue_reference_helper < _Tp > + { + }; + template + < typename _Tp > typename add_rvalue_reference < _Tp >::type declval (); + template + < + typename, + typename + _To, bool = (is_function < _To >::value) > struct __is_convertible_helper; + template + < + typename + _From, typename _To > struct __is_convertible_helper <_From, _To, false > + { + static const bool __value = sizeof ((declval < _From > ())); + }; + template + < + typename + _From, + typename + _To + > + struct + is_convertible:integral_constant + < bool, __is_convertible_helper < _From, _To >::__value > + { + }; + template < bool, typename _Tp = void >struct enable_if + { + typedef _Tp type; + }; + template < typename _Tp > struct identity + { + typedef _Tp type; + }; + template + < + typename + _Tp + > + typename + enable_if + < + is_lvalue_reference + < _Tp >::value, _Tp >::type forward (typename identity < _Tp >::type) + { + return 0; + + } + template < class _T1, class > struct pair + { + _T1 first; + template < class _U1, class = typename enable_if < is_convertible < _U1, _T1 >::value >::type > pair (_U1 __x): + first + (forward < _U1 > (__x)) + { + } + }; +} + +namespace __gnu_cxx +{ + template < typename > class new_allocator + { + }; +} + +namespace std +{ + template < typename _Tp > class allocator:__gnu_cxx::new_allocator < _Tp > + { + public: + template < typename > struct rebind + { + typedef allocator other; + }; + }; + template < typename, typename > struct unary_function; + template < typename, typename, typename > struct binary_function + { + }; + template < typename _Tp > struct less:binary_function < _Tp, _Tp, bool > + { + }; + template + < + typename + _Pair + > struct _Select1st:unary_function < _Pair, typename _Pair::first_type > + { + }; + template < typename > struct _Rb_tree_node; + template + < + typename, + typename + _Val, + typename, + typename _Compare, typename _Alloc = allocator < _Val > >class _Rb_tree + { + typedef + typename + _Alloc::template + rebind < _Rb_tree_node < _Val > >::other _Node_allocator; + public: + typedef _Alloc allocator_type; + template < typename _Key_compare > struct _Rb_tree_impl + { + _Rb_tree_impl (_Key_compare, _Node_allocator); + }; + _Rb_tree_impl < _Compare > _M_impl; + _Rb_tree (_Compare __comp, allocator_type __a): + _M_impl (__comp, __a) + { + } + }; + template < class _E > class initializer_list + { + typedef size_t size_type; + typedef _E *iterator; + iterator _M_array; + size_type _M_len; + }; + template + < + typename + _Key, + typename + _Tp, + typename + _Compare + = + less + < + _Key >, typename _Alloc = allocator < pair < _Key, _Tp > > >class multimap + { + typedef _Key key_type; + typedef pair < _Key, _Tp > value_type; + typedef _Compare key_compare; + typedef _Alloc allocator_type; + typedef + _Rb_tree + < + key_type, + value_type, _Select1st < value_type >, key_compare > _Rep_type; + _Rep_type _M_t; + public: + multimap (initializer_list < value_type >, _Compare __comp = _Compare (), allocator_type __a = allocator_type ()): + _M_t + (__comp, __a) + { + } + }; +} + +using namespace std; +void +test01 () +{ + typedef multimap < int, double >Container; + Container ( + { + { + 1} + } + ); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr57172.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr57172.C new file mode 100644 index 0000000..2108838 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr57172.C @@ -0,0 +1,7 @@ +// PR c++/57172 +// { dg-do compile { target c++11 } } + +template <typename T> int f (T&) { return 0; } +template <typename T> int f (T&&) = delete; +int i; +int j = f (i); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr57416.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr57416.C new file mode 100644 index 0000000..104f1a7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr57416.C @@ -0,0 +1,45 @@ +// PR c++/57416 +// { dg-do compile { target c++11 } } + +struct Nothing +{ +}; + +template <class PARENTDATA> +void func3 (PARENTDATA & p_parent_data) +{ + struct Data + { + PARENTDATA & parent_data = p_parent_data; // { dg-error "parameter" } + } data; +} + +template <class PARENTDATA> +void func2 (PARENTDATA & p_parent_data) +{ + struct Data + { + PARENTDATA & parent_data = p_parent_data; // { dg-error "parameter" } + } data; + + data.parent_data.x = 5; + func3(data); +} + +template <class PARENTDATA> +void func1 (PARENTDATA & p_parent_data) +{ + struct Data + { + PARENTDATA & parent_data = p_parent_data; // { dg-error "parameter" } + int x = 1; + } data; + + func2(data); +} + +int main() +{ + Nothing nothing; + func1(nothing); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr57981.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr57981.C new file mode 100644 index 0000000..33f4637 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr57981.C @@ -0,0 +1,18 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-Wall -Wextra" } + +template<class T> +void f(T t, void* = 0) // { dg-warning "unused parameter" } +{ +} + +template<class T> +auto g(T t) -> decltype(f(t)) +{ + f(t); +} + +int main() +{ + g(0); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58072.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58072.C new file mode 100644 index 0000000..6d48a55 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58072.C @@ -0,0 +1,17 @@ +// { dg-do compile { target c++11 } } + +// PR c++/58072 + +extern 'c'void*blah(void*); // { dg-error "expected unqualified-id before user-defined character literal" } +extern L'c'void*Lblah(void*); // { dg-error "expected unqualified-id before user-defined character literal" } +extern u'c'void*ublah(void*); // { dg-error "expected unqualified-id before user-defined character literal" } +extern U'c'void*Ublah(void*); // { dg-error "expected unqualified-id before user-defined character literal" } + +extern "c"void*strblah(void*); // { dg-error "expected unqualified-id before user-defined string literal" } +extern L"c"void*Lstrblah(void*); // { dg-error "expected unqualified-id before user-defined string literal" } +extern u"c"void*ustrblah(void*); // { dg-error "expected unqualified-id before user-defined string literal" } +extern U"c"void*Ustrblah(void*); // { dg-error "expected unqualified-id before user-defined string literal" } +extern u8"c"void*u8strblah(void*); // { dg-error "expected unqualified-id before user-defined string literal" } + +extern 123void*ULLblah(void*); // { dg-error "expected unqualified-id before numeric constant" } +extern 123.456void*Ldblblah(void*); // { dg-error "expected unqualified-id before numeric constant" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58080.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58080.C new file mode 100644 index 0000000..82f200d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58080.C @@ -0,0 +1,14 @@ +// PR c++/58080 +// { dg-do compile { target c++11 } } + +template<class A, class B> +struct Eval +{ + void foo(A a, B b) { bar(a,b, 0); } + auto bar(A a, B b, decltype(a+b)* _) -> decltype(a+b) { return a+b; } // { dg-error "pointer" } +}; + +int main() +{ + Eval<int,void*> eiv; eiv.foo(0,0); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58510.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58510.C new file mode 100644 index 0000000..71f2520 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58510.C @@ -0,0 +1,11 @@ +// PR c++/58510 +// { dg-do compile { target c++11 } } + +void foo() +{ + union + { // { dg-error "multiple" } + int i = 0; + char c = 0; + }; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58563.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58563.C new file mode 100644 index 0000000..c9e3e30 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58563.C @@ -0,0 +1,8 @@ +// PR c++/58563 +// { dg-do compile { target c++11 } } + +template<int> void foo() +{ + enum E {}; + E().E::~T(); // { dg-error "not a class" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58674.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58674.C new file mode 100644 index 0000000..fe97c6d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58674.C @@ -0,0 +1,18 @@ +// PR c++/58674 +// { dg-do compile { target c++11 } } + +template<int> struct A {}; + +template<int N> using B = A<N>; + +template<typename T> struct C +{ + B<T::i> b; // { dg-error "not usable" } +}; + +struct X +{ + static const int i; +}; + +C<X> c; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58707.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58707.C new file mode 100644 index 0000000..12f2e30 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58707.C @@ -0,0 +1,6 @@ +// PR c++/58707 +// { dg-do compile { target c++11 } } + +template<int i> class TC { }; +constexpr int foo[] = { 42 }; +TC<foo[0 > 1]> bar; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58871.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58871.C new file mode 100644 index 0000000..5920f5c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr58871.C @@ -0,0 +1,12 @@ +// PR c++/59111 +// { dg-do compile { target c++11 } } + +template<typename T> struct A : virtual T // { dg-error "base type" } +{ + A(); + A(const A&); +}; + +template<typename T> A<T>::A(const A<T>&) = default; + +A<int> a = A<int>(); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr59111.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr59111.C new file mode 100644 index 0000000..4e48854 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr59111.C @@ -0,0 +1,5 @@ +// PR c++/59111 +// { dg-do compile { target c++11 } } + +auto& foo(); // { dg-error "type specifier without trailing return type" "" { target { ! c++1y } } } +int i = foo(); // { dg-error "" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr59641.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr59641.C new file mode 100644 index 0000000..36af96a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr59641.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } +typedef int T __attribute__((vector_size(2*sizeof(int)))); + +void foo(T& r, const T& a, const T& b) +{ + constexpr T c = a < b; // { dg-error "constant" } + r = c ? a : b; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr60047.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr60047.C new file mode 100644 index 0000000..ab73e75 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr60047.C @@ -0,0 +1,14 @@ +// PR c++/60047 +// { dg-do compile { target c++11 } } + +struct B { }; + +template<typename T> struct A : virtual B +{ + A(); + A(const A&); +}; + +template<typename T> A<T>::A(const A<T>&) = default; + +A<int> a = A<int>(); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr60215.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr60215.C new file mode 100644 index 0000000..2970017 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr60215.C @@ -0,0 +1,8 @@ +// PR c++/60215 +// { dg-do compile { target c++11 } } + +struct A +{ + void foo(); + int i : foo; // { dg-error "width" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ptrmem-cst-arg1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ptrmem-cst-arg1.C new file mode 100644 index 0000000..ed12655 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ptrmem-cst-arg1.C @@ -0,0 +1,9 @@ +// Origin PR c++/51476 +// { dg-do compile { target 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-4.9/gcc/testsuite/g++.dg/cpp0x/range-for1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for1.C new file mode 100644 index 0000000..4fecdc7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for1.C @@ -0,0 +1,16 @@ +// Test for range-based for loop +// Test the loop with an array + +// { dg-do run { target c++11 } } + +extern "C" void abort(); + +int main() +{ + int a[] = {1,2,3,4}; + int sum = 0; + for (int x : a) + sum += x; + if (sum != 10) + abort(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for10.C new file mode 100644 index 0000000..1397830 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for10.C @@ -0,0 +1,18 @@ +// PR c++/47388 +// { dg-do compile { target c++11 } } +// { dg-options "-fno-for-scope" } + +template <int> +void +foo () +{ + int a[] = { 1, 2, 3, 4 }; + for (int i : a) + ; +} + +void +bar () +{ + foo <0> (); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for11.C new file mode 100644 index 0000000..d7dde91 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for11.C @@ -0,0 +1,39 @@ +// Test for range-based for loop +// Test the loop with a custom iterator +// with begin/end as member functions + +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/range-for12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for12.C new file mode 100644 index 0000000..5a2a7d1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for12.C @@ -0,0 +1,115 @@ +// Test for range-based for loop with templates +// and begin/end as member functions + +// { dg-do run { target c++11 } } + +/* 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-4.9/gcc/testsuite/g++.dg/cpp0x/range-for13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for13.C new file mode 100644 index 0000000..ab7bdde --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for13.C @@ -0,0 +1,102 @@ +// Test for errors in range-based for loops +// with member begin/end + +// { dg-do compile { target c++11 } } + +//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-4.9/gcc/testsuite/g++.dg/cpp0x/range-for14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for14.C new file mode 100644 index 0000000..f43e1ab --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for14.C @@ -0,0 +1,94 @@ +// Test for other range-based for loops with +// begin/end member functions + +// { dg-do compile { target c++11 } } + +//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-message "" } +}; + +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-4.9/gcc/testsuite/g++.dg/cpp0x/range-for15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for15.C new file mode 100644 index 0000000..5dd442d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for15.C @@ -0,0 +1,58 @@ +// Test for range-based for loop with templates +// and begin/end as member (non-)virtual functions + +// { dg-do run { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/range-for16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for16.C new file mode 100644 index 0000000..bcc09cb --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for16.C @@ -0,0 +1,20 @@ +// Test for range-based for loop with arrays of +// incomplete type or unknown size + +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/range-for17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for17.C new file mode 100644 index 0000000..6cc3f9b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for17.C @@ -0,0 +1,17 @@ +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/range-for18.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for18.C new file mode 100644 index 0000000..be43638 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for18.C @@ -0,0 +1,16 @@ +// PR c++/48994 + +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/range-for19.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for19.C new file mode 100644 index 0000000..e3f446f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for19.C @@ -0,0 +1,10 @@ +// PR c++/49838 + +// { dg-do compile { target c++11 } } + +int main() +{ + auto a; // { dg-error "no initializer" } + for(auto i: a) // { dg-error "deduce" } + ; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for2.C new file mode 100644 index 0000000..ea845ee --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for2.C @@ -0,0 +1,40 @@ +// Test for range-based for loop +// Test the loop with a custom iterator +// with begin/end in an associated namespace + +// { dg-do compile { target c++11 } } + +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(container &c) + { + return iterator(c.min); + } + + iterator end(container &c) + { + return iterator(c.max + 1); + } +} + +int main() +{ + foo::container c(1,4); + for (int it : c) + ; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for20.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for20.C new file mode 100644 index 0000000..eb3cfe7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for20.C @@ -0,0 +1,36 @@ +// PR c++/49834 +// PR c++/50020 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/range-for21.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for21.C new file mode 100644 index 0000000..4990b48 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for21.C @@ -0,0 +1,8 @@ +// PR c++/49983 +// { dg-do compile { target c++11 } } + +template <class T> +void f(T t) +{ + for (auto v : t); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for22.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for22.C new file mode 100644 index 0000000..d4bb360 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for22.C @@ -0,0 +1,5 @@ +// { dg-do compile { target c++11 } } + +template<int I> void f() { + for (auto i: {I} ); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for23.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for23.C new file mode 100644 index 0000000..849682c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for23.C @@ -0,0 +1,8 @@ +// PR c++/56722 +// { dg-do compile { target c++11 } } + +int main() +{ + for (const auto& i, 21) // { dg-error "has no initializer|expected" } + i; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for24.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for24.C new file mode 100644 index 0000000..b4a5b18 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/range-for25.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for25.C new file mode 100644 index 0000000..8ba9f65 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for25.C @@ -0,0 +1,30 @@ +// PR c++/57243 +// { dg-require-effective-target c++11 } + +struct snarf +{ + template <class T> + void get() {} +}; + +template <class T> +struct container +{ + snarf * begin() { return nullptr; } + snarf * end() { return nullptr; } +}; + +template <class T> +void foo() +{ + container<int> arr; + + for( auto i : arr ) + i.get<int>(); +} + +int main() +{ + return 0; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for26.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for26.C new file mode 100644 index 0000000..71359cd --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for26.C @@ -0,0 +1,7 @@ +// PR c++/58503 +// { dg-require-effective-target c++11 } + +template<int> void foo() +{ + for (auto i : 0) {} // { dg-error "there are no arguments" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for27.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for27.C new file mode 100644 index 0000000..a9cfb8e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for27.C @@ -0,0 +1,15 @@ +// PR c++/58503 +// { dg-require-effective-target c++11 } +// { dg-options "-fpermissive -w" } + +struct c { }; + +template<int> void foo() +{ + for (auto i : c()) { } +} + +c* begin(const c&); +c* end(const c&); + +template void foo<1>(); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for28.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for28.C new file mode 100644 index 0000000..5007349 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for28.C @@ -0,0 +1,11 @@ +// PR c++/59165 +// { dg-require-effective-target c++11 } + +namespace std { +int* begin(int i) { return (int*)0; } +int* end(int i) { return (int*)0; } +} + +int main() { + for (int a : 10) { } // { dg-error "was not declared" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for3.C new file mode 100644 index 0000000..cc6deaf --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for3.C @@ -0,0 +1,41 @@ +// Test for range-based for loop +// Test the loop with a custom iterator +// with begin/end in std + +// { dg-do compile { target c++11 } } + +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) {} +}; + +namespace std +{ + iterator begin(container &c) + { + return iterator(c.min); + } + + iterator end(container &c) + { + return iterator(c.max + 1); + } +} + +int main() +{ + container c(1,4); + for (int it : c) // { dg-error "was not declared" } + { + } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for4.C new file mode 100644 index 0000000..8a3117b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for4.C @@ -0,0 +1,115 @@ +// Test for range-based for loop with templates + +// { dg-do run { target c++11 } } + +/* Preliminary declarations */ +namespace pre +{ + struct iterator + { + int x; + 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 container &c) + { + return iterator(c.min); + } + + iterator end(const container &c) + { + return iterator(c.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-4.9/gcc/testsuite/g++.dg/cpp0x/range-for5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for5.C new file mode 100644 index 0000000..bf04406 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for5.C @@ -0,0 +1,53 @@ +// Test for errors in range-based for loops + +// { dg-do compile { target c++11 } } + +struct container +{ +}; + +int *begin(const container &c) +{ + return 0; +} + +int end(const container &c) //Ops! wrong type +{ + return 0; +} + + +struct Implicit +{ + Implicit(int x) + {} +}; +struct Explicit +{ + explicit Explicit(int x) + {} +}; + +void test1() +{ + container c; + for (int x : c) // { dg-error "inconsistent|conversion" } + ; + + int a[2] = {1,2}; + for (Implicit x : a) + ; + for (Explicit x : a) // { dg-error "conversion" } + ; + for (const Implicit &x : a) + ; + for (Implicit &&x : a) + ; + + //Check the correct scopes + int i; + for (int i : a) // { dg-message "previously declared" } + { + int i; // { dg-error "redeclaration" } + } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for6.C new file mode 100644 index 0000000..366499a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for6.C @@ -0,0 +1,28 @@ +// Test for range-based for loop +// Test the loop with an initializer_list + +// { dg-do run { target c++11 } } + +#include <initializer_list> + +extern "C" void abort(); + +template<typename T> T foo() +{ + T sum = 0; + for (T x : {T(1),T(2),T(3),T(4)}) + sum += x; + if (sum != T(10)) + abort(); +} + +int main() +{ + int sum = 0; + for (int x : {1,2,3,4}) + sum += x; + if (sum != 10) + abort(); + + foo<int>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for7.C new file mode 100644 index 0000000..3e88362 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for7.C @@ -0,0 +1,116 @@ +// PR c++/46056 +// Check that range-based for loop calls destructors +// when required +// { dg-do run { target c++11 } } +extern "C" void abort(); + +int value_counter = 0, it_counter = 0, seq_counter = 0; + +struct Int +{ + int x; + Int(int v) + :x(v) + { + ++value_counter; + } + Int(const Int &o) + :x(o.x) + { + ++value_counter; + } + ~Int() + { + --value_counter; + } +}; + +struct iterator +{ + int x; + iterator(int v) + :x(v) + { + ++it_counter; + } + iterator(const iterator &o) + :x(o.x) + { + ++it_counter; + } + ~iterator() + { + --it_counter; + } + 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) + { + ++seq_counter; + } + container(const container &) = delete; + ~container() + { + --seq_counter; + } +}; + +iterator begin(container &c) +{ + return iterator(c.min); +} + +iterator end(container &c) +{ + return iterator(c.max + 1); +} + +int main() +{ + for (Int x : container(0, 10)) + { + if (value_counter != 1) abort(); + if (it_counter != 2) abort(); + if (seq_counter != 1) abort(); + } + if (value_counter != 0) abort(); + if (it_counter != 0) abort(); + if (seq_counter != 0) abort(); + + try + { + for (Int x : container(0, 10)) + { + if (value_counter != 1) abort(); + if (it_counter != 2) abort(); + if (seq_counter != 1) abort(); + } + if (value_counter != 0) abort(); + if (it_counter != 0) abort(); + if (seq_counter != 0) abort(); + + for (Int x : container(0, 10)) + { + if (value_counter != 1) abort(); + if (it_counter != 2) abort(); + if (seq_counter != 1) abort(); + + if (x.x == 5) + throw 0; + } + } + catch (int) + { + if (value_counter != 0) abort(); + if (it_counter != 0) abort(); + if (seq_counter != 0) abort(); + } + + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for8.C new file mode 100644 index 0000000..a389f66 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for8.C @@ -0,0 +1,15 @@ +// Test for range-based for loop when the declarator declares +// a new type + +// { dg-do compile { target c++11 } } + +#include <initializer_list> + +void test() +{ + for (struct S { } *x : { (S*)0, (S*)0 } ) + ; + + for (struct S { } x : { S(), S() } ) + ; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for9.C new file mode 100644 index 0000000..c51cbf9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/range-for9.C @@ -0,0 +1,11 @@ +// Test for range-based for loop error in C++98 mode + +// { dg-do compile } +// { dg-options "-std=c++98" } + +void test() +{ + int a[] = {0,1,2}; + for (int x : a) // { dg-error "range-based 'for'" } + ; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual-mangle1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual-mangle1.C new file mode 100644 index 0000000..c6ef079 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual-mangle1.C @@ -0,0 +1,37 @@ +// PR c++/56821 +// { dg-require-effective-target c++11 } + +struct A { + // { dg-final { scan-assembler "_ZNR1A1fEv" } } + void f() & {} + // { dg-final { scan-assembler "_ZNO1A1gEv" } } + void g() && {} + // { dg-final { scan-assembler "_ZNKR1A1hEv" } } + void h() const & {} +}; + +// { dg-final { scan-assembler "_Z1jM1AFvvRE" } } +void j(void (A::*)() &) { } +// { dg-final { scan-assembler "_Z1kM1AFvvOE" } } +void k(void (A::*)() &&) { } +// { dg-final { scan-assembler "_Z1lM1AKFvvRE" } } +void l(void (A::*)() const &) { } + +// { dg-final { scan-assembler "_Z1mIFvvOEEvM1AT_" } } +// { dg-final { scan-assembler "_Z1mIFvvREEvM1AT_" } } +// { dg-final { scan-assembler "_Z1mIKFvvREEvM1AT_" } } +template <typename T> +void m(T A::*) {} + +// { dg-final { scan-assembler "_Z1nIM1AFvvOEEvT_" } } +// { dg-final { scan-assembler "_Z1nIM1AFvvREEvT_" } } +// { dg-final { scan-assembler "_Z1nIM1AKFvvREEvT_" } } +template <typename T> +void n(T) {} + +int main() +{ + j(&A::f); k(&A::g); l(&A::h); + m(&A::f); m(&A::g); m(&A::h); + n(&A::f); n(&A::g); n(&A::h); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual-multi-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual-multi-neg.C new file mode 100644 index 0000000..5be8942 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual-multi-neg.C @@ -0,0 +1,7 @@ +// { dg-require-effective-target c++11 } + +class Foo +{ +public: + void bar() const && & { } // { dg-error "multiple ref-qualifiers" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual1.C new file mode 100644 index 0000000..7fa826c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual1.C @@ -0,0 +1,30 @@ +// { dg-require-effective-target c++11 } + +template <class,class> struct ST; +template <class T> struct ST<T,T> {}; + +struct A +{ + int f() &; + char f() &&; +}; + +template <class T> struct B +{ + int f() &; + char f() &&; +}; + +int main() +{ + A a; + a.f(); + A().f(); + ST<decltype(a.f()), int>(); + ST<decltype(A().f()), char>(); + B<int> b; + b.f(); + B<int>().f(); + ST<decltype(b.f()), int>(); + ST<decltype(B<int>().f()), char>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual10.C new file mode 100644 index 0000000..1b6c54f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual10.C @@ -0,0 +1,13 @@ +// PR c++/57252 +// { dg-require-effective-target c++11 } + +struct foo { + void bar() & {} + void bar() && {} +}; + +int main() +{ + auto p = &foo::bar; // { dg-error "" } + (foo{}.*p)(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual11.C new file mode 100644 index 0000000..15dd049 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual11.C @@ -0,0 +1,10 @@ +// PR c++/57253 +// { dg-require-effective-target c++11 } + +template<typename T> struct foo; + +template<> struct foo<void()&> {}; +template<> struct foo<void()> {}; + +int main() +{} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual12.C new file mode 100644 index 0000000..b0a16fe --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual12.C @@ -0,0 +1,22 @@ +// PR c++/57254 +// { dg-require-effective-target c++11 } + +struct foo { + template<typename T> + void bar(T) &; + + template<typename T> + void bar(T) &&; +}; + +template<typename T> +void foo::bar(T) & {} + +template<typename T> +void foo::bar(T) && {} + +int main() +{ + foo f; + f.bar(0); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual13.C new file mode 100644 index 0000000..84d3b0f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual13.C @@ -0,0 +1,29 @@ +// PR c++/57388 +// { dg-require-effective-target c++11 } + +template<class> struct A +{ + static constexpr bool value = false; +}; + +template<class Res, class... Args> +struct A<Res(Args...)> +{ + static constexpr bool value = true; +}; + +template<class Res, class... Args> +struct A<Res(Args...) const &> +{ + static constexpr bool value = true; +}; + +template<class Res, class... Args> +struct A<Res(Args...) const &&> +{ + static constexpr bool value = true; +}; + +static_assert(A<void()>::value, "Ouch"); +static_assert(A<void() const &>::value, ""); // #1 +static_assert(A<void() const &&>::value, ""); // #2 diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual14.C new file mode 100644 index 0000000..8e55551 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual14.C @@ -0,0 +1,18 @@ +// PR c++/57825 +// { dg-do compile { target c++11 } } + +template<typename T> +struct target_class +{}; + +template<typename Class, typename Ret, typename... Args> +struct target_class<Ret (Class::*)(Args...)> +{}; + +template<typename Class, typename Ret, typename... Args> +struct target_class<Ret (Class::*)(Args...) &> +{}; + +template<typename Class, typename Ret, typename... Args> +struct target_class<Ret (Class::*)(Args...) &&> +{}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual2.C new file mode 100644 index 0000000..fa09ab4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual2.C @@ -0,0 +1,75 @@ +// In a .* expression whose object expression is an rvalue, the program is +// ill-formed if the second operand is a pointer to member function with +// ref-qualifier &. In a .* expression whose object expression is an +// lvalue, the program is ill-formed if the second operand is a pointer to +// member function with ref-qualifier &&. + +// { dg-require-effective-target c++11 } + +struct A { + void f() &; + void g() &&; + void h(); +}; + +void one() +{ + A a; + + void (A::*p)() & = &A::f; + (a.*p)(); + (A().*p)(); // { dg-error "" } + + p = &A::g; // { dg-error "" } + p = &A::h; // { dg-error "" } + + void (A::*p2)() && = &A::g; + (A().*p2)(); + (a.*p2)(); // { dg-error "" } + p2 = &A::f; // { dg-error "" } + p2 = &A::h; // { dg-error "" } + + void (A::*p3)() = &A::h; + (a.*p3)(); + (A().*p3)(); + p3 = &A::f; // { dg-error "" } + p3 = &A::g; // { dg-error "" } +} + +template <class T> +struct B { + void f() &; + void g() &&; + void h(); +}; + +template <class T> +void two() +{ + B<T> a; + + void (B<T>::*p)() & = &B<T>::f; + (a.*p)(); + (B<T>().*p)(); // { dg-error "" } + + p = &B<T>::g; // { dg-error "" } + p = &B<T>::h; // { dg-error "" } + + void (B<T>::*p2)() && = &B<T>::g; + (B<T>().*p2)(); + (a.*p2)(); // { dg-error "" } + p2 = &B<T>::f; // { dg-error "" } + p2 = &B<T>::h; // { dg-error "" } + + void (B<T>::*p3)() = &B<T>::h; + (a.*p3)(); + (B<T>().*p3)(); + p3 = &B<T>::f; // { dg-error "" } + p3 = &B<T>::g; // { dg-error "" } +} + +int main() +{ + one(); + two<int>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual3.C new file mode 100644 index 0000000..1b21196 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual3.C @@ -0,0 +1,29 @@ +// An explicitly defaulted function can have a ref-qualifier. + +// { dg-require-effective-target c++11 } + +struct A { + A& operator=(const A&) & = default; +}; + +template<class T> +struct B { + B& operator=(const B&) & = default; +}; + +template<class T> +void f() +{ + B<T> b; + b = B<T>(); + B<T>() = b; // { dg-error "" } +} + +int main() +{ + A a; + a = A(); + A() = a; // { dg-error "" } + + f<int>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual4.C new file mode 100644 index 0000000..5a0ee16 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual4.C @@ -0,0 +1,14 @@ +// 12.1: A constructor shall not be declared with a ref-qualifier. +// 12.4: A destructor shall not be declared with a ref-qualifier. + +// { dg-require-effective-target c++11 } + +struct A { + A() & = default; // { dg-error "constructor" } + ~A() & = default; // { dg-error "destructor" } +}; + +int main() +{ + A a; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual5.C new file mode 100644 index 0000000..e3d26e5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual5.C @@ -0,0 +1,13 @@ +// 13.1: ...cannot be overloaded if any of them, but not all, have a +// ref-qualifier. + +// { dg-require-effective-target c++11 } + +class Y { + void h() &; + void h() const &; // OK + void h() &&; // OK, all declarations have a ref-qualifier + void i() &; // { dg-message "" } + void i() const; // { dg-error "" } prior declaration of i + // has a ref-qualifier +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual6.C new file mode 100644 index 0000000..02e3f6e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual6.C @@ -0,0 +1,15 @@ +// Binding an rvalue to && beats binding it to const& (13.3.3.2). + +// { dg-require-effective-target c++11 } + +struct A +{ + int operator+(int) &&; +}; + +void operator+ (const A&, int); + +int main() +{ + return A() + 42; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual7.C new file mode 100644 index 0000000..2430665 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual7.C @@ -0,0 +1,19 @@ +// typedef test +// { dg-require-effective-target c++11 } + +typedef void F() &; + +F f; // { dg-error "" } +F* p; // { dg-error "" } +extern F& r; // { dg-error "" } + +struct A { + F f; +}; + +int main() +{ + A a; + a.f(); + A().f(); // { dg-error "" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual8.C new file mode 100644 index 0000000..b4c972b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual8.C @@ -0,0 +1,13 @@ +// { dg-require-effective-target c++11 } + +struct A +{ + virtual void f() & = 0; +}; + +struct B: A +{ + void f(); // doesn't override +}; + +B b; // { dg-error "abstract" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual9.C new file mode 100644 index 0000000..cdb8d68 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual9.C @@ -0,0 +1,14 @@ +// PR c++/57064 +// { dg-require-effective-target c++11 } + +template <class T> T&& move(T& t); + +struct A { + void p() &; + int p() &&; +}; + +void g(A &&a) +{ + int i = move(a).p(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/reference_collapsing.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/reference_collapsing.C new file mode 100644 index 0000000..3de8f96 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/reference_collapsing.C @@ -0,0 +1,174 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test the reference collapsing rules. Note that there are recent differences +// for how cv-qualifications are applied to reference types. 7.1.3, 14.3.1 + +// { dg-do compile { target c++11 } } + +template <bool> struct sa; +template <> struct sa<true> {}; + +template <class T, T v> +struct integral_constant +{ + static const T value = v; + typedef T value_type; + typedef integral_constant<T, v> type; +}; + +typedef integral_constant<bool, true> true_type; +typedef integral_constant<bool, false> false_type; + +template <class T> struct is_lvalue_reference : public integral_constant<bool, false> {}; +template <class T> struct is_lvalue_reference<T&> : public integral_constant<bool, true> {}; + +template <class T> struct is_rvalue_reference : public integral_constant<bool, false> {}; +template <class T> struct is_rvalue_reference<T&&> : public integral_constant<bool, true> {}; + +template <class T> struct remove_reference {typedef T type;}; +template <class T> struct remove_reference<T&> {typedef T type;}; +template <class T> struct remove_reference<T&&> {typedef T type;}; + +template <class T> struct is_const : public integral_constant<bool, false> {}; +template <class T> struct is_const<T const> : public integral_constant<bool, true> {}; + +template <class T> struct is_volatile : public integral_constant<bool, false> {}; +template <class T> struct is_volatile<T volatile> : public integral_constant<bool, true> {}; + +struct A {}; + +typedef A& Alref; +typedef const A& cAlref; +typedef volatile A& vAlref; +typedef const volatile A& cvAlref; + +typedef A&& Arref; +typedef const A&& cArref; +typedef volatile A&& vArref; +typedef const volatile A&& cvArref; + +template <class T, bool is_lvalue_ref, bool is_rvalue_ref, bool s_const, bool s_volatile> +void test() +{ + sa<is_lvalue_reference<T>::value == is_lvalue_ref> t1; + sa<is_rvalue_reference<T>::value == is_rvalue_ref> t2; + sa<is_const <typename remove_reference<T>::type>::value == s_const> t3; + sa<is_volatile<typename remove_reference<T>::type>::value == s_volatile> t4; + sa<is_const <typename remove_reference<const T>::type>::value == s_const > t5; + sa<is_volatile<typename remove_reference< volatile T>::type>::value == s_volatile> t6; +} + +int main() +{ + // sanity check + test< A&, true, false, false, false>(); + test<const A&, true, false, true, false>(); + test< volatile A&, true, false, false, true>(); + test<const volatile A&, true, false, true, true>(); + test< A&&, false, true, false, false>(); + test<const A&&, false, true, true, false>(); + test< volatile A&&, false, true, false, true>(); + test<const volatile A&&, false, true, true, true>(); + +// lvalue reference test + + // Alref + test< Alref&, true, false, false, false>(); + test<const Alref&, true, false, false, false>(); + test< volatile Alref&, true, false, false, false>(); + test<const volatile Alref&, true, false, false, false>(); + + // cAlref + test< cAlref&, true, false, true, false>(); + test<const cAlref&, true, false, true, false>(); + test< volatile cAlref&, true, false, true, false>(); + test<const volatile cAlref&, true, false, true, false>(); + + // vAlref + test< vAlref&, true, false, false, true>(); + test<const vAlref&, true, false, false, true>(); + test< volatile vAlref&, true, false, false, true>(); + test<const volatile vAlref&, true, false, false, true>(); + + // cvAlref + test< cvAlref&, true, false, true, true>(); + test<const cvAlref&, true, false, true, true>(); + test< volatile cvAlref&, true, false, true, true>(); + test<const volatile cvAlref&, true, false, true, true>(); + + // Arref + test< Arref&, true, false, false, false>(); + test<const Arref&, true, false, false, false>(); + test< volatile Arref&, true, false, false, false>(); + test<const volatile Arref&, true, false, false, false>(); + + // cArref + test< cArref&, true, false, true, false>(); + test<const cArref&, true, false, true, false>(); + test< volatile cArref&, true, false, true, false>(); + test<const volatile cArref&, true, false, true, false>(); + + // vArref + test< vArref&, true, false, false, true>(); + test<const vArref&, true, false, false, true>(); + test< volatile vArref&, true, false, false, true>(); + test<const volatile vArref&, true, false, false, true>(); + + // vArref + test< cvArref&, true, false, true, true>(); + test<const cvArref&, true, false, true, true>(); + test< volatile cvArref&, true, false, true, true>(); + test<const volatile cvArref&, true, false, true, true>(); + +// rvalue reference test + + // Alref + test< Alref&&, true, false, false, false>(); + test<const Alref&&, true, false, false, false>(); + test< volatile Alref&&, true, false, false, false>(); + test<const volatile Alref&&, true, false, false, false>(); + + // cAlref + test< cAlref&&, true, false, true, false>(); + test<const cAlref&&, true, false, true, false>(); + test< volatile cAlref&&, true, false, true, false>(); + test<const volatile cAlref&&, true, false, true, false>(); + + // vAlref + test< vAlref&&, true, false, false, true>(); + test<const vAlref&&, true, false, false, true>(); + test< volatile vAlref&&, true, false, false, true>(); + test<const volatile vAlref&&, true, false, false, true>(); + + // cvAlref + test< cvAlref&&, true, false, true, true>(); + test<const cvAlref&&, true, false, true, true>(); + test< volatile cvAlref&&, true, false, true, true>(); + test<const volatile cvAlref&&, true, false, true, true>(); + + // Arref + test< Arref&&, false, true, false, false>(); + test<const Arref&&, false, true, false, false>(); + test< volatile Arref&&, false, true, false, false>(); + test<const volatile Arref&&, false, true, false, false>(); + + // cArref + test< cArref&&, false, true, true, false>(); + test<const cArref&&, false, true, true, false>(); + test< volatile cArref&&, false, true, true, false>(); + test<const volatile cArref&&, false, true, true, false>(); + + // vArref + test< vArref&&, false, true, false, true>(); + test<const vArref&&, false, true, false, true>(); + test< volatile vArref&&, false, true, false, true>(); + test<const volatile vArref&&, false, true, false, true>(); + + // cvArref + test< cvArref&&, false, true, true, true>(); + test<const cvArref&&, false, true, true, true>(); + test< volatile cvArref&&, false, true, true, true>(); + test<const volatile cvArref&&, false, true, true, true>(); + + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/reinterpret_cast1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/reinterpret_cast1.C new file mode 100644 index 0000000..7c0463e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/reinterpret_cast1.C @@ -0,0 +1,6 @@ +// PR c++/57869 +// { dg-do compile { target c++11 } } + +void* po = 0; +void (*pf)() = reinterpret_cast<decltype(pf)>(po); +static_assert(sizeof(po) >= sizeof(pf), "Conversion not supported"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-bitfield.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-bitfield.C new file mode 100644 index 0000000..ce93a16 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-bitfield.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } + +struct A +{ + int i : 1; +}; + +int main() +{ + A a; + static_cast<int&&>(a.i); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-bitfield2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-bitfield2.C new file mode 100644 index 0000000..9ca17f2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-bitfield2.C @@ -0,0 +1,17 @@ +// PR c++/51868 +// { dg-do compile { target c++11 } } + +struct A { + A() {} + A(const A&) {} + A(A&&) {} +}; + +struct B { + A a; + int f : 1; +}; + +B func() { + return B(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-cast.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-cast.C new file mode 100644 index 0000000..4b46c54 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-cast.C @@ -0,0 +1,6 @@ +// { dg-do compile { target c++11 } } + +void f(int i) +{ + int&& r = static_cast<int&&>(i); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-cast2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-cast2.C new file mode 100644 index 0000000..6dc5abc --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-cast2.C @@ -0,0 +1,21 @@ +// Test for const_cast to reference (5.2.11/4). +// { dg-do compile { target c++11 } } + +template <class T> T&& xval(); +template <class T> T& lval(); +template <class T> T prval(); + +struct A { }; + +int main() +{ + const_cast<int&>(lval<int>()); + const_cast<int&>(xval<int>()); // { dg-error "" } + const_cast<int&>(prval<int>()); // { dg-error "" } + const_cast<int&&>(lval<int>()); + const_cast<int&&>(xval<int>()); + const_cast<int&&>(prval<int>()); // { dg-error "" } + const_cast<A&&>(lval<A>()); + const_cast<A&&>(xval<A>()); + const_cast<A&&>(prval<A>()); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-cast3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-cast3.C new file mode 100644 index 0000000..6c70324 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/rv-cast4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-cast4.C new file mode 100644 index 0000000..13f369d --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/rv-conv1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-conv1.C new file mode 100644 index 0000000..3482766 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-conv1.C @@ -0,0 +1,9 @@ +// PR c++/49267 +// { dg-do compile { target c++11 } } + +struct X { + operator int&(); + operator int&&(); +}; + +int&&x = X(); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-copy1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-copy1.C new file mode 100644 index 0000000..70d3d71 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-copy1.C @@ -0,0 +1,10 @@ +// PR c++/55017 +// { dg-do compile { target c++11 } } + +struct S { // { dg-error "rvalue ref" } + int&& rr; + S(int&& rr) : rr(static_cast<int&&>(rr)) {} +}; + +S s1(13); +S s2 = s1; // { dg-error "deleted" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-deduce.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-deduce.C new file mode 100644 index 0000000..ce06d13 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-deduce.C @@ -0,0 +1,8 @@ +// PR c++/36816, core issue 873 +// { dg-do compile { target c++11 } } + +template <class T> void h (T&&) { } + +void (*pf)(int&) = &h; +template <> void h(char&); +template void h(double&); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-deduce2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-deduce2.C new file mode 100644 index 0000000..ecaaf38 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-deduce2.C @@ -0,0 +1,18 @@ +// PR c++/48313 +// { dg-do compile { target c++11 } } + +template<typename F> +void f(F&&) { } + +void g() { } + +template<typename T> void h() { } + +int main() +{ + f( g ); // OK + void (&p)() = h<int>; + f( p ); // OK + f( h<int> ); // ??? +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-dotstar.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-dotstar.C new file mode 100644 index 0000000..7834be5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-dotstar.C @@ -0,0 +1,13 @@ +// PR c++/49389 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/rv-func.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-func.C new file mode 100644 index 0000000..e97fe3d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-func.C @@ -0,0 +1,22 @@ +// PR c++/48457, Core 1238 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/rv-func2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-func2.C new file mode 100644 index 0000000..cfa0b21 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-func2.C @@ -0,0 +1,10 @@ +// PR c++/49458 +// { dg-do compile { target c++11 } } + +typedef void ftype(); + +struct A { + operator ftype&(void); +}; + +ftype &&frvref = A(); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-func3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-func3.C new file mode 100644 index 0000000..6738303 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-func3.C @@ -0,0 +1,10 @@ +// DR 1328 +// { dg-do compile { target c++11 } } + +template <class T> struct A { + operator T&(); // #1 + operator T&&(); // #2 +}; +typedef int Fn(); +A<Fn> a; +Fn&& f = a; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-lvalue-req.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-lvalue-req.C new file mode 100644 index 0000000..1ca3c41 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-lvalue-req.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } + +template <class T> T&& declval(); + +int main() +{ + &declval<int>(); // { dg-error "xvalue" } + declval<int>() = declval<int>(); // { dg-error "xvalue" } + declval<int>()++; // { dg-error "xvalue" } + --declval<int>(); // { dg-error "xvalue" } + declval<int>() += 1; // { dg-error "xvalue" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-reinterpret.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-reinterpret.C new file mode 100644 index 0000000..b55b67a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-reinterpret.C @@ -0,0 +1,10 @@ +// { dg-do run { target c++11 } } + +void f(int &); +void f(int &&ir) { ir = 42; } +int main() +{ + int x; + f(reinterpret_cast<int&&>(x)); + return (x != 42); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-restrict.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-restrict.C new file mode 100644 index 0000000..11bf4de --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-restrict.C @@ -0,0 +1,6 @@ +// PR c++/45401 +// { dg-do compile { target c++11 } } + +typedef int &__restrict restrictLvref; +typedef restrictLvref &&rvrefToRestrictLvref; +typedef restrictLvref rvrefToRestrictLvref; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-return.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-return.C new file mode 100644 index 0000000..12a15aa --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-return.C @@ -0,0 +1,18 @@ +// PR c++/41815 +// { dg-do compile { target c++11 } } + +template<typename T, typename U> struct same_type; +template<typename T> struct same_type<T, T> {}; + +int const f() { return 0; } + +int &&r = f(); // binding "int&&" to "int" should succeed +same_type<decltype(f()), int> 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> s3; +same_type<decltype(0,g<int>()), int> s4; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-template1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-template1.C new file mode 100644 index 0000000..dcc4e5e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-template1.C @@ -0,0 +1,11 @@ +// PR c++/44870 +// { dg-do compile { target c++11 } } + +void foo(int&& data); + +template <typename T> +void bar(T t) +{ foo(int()); } + +void baz() +{ bar(0); } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-this.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-this.C new file mode 100644 index 0000000..8064a51 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-this.C @@ -0,0 +1,7 @@ +// PR c++/56701 +// { dg-require-effective-target c++11 } + +struct A +{ + void f(){ A*&& a = this; } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-trivial-bug.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-trivial-bug.C new file mode 100644 index 0000000..b729dc8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv-trivial-bug.C @@ -0,0 +1,33 @@ +// { dg-do compile { target c++11 } } +// PR c++/33235 +#include <cassert> + +int move_construct = 0; +int move_assign = 0; + +struct base2 // { dg-message "declares a move" } +{ + base2() {} + base2(base2&&) {++move_construct;} + base2& operator=(base2&&) {++move_assign; return *this;} +}; + +int test2() +{ + base2 b; + 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 "deleted" } + assert(move_assign == 0); + b = static_cast<base2&&>(b2); + assert(move_assign == 1); +} + +int main() +{ + test2(); + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv10.C new file mode 100644 index 0000000..bba72d2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv10.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } + +struct A +{ + A() = default; + A(const A&) = delete; +}; + +A&& f(); +void h(A&&); +void g() +{ + A&& arr = f(); + h(f()); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv1n.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv1n.C new file mode 100644 index 0000000..9aa534a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv1n.C @@ -0,0 +1,168 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile { target c++11 } } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {char x[1];}; +struct two {char x[2];}; +struct three {char x[3];}; +struct four {char x[4];}; +struct five {char x[5];}; +struct six {char x[6];}; +struct seven {char x[7];}; +struct eight {char x[8];}; + +struct A +{ + A(); + A(const volatile A&&); +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 1 at a time + +one sink_1_1( A&); // { dg-message "" } + +int test1_1() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + sink_1_1(source()); // { dg-error "invalid initialization" } + sink_1_1(c_source()); // { dg-error "invalid initialization" } + sink_1_1(v_source()); // { dg-error "invalid initialization" } + sink_1_1(cv_source()); // { dg-error "invalid initialization" } + return 0; +} + +two sink_1_2(const A&); // { dg-message "" } + +int test1_2() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + sink_1_2(cv_source()); // { dg-error "invalid initialization" } + return 0; +} + +three sink_1_3(volatile A&); // { dg-message "" } + +int test1_3() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + sink_1_3(c_source()); // { dg-error "invalid initialization" } + sink_1_3(v_source()); // { dg-error "invalid initialization" } + sink_1_3(cv_source()); // { dg-error "invalid initialization" } + return 0; +} + +four sink_1_4(const volatile A&); // { dg-message "" } + +int test1_4() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + sink_1_4(cv_source()); // { dg-error "invalid initialization" } + return 0; +} + +five sink_1_5( A&&); // { dg-message "" } + +int test1_5() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + sink_1_5(cva); // { dg-error "invalid initialization" } + sink_1_5(c_source()); // { dg-error "invalid initialization" } + sink_1_5(v_source()); // { dg-error "invalid initialization" } + sink_1_5(cv_source()); // { dg-error "invalid initialization" } + return 0; +} + +six sink_1_6(const A&&); // { dg-message "" } + +int test1_6() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + sink_1_6(cva); // { dg-error "invalid initialization" } + sink_1_6(v_source()); // { dg-error "invalid initialization" } + sink_1_6(cv_source()); // { dg-error "invalid initialization" } + return 0; +} + +seven sink_1_7(volatile A&&); // { dg-message "" } + +int test1_7() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + sink_1_7(cva); // { dg-error "invalid initialization" } + sink_1_7(c_source()); // { dg-error "invalid initialization" } + sink_1_7(cv_source()); // { dg-error "invalid initialization" } + return 0; +} + +eight sink_1_8(const volatile A&&); // { dg-message "" } + +int test1_8() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + sink_1_8(cva); // { dg-error "lvalue" } + return 0; +} + +int main() +{ + return test1_1() + test1_2() + test1_3() + test1_5() + + test1_6() + test1_7(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv1p.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv1p.C new file mode 100644 index 0000000..e4c0ab1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv1p.C @@ -0,0 +1,145 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile { target c++11 } } +// { dg-skip-if "packed attribute missing for struct one/three/five/seven" { "epiphany-*-*" } { "*" } { "" } } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {long x[1];}; +struct two {long x[2];}; +struct three {long x[3];}; +struct four {long x[4];}; +struct five {long x[5];}; +struct six {long x[6];}; +struct seven {long x[7];}; +struct eight {long x[8];}; + +struct A +{ + A(); + A(const volatile A&&); +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 1 at a time + +one sink_1_1( A&); + +int test1_1() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_1_1(a)) == 1 * sizeof(long)> t1; + return 0; +} + +two sink_1_2(const A&); + +int test1_2() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_1_2(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_1_2(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_1_2(source())) == 2 * sizeof(long)> t5; + sa<sizeof(sink_1_2(c_source())) == 2 * sizeof(long)> t6; + return 0; +} + +three sink_1_3(volatile A&); + +int test1_3() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_1_3(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_1_3(va)) == 3 * sizeof(long)> t3; + return 0; +} + +four sink_1_4(const volatile A&); + +int test1_4() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_1_4(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_1_4(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_1_4(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_1_4(cva)) == 4 * sizeof(long)> t4; + return 0; +} + +five sink_1_5( A&&); + +int test1_5() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_1_5(source())) == 5 * sizeof(long)> t5; + return 0; +} + +six sink_1_6(const A&&); + +int test1_6() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_1_6(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_1_6(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +seven sink_1_7(volatile A&&); + +int test1_7() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_1_7(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_1_7(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +eight sink_1_8(const volatile A&&); + +int test1_8() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_1_8(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_1_8(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_1_8(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_1_8(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +int main() +{ + return test1_1() + test1_2() + test1_3() + test1_4() + + test1_5() + test1_6() + test1_7() + test1_8(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv2n.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv2n.C new file mode 100644 index 0000000..289cffb --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv2n.C @@ -0,0 +1,544 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile { target c++11 } } +// { dg-options "" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {char x[1];}; +struct two {char x[2];}; +struct three {char x[3];}; +struct four {char x[4];}; +struct five {char x[5];}; +struct six {char x[6];}; +struct seven {char x[7];}; +struct eight {char x[8];}; + +struct A +{ + A(); + A(const volatile A&&); +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 2 at a time + +one sink_2_12( A&); // { dg-message "note|argument" } +two sink_2_12(const A&); // { dg-message "note|argument" } + +int test2_12() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 44 } + sink_2_12(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 46 } + sink_2_12(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 48 } + return 0; +} + +one sink_2_13( A&); // { dg-message "note|argument" } +three sink_2_13(volatile A&); // { dg-message "note|argument" } + +int test2_13() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 64 } + sink_2_13(source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 66 } + sink_2_13(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 68 } + sink_2_13(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 70 } + sink_2_13(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 72 } + return 0; +} + +one sink_2_14( A&); // { dg-message "note|argument" } +four sink_2_14(const volatile A&); // { dg-message "note|argument" } + +int test2_14() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 88 } + sink_2_14(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 90 } + sink_2_14(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 92 } + return 0; +} + +one sink_2_15( A&); // { dg-message "note|argument" } +five sink_2_15( A&&); // { dg-message "note|argument" } + +int test2_15() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 108 } + sink_2_15(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 110 } + sink_2_15(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 112 } + sink_2_15(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 114 } + sink_2_15(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 116 } + return 0; +} + +one sink_2_16( A&); // { dg-message "note|argument" } +six sink_2_16(const A&&); // { dg-message "note|argument" } + +int test2_16() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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 } + sink_2_16(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 133 } + sink_2_16(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 135 } + sink_2_16(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 137 } + return 0; +} + +one sink_2_17( A&); // { dg-message "note|argument" } +seven sink_2_17(volatile A&&); // { dg-message "note|argument" } + +int test2_17() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + sink_2_17(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 154 } + sink_2_17(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 156 } + sink_2_17(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 158 } + return 0; +} + +one sink_2_18( A&); +eight sink_2_18(const volatile A&&); // { dg-message "argument" } + +int test2_18() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } +} + +two sink_2_23(const A&); // { dg-message "note|argument" } +three sink_2_23(volatile A&); // { dg-message "note|argument" } + +int test2_23() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 188 } + sink_2_23(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 190 } + sink_2_23(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 192 } + return 0; +} + +two sink_2_24(const A&); // { dg-message "note|argument" } +four sink_2_24(const volatile A&); // { dg-message "note|argument" } + +int test2_24() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 208 } + return 0; +} + +three sink_2_34(volatile A&); // { dg-message "three sink_2_34|no known conversion" } +four sink_2_34(const volatile A&); // { dg-message "note|argument" } + +int test2_34() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 224 } + sink_2_34(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 226 } + sink_2_34(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 228 } + return 0; +} + +two sink_2_25(const A&); // { dg-message "two sink_2_25|no known conversion" } +five sink_2_25( A&&); // { dg-message "note|argument" } + +int test2_25() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 244 } + sink_2_25(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 246 } + sink_2_25(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 248 } + return 0; +} + +two sink_2_26(const A&); // { dg-message "two sink_2_26|no known conversion" } +six sink_2_26(const A&&); // { dg-message "note|argument" } + +int test2_26() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 264 } + sink_2_26(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 266 } + sink_2_26(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 268 } + return 0; +} + +two sink_2_27(const A&); // { dg-message "two sink_2_27|no known conversion" } +seven sink_2_27(volatile A&&); // { dg-message "note|argument" } + +int test2_27() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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 } + sink_2_27(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 285 } + return 0; +} + +two sink_2_28(const A&); +eight sink_2_28(const volatile A&&); // { dg-message "argument" } + +int test2_28() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_2_28(va); // { dg-error "lvalue" } + sink_2_28(cva); // { dg-error "lvalue" } +} + +three sink_2_35(volatile A&); // { dg-message "three sink_2_35|no known conversion" } +five sink_2_35( A&&); // { dg-message "note|argument" } + +int test2_35() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 314 } + sink_2_35(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 316 } + sink_2_35(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 318 } + sink_2_35(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 320 } + return 0; +} + +three sink_2_36(volatile A&); // { dg-message "three sink_2_36|no known conversion" } +six sink_2_36(const A&&); // { dg-message "note|argument" } + +int test2_36() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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 } + sink_2_36(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 337 } + sink_2_36(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 339 } + return 0; +} + +three sink_2_37(volatile A&); // { dg-message "three sink_2_37|no known conversion" } +seven sink_2_37(volatile A&&); // { dg-message "note|argument" } + +int test2_37() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 355 } + sink_2_37(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 357 } + sink_2_37(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 359 } + return 0; +} + +three sink_2_38(volatile A&); +eight sink_2_38(const volatile A&&); // { dg-message "argument" } + +int test2_38() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_2_38(ca); // { dg-error "lvalue" } + sink_2_38(cva); // { dg-error "lvalue" } +} + +four sink_2_45(const volatile A&); // { dg-message "note" } +five sink_2_45( A&&); // { dg-message "note|argument" } + +int test2_45() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 388 } + sink_2_45(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 390 } + return 0; +} + +four sink_2_46(const volatile A&); // { dg-message "note" } +six sink_2_46(const A&&); // { dg-message "note|argument" } + +int test2_46() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 406 } + return 0; +} + +four sink_2_47(const volatile A&); // { dg-message "note" } +seven sink_2_47(volatile A&&); // { dg-message "note|argument" } + +int test2_47() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 422 } + return 0; +} + +five sink_2_56( A&&); // { dg-message "note|argument" } +six sink_2_56(const A&&); // { dg-message "note|argument" } + +int test2_56() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 438 } + sink_2_56(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 440 } + sink_2_56(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 442 } + sink_2_56(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 444 } + return 0; +} + +five sink_2_57( A&&); // { dg-message "note|argument" } +seven sink_2_57(volatile A&&); // { dg-message "note|argument" } + +int test2_57() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 460 } + sink_2_57(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 462 } + sink_2_57(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 464 } + sink_2_57(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 466 } + return 0; +} + +five sink_2_58( A&&); // { dg-message "argument" } +eight sink_2_58(const volatile A&&); // { dg-message "argument" } + +int test2_58() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + sink_2_58(cva); // { dg-error "lvalue" } +} + +six sink_2_67(const A&&); // { dg-message "note|argument" } +seven sink_2_67(volatile A&&); // { dg-message "note|argument" } + +int test2_67() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + sink_2_67(va); // { dg-error "lvalue" } + sink_2_67(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 499 } + sink_2_67(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 501 } + sink_2_67(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 503 } + return 0; +} + +six sink_2_68(const A&&); // { dg-message "argument" } +eight sink_2_68(const volatile A&&); // { dg-message "argument" } + +int test2_68() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + sink_2_68(cva); // { dg-error "lvalue" } +} + +seven sink_2_78(volatile A&&); // { dg-message "argument" } +eight sink_2_78(const volatile A&&); // { dg-message "argument" } + +int test2_78() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + sink_2_78(cva); // { dg-error "lvalue" } +} + +int main() +{ + return test2_12() + test2_13() + test2_15() + test2_16() + + test2_17() + test2_23() + test2_25() + test2_26() + + test2_27() + test2_35() + test2_36() + test2_37() + + test2_56() + test2_57() + test2_67(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv2p.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv2p.C new file mode 100644 index 0000000..fb3019f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv2p.C @@ -0,0 +1,507 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile { target c++11 } } +// { dg-skip-if "packed attribute missing for struct one/three/five/seven" { "epiphany-*-*" } { "*" } { "" } } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {long x[1];}; +struct two {long x[2];}; +struct three {long x[3];}; +struct four {long x[4];}; +struct five {long x[5];}; +struct six {long x[6];}; +struct seven {long x[7];}; +struct eight {long x[8];}; + +struct A +{ + A(); + A(const volatile A&&); +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 2 at a time + +one sink_2_12( A&); +two sink_2_12(const A&); + +int test2_12() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_12(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_2_12(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_2_12(source())) == 2 * sizeof(long)> t5; + sa<sizeof(sink_2_12(c_source())) == 2 * sizeof(long)> t6; + return 0; +} + +one sink_2_13( A&); +three sink_2_13(volatile A&); + +int test2_13() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_13(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_2_13(va)) == 3 * sizeof(long)> t3; + return 0; +} + +one sink_2_14( A&); +four sink_2_14(const volatile A&); + +int test2_14() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_14(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_2_14(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_2_14(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_2_14(cva)) == 4 * sizeof(long)> t4; + return 0; +} + +one sink_2_15( A&); +five sink_2_15( A&&); + +int test2_15() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_15(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_2_15(source())) == 5 * sizeof(long)> t5; + return 0; +} + +one sink_2_16( A&); +six sink_2_16(const A&&); + +int test2_16() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_16(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_2_16(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_2_16(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +one sink_2_17( A&); +seven sink_2_17(volatile A&&); + +int test2_17() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_17(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_2_17(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_2_17(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_2_18( A&); +eight sink_2_18(const volatile A&&); + +int test2_18() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_18(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_2_18(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_2_18(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_2_18(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_2_18(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_2_23(const A&); +three sink_2_23(volatile A&); + +int test2_23() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_23(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_2_23(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_2_23(source())) == 2 * sizeof(long)> t5; + sa<sizeof(sink_2_23(c_source())) == 2 * sizeof(long)> t6; + return 0; +} + +two sink_2_24(const A&); +four sink_2_24(const volatile A&); + +int test2_24() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_24(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_2_24(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_2_24(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_2_24(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_2_24(source())) == 2 * sizeof(long)> t5; + sa<sizeof(sink_2_24(c_source())) == 2 * sizeof(long)> t6; +// sa<sizeof(sink_2_24(v_source())) == 4 * sizeof(long)> t7; +// sa<sizeof(sink_2_24(cv_source())) == 4 * sizeof(long)> t8; + return 0; +} + +two sink_2_25(const A&); +five sink_2_25( A&&); + +int test2_25() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_25(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_2_25(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_2_25(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_2_25(c_source())) == 2 * sizeof(long)> t6; + return 0; +} + +two sink_2_26(const A&); +six sink_2_26(const A&&); + +int test2_26() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_26(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_2_26(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_2_26(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_2_26(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +two sink_2_27(const A&); +seven sink_2_27(volatile A&&); + +int test2_27() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_27(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_2_27(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_2_27(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_2_27(c_source())) == 2 * sizeof(long)> t6; + sa<sizeof(sink_2_27(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +two sink_2_28(const A&); +eight sink_2_28(const volatile A&&); + +int test2_28() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_28(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_2_28(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_2_28(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_2_28(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_2_28(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_2_28(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +three sink_2_34(volatile A&); +four sink_2_34(const volatile A&); + +int test2_34() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_34(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_2_34(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_2_34(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_2_34(cva)) == 4 * sizeof(long)> t4; +// sa<sizeof(sink_2_34(source())) == 4 * sizeof(long)> t5; +// sa<sizeof(sink_2_34(c_source())) == 4 * sizeof(long)> t6; +// sa<sizeof(sink_2_34(v_source())) == 4 * sizeof(long)> t7; +// sa<sizeof(sink_2_34(cv_source())) == 4 * sizeof(long)> t8; + return 0; +} + +three sink_2_35(volatile A&); +five sink_2_35( A&&); + +int test2_35() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_35(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_2_35(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_2_35(source())) == 5 * sizeof(long)> t5; + return 0; +} + +three sink_2_36(volatile A&); +six sink_2_36(const A&&); + +int test2_36() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_36(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_2_36(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_2_36(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_2_36(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +three sink_2_37(volatile A&); +seven sink_2_37(volatile A&&); + +int test2_37() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_37(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_2_37(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_2_37(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_2_37(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +three sink_2_38(volatile A&); +eight sink_2_38(const volatile A&&); + +int test2_38() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_38(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_2_38(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_2_38(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_2_38(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_2_38(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_2_38(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +four sink_2_45(const volatile A&); +five sink_2_45( A&&); + +int test2_45() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_45(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_2_45(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_2_45(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_2_45(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_2_45(source())) == 5 * sizeof(long)> t5; +// sa<sizeof(sink_2_45(c_source())) == 4 * sizeof(long)> t6; +// sa<sizeof(sink_2_45(v_source())) == 4 * sizeof(long)> t7; +// sa<sizeof(sink_2_45(cv_source())) == 4 * sizeof(long)> t8; + return 0; +} + +four sink_2_46(const volatile A&); +six sink_2_46(const A&&); + +int test2_46() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_46(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_2_46(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_2_46(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_2_46(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_2_46(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_2_46(c_source())) == 6 * sizeof(long)> t6; +// sa<sizeof(sink_2_46(v_source())) == 4 * sizeof(long)> t7; +// sa<sizeof(sink_2_46(cv_source())) == 4 * sizeof(long)> t8; + return 0; +} + +four sink_2_47(const volatile A&); +seven sink_2_47(volatile A&&); + +int test2_47() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_47(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_2_47(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_2_47(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_2_47(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_2_47(source())) == 7 * sizeof(long)> t5; +// sa<sizeof(sink_2_47(c_source())) == 4 * sizeof(long)> t6; + sa<sizeof(sink_2_47(v_source())) == 7 * sizeof(long)> t7; +// sa<sizeof(sink_2_47(cv_source())) == 4 * sizeof(long)> t8; + return 0; +} + +four sink_2_48(const volatile A&); +eight sink_2_48(const volatile A&&); + +int test2_48() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_48(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_2_48(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_2_48(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_2_48(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_2_48(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_2_48(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_2_48(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_2_48(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +five sink_2_56( A&&); +six sink_2_56(const A&&); + +int test2_56() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_56(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_2_56(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +five sink_2_57( A&&); +seven sink_2_57(volatile A&&); + +int test2_57() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_57(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_2_57(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +five sink_2_58( A&&); +eight sink_2_58(const volatile A&&); + +int test2_58() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_58(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_2_58(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_2_58(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_2_58(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +six sink_2_67(const A&&); +seven sink_2_67(volatile A&&); + +int test2_67() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_67(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_2_67(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +six sink_2_68(const A&&); +eight sink_2_68(const volatile A&&); + +int test2_68() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_68(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_2_68(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_2_68(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_2_68(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +seven sink_2_78(volatile A&&); +eight sink_2_78(const volatile A&&); + +int test2_78() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_78(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_2_78(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_2_78(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_2_78(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +int main() +{ + return test2_12() + test2_13() + test2_14() + test2_15() + + test2_16() + test2_17() + test2_18() + test2_23() + + test2_24() + test2_25() + test2_26() + test2_27() + + test2_28() + test2_34() + test2_35() + test2_36() + + test2_37() + test2_38() + test2_45() + test2_46() + + test2_47() + test2_48() + test2_56() + test2_57() + + test2_58() + test2_67() + test2_68() + test2_78(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv3n.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv3n.C new file mode 100644 index 0000000..765dfbc --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv3n.C @@ -0,0 +1,951 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile { target c++11 } } +// { dg-options "" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {char x[1];}; +struct two {char x[2];}; +struct three {char x[3];}; +struct four {char x[4];}; +struct five {char x[5];}; +struct six {char x[6];}; +struct seven {char x[7];}; +struct eight {char x[8];}; + +struct A +{ + A(); + A(const volatile A&&); +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 3 at a time + +one sink_3_123( A&); // { dg-message "one sink_3_123|no known conversion" } +two sink_3_123(const A&); // { dg-message "two sink_3_123|no known conversion" } +three sink_3_123(volatile A&); // { dg-message "three sink_3_123|no known conversion" } + +int test3_123() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 45 } + sink_3_123(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 47 } + return 0; +} + +one sink_3_125( A&); // { dg-message "one sink_3_125|no known conversion" } +two sink_3_125(const A&); // { dg-message "two sink_3_125|no known conversion" } +five sink_3_125( A&&); // { dg-message "five sink_3_125|no known conversion" } + +one sink_3_124( A&); // { dg-message "one sink_3_124|no known conversion" } +two sink_3_124(const A&); // { dg-message "two sink_3_124|no known conversion" } +four sink_3_124(const volatile A&); // { dg-message "four sink_3_124|no known conversion" } + +int test3_124() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 68 } + return 0; +} + +int test3_125() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 81 } + sink_3_125(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 83 } + sink_3_125(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 85 } + return 0; +} + +one sink_3_126( A&); // { dg-message "one sink_3_126|no known conversion" } +two sink_3_126(const A&); // { dg-message "two sink_3_126|no known conversion" } +six sink_3_126(const A&&); // { dg-message "six sink_3_126|no known conversion" } + +int test3_126() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 102 } + sink_3_126(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 104 } + sink_3_126(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 106 } + return 0; +} + +one sink_3_127( A&); // { dg-message "one sink_3_127|no known conversion" } +two sink_3_127(const A&); // { dg-message "two sink_3_127|no known conversion" } +seven sink_3_127(volatile A&&); // { dg-message "seven sink_3_127|no known conversion" } + +int test3_127() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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 } + sink_3_127(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 124 } + return 0; +} + +one sink_3_128( A&); +two sink_3_128(const A&); +eight sink_3_128(const volatile A&&); // { dg-message "" } + +int test3_128() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + + sink_3_128(va); // { dg-error "lvalue" } + sink_3_128(cva); // { dg-error "lvalue" } +} + +one sink_3_134( A&); // { dg-message "one sink_3_134|no known conversion" } +three sink_3_134(volatile A&); // { dg-message "three sink_3_134|no known conversion" } +four sink_3_134(const volatile A&); // { dg-message "four sink_3_134|no known conversion" } + +int test3_134() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 156 } + sink_3_134(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 158 } + sink_3_134(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 160 } + return 0; +} + +one sink_3_135( A&); // { dg-message "one sink_3_135|no known conversion" } +three sink_3_135(volatile A&); // { dg-message "three sink_3_135|no known conversion" } +five sink_3_135( A&&); // { dg-message "five sink_3_135|no known conversion" } + +int test3_135() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 177 } + sink_3_135(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 179 } + sink_3_135(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 181 } + sink_3_135(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 183 } + return 0; +} + +one sink_3_136( A&); // { dg-message "one sink_3_136|no known conversion" } +three sink_3_136(volatile A&); // { dg-message "note" } +six sink_3_136(const A&&); // { dg-message "" } + +int test3_136() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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 } + sink_3_136(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 201 } + sink_3_136(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 203 } + return 0; +} + +one sink_3_137( A&); // { dg-message "one sink_3_137|no known conversion" } +three sink_3_137(volatile A&); // { dg-message "note" } +seven sink_3_137(volatile A&&); // { dg-message "note" } + +int test3_137() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 220 } + sink_3_137(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 222 } + sink_3_137(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 224 } + return 0; +} + +one sink_3_138( A&); +three sink_3_138(volatile A&); +eight sink_3_138(const volatile A&&); // { dg-message "" } + +int test3_138() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_3_138(ca); // { dg-error "lvalue" } + sink_3_138(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_3_145( A&); // { dg-message "one sink_3_145|no known conversion" } +four sink_3_145(const volatile A&); // { dg-message "note" } +five sink_3_145( A&&); // { dg-message "note" } + +int test3_145() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 256 } + sink_3_145(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 258 } + return 0; +} + +one sink_3_146( A&); // { dg-message "one sink_3_146|no known conversion" } +four sink_3_146(const volatile A&); // { dg-message "note" } +six sink_3_146(const A&&); // { dg-message "note" } + +int test3_146() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 275 } + return 0; +} + +one sink_3_147( A&); // { dg-message "one sink_3_147|no known conversion" } +four sink_3_147(const volatile A&); // { dg-message "note" } +seven sink_3_147(volatile A&&); // { dg-message "note" } + +int test3_147() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 292 } + return 0; +} + +one sink_3_156( A&); // { dg-message "one sink_3_156|no known conversion" } +five sink_3_156( A&&); // { dg-message "note" } +six sink_3_156(const A&&); // { dg-message "" } + +int test3_156() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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 } + sink_3_156(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 310 } + sink_3_156(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 312 } + sink_3_156(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 314 } + return 0; +} + +one sink_3_157( A&); // { dg-message "one sink_3_157|no known conversion" } +five sink_3_157( A&&); // { dg-message "note" } +seven sink_3_157(volatile A&&); // { dg-message "" } + +int test3_157() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + sink_3_157(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 332 } + sink_3_157(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 334 } + sink_3_157(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 336 } + return 0; +} + +one sink_3_158( A&); +five sink_3_158( A&&); +eight sink_3_158(const volatile A&&); // { dg-message "" } + +int test3_158() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + return 0; +} + +one sink_3_167( A&); // { dg-message "one sink_3_167|no known conversion" } +six sink_3_167(const A&&); // { dg-message "" } +seven sink_3_167(volatile A&&); // { dg-message "" } + +int test3_167() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 369 } + sink_3_167(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 371 } + sink_3_167(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 373 } + return 0; +} + +one sink_3_168( A&); +six sink_3_168(const A&&); // { dg-message "" } +eight sink_3_168(const volatile A&&); // { dg-message "" } + +int test3_168() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + return 0; +} + +one sink_3_178( A&); +seven sink_3_178(volatile A&&); // { dg-message "" } +eight sink_3_178(const volatile A&&); // { dg-message "" } + +int test3_178() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + return 0; +} + +two sink_3_234(const A&); // { dg-message "two sink_3_234|no known conversion" } +three sink_3_234(volatile A&); // { dg-message "note" } +four sink_3_234(const volatile A&); // { dg-message "note" } + +int test3_234() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 422 } + sink_3_234(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 424 } + return 0; +} + +two sink_3_235(const A&); // { dg-message "two sink_3_235|no known conversion" } +three sink_3_235(volatile A&); // { dg-message "note" } +five sink_3_235( A&&); // { dg-message "note" } + +int test3_235() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 441 } + sink_3_235(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 443 } + sink_3_235(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 445 } + return 0; +} + +two sink_3_236(const A&); // { dg-message "two sink_3_236|no known conversion" } +three sink_3_236(volatile A&); // { dg-message "note" } +six sink_3_236(const A&&); // { dg-message "note" } + +int test3_236() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 462 } + sink_3_236(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 464 } + sink_3_236(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 466 } + return 0; +} + +two sink_3_237(const A&); // { dg-message "two sink_3_237|no known conversion" } +three sink_3_237(volatile A&); // { dg-message "note" } +seven sink_3_237(volatile A&&); // { dg-message "note" } + +int test3_237() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 483 } + sink_3_237(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 485 } + return 0; +} + +two sink_3_238(const A&); // { dg-message "two sink_3_238|no known conversion" } +three sink_3_238(volatile A&); // { dg-message "three sink_3_238|no known conversion" } +eight sink_3_238(const volatile A&&); // { dg-message "eight sink_3_238|no known conversion" } + +int test3_238() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + return 0; +} + +two sink_3_245(const A&); // { dg-message "two sink_3_245|no known conversion" } +four sink_3_245(const volatile A&); // { dg-message "four sink_3_245|no known conversion" } +five sink_3_245( A&&); // { dg-message "five sink_3_245|no known conversion" } + +int test3_245() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 518 } + return 0; +} + +two sink_3_246(const A&); // { dg-message "two sink_3_246|no known conversion" } +four sink_3_246(const volatile A&); // { dg-message "four sink_3_246|no known conversion" } +six sink_3_246(const A&&); // { dg-message "six sink_3_246|no known conversion" } + +int test3_246() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 535 } + return 0; +} + +two sink_3_247(const A&); // { dg-message "two sink_3_247|no known conversion" } +four sink_3_247(const volatile A&); // { dg-message "four sink_3_247|no known conversion" } +seven sink_3_247(volatile A&&); // { dg-message "seven sink_3_247|no known conversion" } + +int test3_247() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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; +} + +two sink_3_256(const A&); // { dg-message "two sink_3_256|no known conversion" } +five sink_3_256( A&&); // { dg-message "five sink_3_256|no known conversion" } +six sink_3_256(const A&&); // { dg-message "six sink_3_256|no known conversion" } + +int test3_256() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 567 } + sink_3_256(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 569 } + sink_3_256(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 571 } + return 0; +} + +two sink_3_257(const A&); // { dg-message "two sink_3_257|no known conversion" } +five sink_3_257( A&&); // { dg-message "five sink_3_257|no known conversion" } +seven sink_3_257(volatile A&&); // { dg-message "seven sink_3_257|no known conversion" } + +int test3_257() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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 } + sink_3_257(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 589 } + return 0; +} + +two sink_3_258(const A&); +five sink_3_258( A&&); +eight sink_3_258(const volatile A&&); // { dg-message "" } + +int test3_258() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_3_258(va); // { dg-error "lvalue" } + sink_3_258(cva); // { dg-error "lvalue" } + return 0; +} + +two sink_3_267(const A&); // { dg-message "two sink_3_267|no known conversion" } +six sink_3_267(const A&&); // { dg-message "six sink_3_267|no known conversion" } +seven sink_3_267(volatile A&&); // { dg-message "seven sink_3_267|no known conversion" } + +int test3_267() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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 } + sink_3_267(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 622 } + sink_3_267(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 624 } + return 0; +} + +two sink_3_268(const A&); +six sink_3_268(const A&&); +eight sink_3_268(const volatile A&&); // { dg-message "" } + +int test3_268() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_3_268(va); // { dg-error "lvalue" } + sink_3_268(cva); // { dg-error "lvalue" } + return 0; +} + +two sink_3_278(const A&); +seven sink_3_278(volatile A&&); // { dg-message "" } +eight sink_3_278(const volatile A&&); // { dg-message "" } + +int test3_278() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_3_278(va); // { dg-error "lvalue" } + sink_3_278(cva); // { dg-error "lvalue" } + return 0; +} + +three sink_3_345(volatile A&); // { dg-message "three sink_3_345|no known conversion" } +four sink_3_345(const volatile A&); // { dg-message "four sink_3_345|no known conversion" } +five sink_3_345( A&&); // { dg-message "five sink_3_345|no known conversion" } + +int test3_345() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 671 } + sink_3_345(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 673 } + return 0; +} + +three sink_3_346(volatile A&); // { dg-message "three sink_3_346|no known conversion" } +four sink_3_346(const volatile A&); // { dg-message "four sink_3_346|no known conversion" } +six sink_3_346(const A&&); // { dg-message "six sink_3_346|no known conversion" } + +int test3_346() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 690 } + return 0; +} + +three sink_3_347(volatile A&); // { dg-message "three sink_3_347|no known conversion" } +four sink_3_347(const volatile A&); // { dg-message "four sink_3_347|no known conversion" } +seven sink_3_347(volatile A&&); // { dg-message "seven sink_3_347|no known conversion" } + +int test3_347() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 707 } + return 0; +} + +three sink_3_356(volatile A&); // { dg-message "three sink_3_356|no known conversion" } +five sink_3_356( A&&); // { dg-message "five sink_3_356|no known conversion" } +six sink_3_356(const A&&); // { dg-message "six sink_3_356|no known conversion" } + +int test3_356() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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 } + sink_3_356(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 725 } + sink_3_356(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 727 } + return 0; +} + +three sink_3_357(volatile A&); // { dg-message "three sink_3_357|no known conversion" } +five sink_3_357( A&&); // { dg-message "five sink_3_357|no known conversion" } +seven sink_3_357(volatile A&&); // { dg-message "seven sink_3_357|no known conversion" } + +int test3_357() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 744 } + sink_3_357(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 746 } + sink_3_357(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 748 } + return 0; +} + +three sink_3_358(volatile A&); +five sink_3_358( A&&); +eight sink_3_358(const volatile A&&); // { dg-message "" } + +int test3_358() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_3_358(ca); // { dg-error "lvalue" } + sink_3_358(cva); // { dg-error "lvalue" } + return 0; +} + +three sink_3_367(volatile A&); // { dg-message "three sink_3_367|no known conversion" } +six sink_3_367(const A&&); // { dg-message "six sink_3_367|no known conversion" } +seven sink_3_367(volatile A&&); // { dg-message "seven sink_3_367|no known conversion" } + +int test3_367() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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 } + sink_3_367(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 781 } + sink_3_367(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 783 } + return 0; +} + +three sink_3_368(volatile A&); +six sink_3_368(const A&&); // { dg-message "" } +eight sink_3_368(const volatile A&&); // { dg-message "" } + +int test3_368() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_3_368(ca); // { dg-error "lvalue" } + sink_3_368(cva); // { dg-error "lvalue" } + return 0; +} + +three sink_3_378(volatile A&); +seven sink_3_378(volatile A&&); +eight sink_3_378(const volatile A&&); // { dg-message "" } + +int test3_378() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_3_378(ca); // { dg-error "lvalue" } + sink_3_378(cva); // { dg-error "lvalue" } + return 0; +} + +four sink_3_456(const volatile A&); // { dg-message "note" } +five sink_3_456( A&&); // { dg-message "note" } +six sink_3_456(const A&&); // { dg-message "note" } + +int test3_456() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 830 } + return 0; +} + +four sink_3_457(const volatile A&); // { dg-message "note" } +five sink_3_457( A&&); // { dg-message "note" } +seven sink_3_457(volatile A&&); // { dg-message "note" } + +int test3_457() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 847 } + return 0; +} + +four sink_3_467(const volatile A&); // { dg-message "note" } +six sink_3_467(const A&&); // { dg-message "note" } +seven sink_3_467(volatile A&&); // { dg-message "note" } + +int test3_467() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 864 } + return 0; +} + +five sink_3_567( A&&); // { dg-message "five sink_3_567|no known conversion" } +six sink_3_567(const A&&); // { dg-message "six sink_3_567|no known conversion" } +seven sink_3_567(volatile A&&); // { dg-message "seven sink_3_567|no known conversion" } + +int test3_567() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + sink_3_567(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 882 } + sink_3_567(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 884 } + return 0; +} + +five sink_3_568( A&&); // { dg-message "" } +six sink_3_568(const A&&); // { dg-message "" } +eight sink_3_568(const volatile A&&); // { dg-message "" } + +int test3_568() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + sink_3_568(cva); // { dg-error "lvalue" } + return 0; +} + +five sink_3_578( A&&); // { dg-message "" } +seven sink_3_578(volatile A&&); // { dg-message "" } +eight sink_3_578(const volatile A&&); // { dg-message "" } + +int test3_578() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + sink_3_578(cva); // { dg-error "lvalue" } + return 0; +} + +six sink_3_678(const A&&); // { dg-message "six sink_3_678|no known conversion" } +seven sink_3_678(volatile A&&); // { dg-message "seven sink_3_678|no known conversion" } +eight sink_3_678(const volatile A&&); // { dg-message "eight sink_3_678|no known conversion" } + +int test3_678() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + sink_3_678(va); // { dg-error "lvalue" } + sink_3_678(cva); // { dg-error "lvalue" } + sink_3_678(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 938 } + return 0; +} + +int main() +{ + return test3_123() + test3_125() + test3_126() + test3_127() + + test3_135() + test3_136() + test3_137() + test3_156() + + test3_157() + test3_167() + test3_234() + test3_235() + + test3_236() + test3_237() + test3_238() + test3_256() + + test3_257() + test3_267() + test3_356() + test3_357() + + test3_367() + test3_467() + test3_567() + test3_678(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv3p.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv3p.C new file mode 100644 index 0000000..6d4625a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv3p.C @@ -0,0 +1,1070 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile { target c++11 } } +// { dg-skip-if "packed attribute missing for struct one/three/five/seven" { "epiphany-*-*" } { "*" } { "" } } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {long x[1];}; +struct two {long x[2];}; +struct three {long x[3];}; +struct four {long x[4];}; +struct five {long x[5];}; +struct six {long x[6];}; +struct seven {long x[7];}; +struct eight {long x[8];}; + +struct A +{ + A(); + A(const volatile A&&); +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 3 at a time + +one sink_3_123( A&); +two sink_3_123(const A&); +three sink_3_123(volatile A&); + +int test3_123() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_123(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_123(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_123(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_123(source())) == 2 * sizeof(long)> t5; + sa<sizeof(sink_3_123(c_source())) == 2 * sizeof(long)> t6; + return 0; +} + +one sink_3_124( A&); +two sink_3_124(const A&); +four sink_3_124(const volatile A&); + +int test3_124() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_124(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_124(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_124(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_124(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_124(source())) == 2 * sizeof(long)> t5; + sa<sizeof(sink_3_124(c_source())) == 2 * sizeof(long)> t6; + return 0; +} + +one sink_3_125( A&); +two sink_3_125(const A&); +five sink_3_125( A&&); + +int test3_125() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_125(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_125(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_125(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_125(c_source())) == 2 * sizeof(long)> t6; + return 0; +} + +one sink_3_126( A&); +two sink_3_126(const A&); +six sink_3_126(const A&&); + +int test3_126() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_126(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_126(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_126(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_3_126(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +one sink_3_127( A&); +two sink_3_127(const A&); +seven sink_3_127(volatile A&&); + +int test3_127() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_127(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_127(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_127(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_3_127(c_source())) == 2 * sizeof(long)> t6; + sa<sizeof(sink_3_127(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_3_128( A&); +two sink_3_128(const A&); +eight sink_3_128(const volatile A&&); + +int test3_128() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_128(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_128(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_128(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_3_128(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_128(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_128(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_3_134( A&); +three sink_3_134(volatile A&); +four sink_3_134(const volatile A&); + +int test3_134() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_134(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_134(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_134(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_134(cva)) == 4 * sizeof(long)> t4; + return 0; +} + +one sink_3_135( A&); +three sink_3_135(volatile A&); +five sink_3_135( A&&); + +int test3_135() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_135(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_135(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_135(source())) == 5 * sizeof(long)> t5; + return 0; +} + +one sink_3_136( A&); +three sink_3_136(volatile A&); +six sink_3_136(const A&&); + +int test3_136() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_136(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_136(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_136(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_3_136(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +one sink_3_137( A&); +three sink_3_137(volatile A&); +seven sink_3_137(volatile A&&); + +int test3_137() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_137(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_137(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_137(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_3_137(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_3_138( A&); +three sink_3_138(volatile A&); +eight sink_3_138(const volatile A&&); + +int test3_138() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_138(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_138(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_138(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_3_138(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_138(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_138(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_3_145( A&); +four sink_3_145(const volatile A&); +five sink_3_145( A&&); + +int test3_145() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_145(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_145(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_145(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_145(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_145(source())) == 5 * sizeof(long)> t5; + return 0; +} + +one sink_3_146( A&); +four sink_3_146(const volatile A&); +six sink_3_146(const A&&); + +int test3_146() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_146(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_146(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_146(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_146(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_146(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_3_146(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +one sink_3_147( A&); +four sink_3_147(const volatile A&); +seven sink_3_147(volatile A&&); + +int test3_147() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_147(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_147(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_147(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_147(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_147(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_3_147(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_3_148( A&); +four sink_3_148(const volatile A&); +eight sink_3_148(const volatile A&&); + +int test3_148() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_148(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_148(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_148(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_148(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_148(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_3_148(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_148(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_148(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_3_156( A&); +five sink_3_156( A&&); +six sink_3_156(const A&&); + +int test3_156() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_156(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_156(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_156(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +one sink_3_157( A&); +five sink_3_157( A&&); +seven sink_3_157(volatile A&&); + +int test3_157() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_157(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_157(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_157(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_3_158( A&); +five sink_3_158( A&&); +eight sink_3_158(const volatile A&&); + +int test3_158() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_158(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_158(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_158(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_158(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_158(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_3_167( A&); +six sink_3_167(const A&&); +seven sink_3_167(volatile A&&); + +int test3_167() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_167(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_167(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_3_167(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_3_168( A&); +six sink_3_168(const A&&); +eight sink_3_168(const volatile A&&); + +int test3_168() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_168(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_168(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_3_168(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_3_168(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_168(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_3_178( A&); +seven sink_3_178(volatile A&&); +eight sink_3_178(const volatile A&&); + +int test3_178() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_178(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_178(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_3_178(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_178(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_3_178(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_3_234(const A&); +three sink_3_234(volatile A&); +four sink_3_234(const volatile A&); + +int test3_234() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_234(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_234(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_234(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_234(source())) == 2 * sizeof(long)> t5; + sa<sizeof(sink_3_234(c_source())) == 2 * sizeof(long)> t6; + return 0; +} + +two sink_3_235(const A&); +three sink_3_235(volatile A&); +five sink_3_235( A&&); + +int test3_235() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_235(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_235(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_235(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_235(c_source())) == 2 * sizeof(long)> t6; + return 0; +} + +two sink_3_236(const A&); +three sink_3_236(volatile A&); +six sink_3_236(const A&&); + +int test3_236() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_236(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_236(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_236(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_3_236(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +two sink_3_237(const A&); +three sink_3_237(volatile A&); +seven sink_3_237(volatile A&&); + +int test3_237() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_237(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_237(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_237(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_3_237(c_source())) == 2 * sizeof(long)> t6; + sa<sizeof(sink_3_237(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +two sink_3_238(const A&); +three sink_3_238(volatile A&); +eight sink_3_238(const volatile A&&); + +int test3_238() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_238(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_238(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_238(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_3_238(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_238(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_238(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_3_245(const A&); +four sink_3_245(const volatile A&); +five sink_3_245( A&&); + +int test3_245() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_245(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_3_245(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_245(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_245(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_245(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_245(c_source())) == 2 * sizeof(long)> t6; + return 0; +} + +two sink_3_246(const A&); +four sink_3_246(const volatile A&); +six sink_3_246(const A&&); + +int test3_246() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_246(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_3_246(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_246(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_246(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_246(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_3_246(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +two sink_3_247(const A&); +four sink_3_247(const volatile A&); +seven sink_3_247(volatile A&&); + +int test3_247() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_247(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_3_247(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_247(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_247(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_247(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_3_247(c_source())) == 2 * sizeof(long)> t6; + sa<sizeof(sink_3_247(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +two sink_3_248(const A&); +four sink_3_248(const volatile A&); +eight sink_3_248(const volatile A&&); + +int test3_248() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_248(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_3_248(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_248(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_248(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_248(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_3_248(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_248(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_248(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_3_256(const A&); +five sink_3_256( A&&); +six sink_3_256(const A&&); + +int test3_256() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_256(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_3_256(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_256(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_256(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +two sink_3_257(const A&); +five sink_3_257( A&&); +seven sink_3_257(volatile A&&); + +int test3_257() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_257(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_3_257(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_257(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_257(c_source())) == 2 * sizeof(long)> t6; + sa<sizeof(sink_3_257(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +two sink_3_258(const A&); +five sink_3_258( A&&); +eight sink_3_258(const volatile A&&); + +int test3_258() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_258(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_3_258(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_258(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_258(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_258(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_258(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_3_267(const A&); +six sink_3_267(const A&&); +seven sink_3_267(volatile A&&); + +int test3_267() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_267(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_3_267(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_267(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_3_267(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +two sink_3_268(const A&); +six sink_3_268(const A&&); +eight sink_3_268(const volatile A&&); + +int test3_268() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_268(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_3_268(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_268(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_3_268(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_3_268(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_268(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_3_278(const A&); +seven sink_3_278(volatile A&&); +eight sink_3_278(const volatile A&&); + +int test3_278() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_278(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_3_278(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_278(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_3_278(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_278(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_3_278(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +three sink_3_345(volatile A&); +four sink_3_345(const volatile A&); +five sink_3_345( A&&); + +int test3_345() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_345(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_3_345(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_345(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_345(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_345(source())) == 5 * sizeof(long)> t5; + return 0; +} + +three sink_3_346(volatile A&); +four sink_3_346(const volatile A&); +six sink_3_346(const A&&); + +int test3_346() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_346(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_3_346(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_346(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_346(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_346(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_3_346(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +three sink_3_347(volatile A&); +four sink_3_347(const volatile A&); +seven sink_3_347(volatile A&&); + +int test3_347() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_347(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_3_347(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_347(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_347(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_347(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_3_347(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +three sink_3_348(volatile A&); +four sink_3_348(const volatile A&); +eight sink_3_348(const volatile A&&); + +int test3_348() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_348(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_3_348(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_348(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_348(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_348(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_3_348(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_348(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_348(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +three sink_3_356(volatile A&); +five sink_3_356( A&&); +six sink_3_356(const A&&); + +int test3_356() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_356(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_3_356(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_356(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_356(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +three sink_3_357(volatile A&); +five sink_3_357( A&&); +seven sink_3_357(volatile A&&); + +int test3_357() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_357(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_3_357(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_357(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_357(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +three sink_3_358(volatile A&); +five sink_3_358( A&&); +eight sink_3_358(const volatile A&&); + +int test3_358() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_358(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_3_358(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_358(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_358(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_358(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_358(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +three sink_3_367(volatile A&); +six sink_3_367(const A&&); +seven sink_3_367(volatile A&&); + +int test3_367() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_367(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_3_367(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_367(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_3_367(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +three sink_3_368(volatile A&); +six sink_3_368(const A&&); +eight sink_3_368(const volatile A&&); + +int test3_368() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_368(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_3_368(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_368(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_3_368(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_3_368(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_368(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +three sink_3_378(volatile A&); +seven sink_3_378(volatile A&&); +eight sink_3_378(const volatile A&&); + +int test3_378() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_378(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_3_378(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_378(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_3_378(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_378(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_3_378(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +four sink_3_456(const volatile A&); +five sink_3_456( A&&); +six sink_3_456(const A&&); + +int test3_456() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_456(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_3_456(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_456(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_456(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_456(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_456(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +four sink_3_457(const volatile A&); +five sink_3_457( A&&); +seven sink_3_457(volatile A&&); + +int test3_457() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_457(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_3_457(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_457(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_457(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_457(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_457(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +four sink_3_458(const volatile A&); +five sink_3_458( A&&); +eight sink_3_458(const volatile A&&); + +int test3_458() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_458(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_3_458(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_458(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_458(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_458(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_458(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_458(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_458(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +four sink_3_467(const volatile A&); +six sink_3_467(const A&&); +seven sink_3_467(volatile A&&); + +int test3_467() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_467(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_3_467(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_467(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_467(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_467(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_3_467(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +four sink_3_468(const volatile A&); +six sink_3_468(const A&&); +eight sink_3_468(const volatile A&&); + +int test3_468() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_468(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_3_468(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_468(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_468(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_468(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_3_468(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_3_468(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_468(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +four sink_3_478(const volatile A&); +seven sink_3_478(volatile A&&); +eight sink_3_478(const volatile A&&); + +int test3_478() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_478(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_3_478(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_478(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_478(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_478(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_3_478(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_478(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_3_478(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +five sink_3_567( A&&); +six sink_3_567(const A&&); +seven sink_3_567(volatile A&&); + +int test3_567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_567(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_567(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_3_567(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +five sink_3_568( A&&); +six sink_3_568(const A&&); +eight sink_3_568(const volatile A&&); + +int test3_568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_568(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_568(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_3_568(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_568(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +five sink_3_578( A&&); +seven sink_3_578(volatile A&&); +eight sink_3_578(const volatile A&&); + +int test3_578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_578(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_578(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_578(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_3_578(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +six sink_3_678(const A&&); +seven sink_3_678(volatile A&&); +eight sink_3_678(const volatile A&&); + +int test3_678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_3_678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_3_678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +int main() +{ + return test3_123() + test3_124() + test3_125() + test3_126() + + test3_127() + test3_128() + test3_134() + test3_135() + + test3_136() + test3_137() + test3_138() + test3_145() + + test3_146() + test3_147() + test3_148() + test3_156() + + test3_157() + test3_158() + test3_167() + test3_168() + + test3_178() + test3_234() + test3_235() + test3_236() + + test3_237() + test3_238() + test3_245() + test3_246() + + test3_247() + test3_248() + test3_256() + test3_257() + + test3_258() + test3_267() + test3_268() + test3_278() + + test3_345() + test3_346() + test3_347() + test3_348() + + test3_356() + test3_357() + test3_358() + test3_367() + + test3_368() + test3_378() + test3_456() + test3_457() + + test3_458() + test3_467() + test3_468() + test3_478() + + test3_567() + test3_568() + test3_578() + test3_678(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv4n.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv4n.C new file mode 100644 index 0000000..dc56afe --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv4n.C @@ -0,0 +1,1072 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile { target c++11 } } +// { dg-options "" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {char x[1];}; +struct two {char x[2];}; +struct three {char x[3];}; +struct four {char x[4];}; +struct five {char x[5];}; +struct six {char x[6];}; +struct seven {char x[7];}; +struct eight {char x[8];}; + +struct A +{ + A(); + A(const volatile A&&); +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 4 at a time + +one sink_4_1234( A&); // { dg-message "one sink_4_1234|no known conversion" } +two sink_4_1234(const A&); // { dg-message "note" } +three sink_4_1234(volatile A&); // { dg-message "note" } +four sink_4_1234(const volatile A&); // { dg-message "note" } + +int test4_1234() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 46 } + return 0; +} + +one sink_4_1235( A&); // { dg-message "one sink_4_1235|no known conversion" } +two sink_4_1235(const A&); // { dg-message "note" } +three sink_4_1235(volatile A&); // { dg-message "note" } +five sink_4_1235( A&&); // { dg-message "note" } + +int test4_1235() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 64 } + sink_4_1235(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 66 } + return 0; +} + +one sink_4_1236( A&); // { dg-message "one sink_4_1236|no known conversion" } +two sink_4_1236(const A&); // { dg-message "note" } +three sink_4_1236(volatile A&); // { dg-message "note" } +six sink_4_1236(const A&&); // { dg-message "note" } + +int test4_1236() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 84 } + sink_4_1236(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 86 } + return 0; +} + +one sink_4_1237( A&); // { dg-message "one sink_4_1237|no known conversion" } +two sink_4_1237(const A&); // { dg-message "note" } +three sink_4_1237(volatile A&); // { dg-message "note" } +seven sink_4_1237(volatile A&&); // { dg-message "note" } + +int test4_1237() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 104 } + return 0; +} + +one sink_4_1238( A&); +two sink_4_1238(const A&); +three sink_4_1238(volatile A&); +eight sink_4_1238(const volatile A&&); // { dg-message "" } + +int test4_1238() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_4_1238(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_4_1245( A&); // { dg-message "one sink_4_1245|no known conversion" } +two sink_4_1245(const A&); // { dg-message "note" } +four sink_4_1245(const volatile A&); // { dg-message "note" } +five sink_4_1245( A&&); // { dg-message "note" } + +int test4_1245() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 137 } + return 0; +} + +one sink_4_1246( A&); // { dg-message "one sink_4_1246|no known conversion" } +two sink_4_1246(const A&); // { dg-message "note" } +four sink_4_1246(const volatile A&); // { dg-message "note" } +six sink_4_1246(const A&&); // { dg-message "note" } + +int test4_1246() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 155 } + return 0; +} + +one sink_4_1247( A&); // { dg-message "one sink_4_1247|no known conversion" } +two sink_4_1247(const A&); // { dg-message "note" } +four sink_4_1247(const volatile A&); // { dg-message "note" } +seven sink_4_1247(volatile A&&); // { dg-message "note" } + +int test4_1247() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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; +} + +one sink_4_1256( A&); // { dg-message "one sink_4_1256|no known conversion" } +two sink_4_1256(const A&); // { dg-message "note" } +five sink_4_1256( A&&); // { dg-message "note" } +six sink_4_1256(const A&&); // { dg-message "note" } + +int test4_1256() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 189 } + sink_4_1256(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 191 } + sink_4_1256(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 193 } + return 0; +} + +one sink_4_1257( A&); // { dg-message "one sink_4_1257|no known conversion" } +two sink_4_1257(const A&); // { dg-message "note" } +five sink_4_1257( A&&); // { dg-message "note" } +seven sink_4_1257(volatile A&&); // { dg-message "" } + +int test4_1257() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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 } + sink_4_1257(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 212 } + return 0; +} + +one sink_4_1258( A&); +two sink_4_1258(const A&); +five sink_4_1258( A&&); +eight sink_4_1258(const volatile A&&); // { dg-message "" } + +int test4_1258() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_4_1258(va); // { dg-error "lvalue" } + sink_4_1258(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_4_1267( A&); // { dg-message "one sink_4_1267|no known conversion" } +two sink_4_1267(const A&); // { dg-message "note" } +six sink_4_1267(const A&&); // { dg-message "note" } +seven sink_4_1267(volatile A&&); // { dg-message "" } + +int test4_1267() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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 } + sink_4_1267(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 247 } + sink_4_1267(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 249 } + return 0; +} + +one sink_4_1268( A&); +two sink_4_1268(const A&); +six sink_4_1268(const A&&); +eight sink_4_1268(const volatile A&&); // { dg-message "" } + +int test4_1268() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_4_1268(va); // { dg-error "lvalue" } + sink_4_1268(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_4_1278( A&); +two sink_4_1278(const A&); +seven sink_4_1278(volatile A&&); // { dg-message "" } +eight sink_4_1278(const volatile A&&); // { dg-message "" } + +int test4_1278() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_4_1278(va); // { dg-error "lvalue" } + sink_4_1278(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_4_1345( A&); // { dg-message "one sink_4_1345|no known conversion" } +three sink_4_1345(volatile A&); // { dg-message "note" } +four sink_4_1345(const volatile A&); // { dg-message "note" } +five sink_4_1345( A&&); // { dg-message "note" } + +int test4_1345() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 299 } + sink_4_1345(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 301 } + return 0; +} + +one sink_4_1346( A&); // { dg-message "one sink_4_1346|no known conversion" } +three sink_4_1346(volatile A&); // { dg-message "note" } +four sink_4_1346(const volatile A&); // { dg-message "note" } +six sink_4_1346(const A&&); // { dg-message "note" } + +int test4_1346() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 319 } + return 0; +} + +one sink_4_1347( A&); // { dg-message "one sink_4_1347|no known conversion" } +three sink_4_1347(volatile A&); // { dg-message "note" } +four sink_4_1347(const volatile A&); // { dg-message "note" } +seven sink_4_1347(volatile A&&); // { dg-message "note" } + +int test4_1347() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 337 } + return 0; +} + +one sink_4_1356( A&); // { dg-message "one sink_4_1356|no known conversion" } +three sink_4_1356(volatile A&); // { dg-message "note" } +five sink_4_1356( A&&); // { dg-message "note" } +six sink_4_1356(const A&&); // { dg-message "" } + +int test4_1356() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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 } + sink_4_1356(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 356 } + sink_4_1356(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 358 } + return 0; +} + +one sink_4_1357( A&); // { dg-message "one sink_4_1357|no known conversion" } +three sink_4_1357(volatile A&); // { dg-message "note" } +five sink_4_1357( A&&); // { dg-message "note" } +seven sink_4_1357(volatile A&&); // { dg-message "note" } + +int test4_1357() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 376 } + sink_4_1357(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 378 } + sink_4_1357(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 380 } + return 0; +} + +one sink_4_1358( A&); +three sink_4_1358(volatile A&); +five sink_4_1358( A&&); +eight sink_4_1358(const volatile A&&); // { dg-message "" } + +int test4_1358() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_4_1358(ca); // { dg-error "lvalue" } + sink_4_1358(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_4_1367( A&); // { dg-message "one sink_4_1367|no known conversion" } +three sink_4_1367(volatile A&); // { dg-message "note" } +six sink_4_1367(const A&&); // { dg-message "" } +seven sink_4_1367(volatile A&&); // { dg-message "note" } + +int test4_1367() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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 } + sink_4_1367(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 415 } + sink_4_1367(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 417 } + return 0; +} + +one sink_4_1368( A&); +three sink_4_1368(volatile A&); +six sink_4_1368(const A&&); // { dg-message "" } +eight sink_4_1368(const volatile A&&); // { dg-message "" } + +int test4_1368() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_4_1368(ca); // { dg-error "lvalue" } + sink_4_1368(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_4_1378( A&); +three sink_4_1378(volatile A&); +seven sink_4_1378(volatile A&&); +eight sink_4_1378(const volatile A&&); // { dg-message "" } + +int test4_1378() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_4_1378(ca); // { dg-error "lvalue" } + sink_4_1378(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_4_1456( A&); // { dg-message "one sink_4_1456|no known conversion" } +four sink_4_1456(const volatile A&); // { dg-message "note" } +five sink_4_1456( A&&); // { dg-message "note" } +six sink_4_1456(const A&&); // { dg-message "note" } + +int test4_1456() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 467 } + return 0; +} + +one sink_4_1457( A&); // { dg-message "one sink_4_1457|no known conversion" } +four sink_4_1457(const volatile A&); // { dg-message "note" } +five sink_4_1457( A&&); // { dg-message "note" } +seven sink_4_1457(volatile A&&); // { dg-message "note" } + +int test4_1457() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 485 } + return 0; +} + +one sink_4_1467( A&); // { dg-message "one sink_4_1467|no known conversion" } +four sink_4_1467(const volatile A&); // { dg-message "note" } +six sink_4_1467(const A&&); // { dg-message "note" } +seven sink_4_1467(volatile A&&); // { dg-message "note" } + +int test4_1467() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 503 } + return 0; +} + +one sink_4_1567( A&); // { dg-message "one sink_4_1567|no known conversion" } +five sink_4_1567( A&&); // { dg-message "note" } +six sink_4_1567(const A&&); // { dg-message "" } +seven sink_4_1567(volatile A&&); // { dg-message "" } + +int test4_1567() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 521 } + sink_4_1567(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 523 } + return 0; +} + +one sink_4_1568( A&); +five sink_4_1568( A&&); +six sink_4_1568(const A&&); // { dg-message "" } +eight sink_4_1568(const volatile A&&); // { dg-message "" } + +int test4_1568() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + return 0; +} + +one sink_4_1578( A&); +five sink_4_1578( A&&); +seven sink_4_1578(volatile A&&); // { dg-message "" } +eight sink_4_1578(const volatile A&&); // { dg-message "" } + +int test4_1578() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + return 0; +} + +one sink_4_1678( A&); +six sink_4_1678(const A&&); // { dg-message "" } +seven sink_4_1678(volatile A&&); // { dg-message "" } +eight sink_4_1678(const volatile A&&); // { dg-message "" } + +int test4_1678() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + sink_4_1678(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 576 } + return 0; +} + +two sink_4_2345(const A&); // { dg-message "two sink_4_2345|no known conversion" } +three sink_4_2345(volatile A&); // { dg-message "note" } +four sink_4_2345(const volatile A&); // { dg-message "note" } +five sink_4_2345( A&&); // { dg-message "note" } + +int test4_2345() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 594 } + sink_4_2345(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 596 } + return 0; +} + +two sink_4_2346(const A&); // { dg-message "two sink_4_2346|no known conversion" } +three sink_4_2346(volatile A&); // { dg-message "note" } +four sink_4_2346(const volatile A&); // { dg-message "note" } +six sink_4_2346(const A&&); // { dg-message "note" } + +int test4_2346() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 614 } + sink_4_2346(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 616 } + return 0; +} + +two sink_4_2347(const A&); // { dg-message "two sink_4_2347|no known conversion" } +three sink_4_2347(volatile A&); // { dg-message "note" } +four sink_4_2347(const volatile A&); // { dg-message "note" } +seven sink_4_2347(volatile A&&); // { dg-message "note" } + +int test4_2347() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 634 } + return 0; +} + +two sink_4_2348(const A&); // { dg-message "note" } +three sink_4_2348(volatile A&); // { dg-message "note" } +four sink_4_2348(const volatile A&); // { dg-message "note" } +eight sink_4_2348(const volatile A&&); // { dg-message "note" } + +int test4_2348() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_4_2348(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 650 } + return 0; +} + +two sink_4_2356(const A&); // { dg-message "two sink_4_2356|no known conversion" } +three sink_4_2356(volatile A&); // { dg-message "note" } +five sink_4_2356( A&&); // { dg-message "note" } +six sink_4_2356(const A&&); // { dg-message "note" } + +int test4_2356() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 668 } + sink_4_2356(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 670 } + sink_4_2356(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 672 } + return 0; +} + +two sink_4_2357(const A&); // { dg-message "two sink_4_2357|no known conversion" } +three sink_4_2357(volatile A&); // { dg-message "note" } +five sink_4_2357( A&&); // { dg-message "note" } +seven sink_4_2357(volatile A&&); // { dg-message "note" } + +int test4_2357() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 690 } + sink_4_2357(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 692 } + return 0; +} + +two sink_4_2358(const A&); // { dg-message "note" } +three sink_4_2358(volatile A&); // { dg-message "note" } +five sink_4_2358( A&&); // { dg-message "note" } +eight sink_4_2358(const volatile A&&); // { dg-message "" } + +int test4_2358() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + return 0; +} + +two sink_4_2367(const A&); // { dg-message "two sink_4_2367|no known conversion" } +three sink_4_2367(volatile A&); // { dg-message "note" } +six sink_4_2367(const A&&); // { dg-message "note" } +seven sink_4_2367(volatile A&&); // { dg-message "note" } + +int test4_2367() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 727 } + sink_4_2367(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 729 } + sink_4_2367(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 731 } + return 0; +} + +two sink_4_2368(const A&); // { dg-message "note" } +three sink_4_2368(volatile A&); // { dg-message "note" } +six sink_4_2368(const A&&); // { dg-message "note" } +eight sink_4_2368(const volatile A&&); // { dg-message "" } + +int test4_2368() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + return 0; +} + +two sink_4_2378(const A&); // { dg-message "note" } +three sink_4_2378(volatile A&); // { dg-message "note" } +seven sink_4_2378(volatile A&&); // { dg-message "note" } +eight sink_4_2378(const volatile A&&); // { dg-message "" } + +int test4_2378() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + return 0; +} + +two sink_4_2456(const A&); // { dg-message "two sink_4_2456|no known conversion" } +four sink_4_2456(const volatile A&); // { dg-message "note" } +five sink_4_2456( A&&); // { dg-message "note" } +six sink_4_2456(const A&&); // { dg-message "note" } + +int test4_2456() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 783 } + return 0; +} + +two sink_4_2457(const A&); // { dg-message "two sink_4_2457|no known conversion" } +four sink_4_2457(const volatile A&); // { dg-message "note" } +five sink_4_2457( A&&); // { dg-message "note" } +seven sink_4_2457(volatile A&&); // { dg-message "note" } + +int test4_2457() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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; +} + +two sink_4_2467(const A&); // { dg-message "two sink_4_2467|no known conversion" } +four sink_4_2467(const volatile A&); // { dg-message "note" } +six sink_4_2467(const A&&); // { dg-message "note" } +seven sink_4_2467(volatile A&&); // { dg-message "note" } + +int test4_2467() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 817 } + return 0; +} + +two sink_4_2567(const A&); // { dg-message "two sink_4_2567|no known conversion" } +five sink_4_2567( A&&); // { dg-message "note" } +six sink_4_2567(const A&&); // { dg-message "note" } +seven sink_4_2567(volatile A&&); // { dg-message "" } + +int test4_2567() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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 } + sink_4_2567(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 836 } + return 0; +} + +two sink_4_2568(const A&); +five sink_4_2568( A&&); +six sink_4_2568(const A&&); +eight sink_4_2568(const volatile A&&); // { dg-message "" } + +int test4_2568() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_4_2568(va); // { dg-error "lvalue" } + sink_4_2568(cva); // { dg-error "lvalue" } + return 0; +} + +two sink_4_2578(const A&); +five sink_4_2578( A&&); +seven sink_4_2578(volatile A&&); // { dg-message "" } +eight sink_4_2578(const volatile A&&); // { dg-message "" } + +int test4_2578() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_4_2578(va); // { dg-error "lvalue" } + sink_4_2578(cva); // { dg-error "lvalue" } + return 0; +} + +two sink_4_2678(const A&); // { dg-message "note" } +six sink_4_2678(const A&&); // { dg-message "note" } +seven sink_4_2678(volatile A&&); // { dg-message "" } +eight sink_4_2678(const volatile A&&); // { dg-message "" } + +int test4_2678() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 886 } + return 0; +} + +three sink_4_3456(volatile A&); // { dg-message "three sink_4_3456|no known conversion" } +four sink_4_3456(const volatile A&); // { dg-message "note" } +five sink_4_3456( A&&); // { dg-message "note" } +six sink_4_3456(const A&&); // { dg-message "note" } + +int test4_3456() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 904 } + return 0; +} + +three sink_4_3457(volatile A&); // { dg-message "three sink_4_3457|no known conversion" } +four sink_4_3457(const volatile A&); // { dg-message "note" } +five sink_4_3457( A&&); // { dg-message "note" } +seven sink_4_3457(volatile A&&); // { dg-message "note" } + +int test4_3457() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 922 } + return 0; +} + +three sink_4_3467(volatile A&); // { dg-message "three sink_4_3467|no known conversion" } +four sink_4_3467(const volatile A&); // { dg-message "note" } +six sink_4_3467(const A&&); // { dg-message "note" } +seven sink_4_3467(volatile A&&); // { dg-message "note" } + +int test4_3467() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 940 } + return 0; +} + +three sink_4_3567(volatile A&); // { dg-message "three sink_4_3567|no known conversion" } +five sink_4_3567( A&&); // { dg-message "note" } +six sink_4_3567(const A&&); // { dg-message "" } +seven sink_4_3567(volatile A&&); // { dg-message "note" } + +int test4_3567() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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 } + sink_4_3567(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 959 } + return 0; +} + +three sink_4_3568(volatile A&); +five sink_4_3568( A&&); +six sink_4_3568(const A&&); // { dg-message "" } +eight sink_4_3568(const volatile A&&); // { dg-message "" } + +int test4_3568() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_4_3568(ca); // { dg-error "lvalue" } + sink_4_3568(cva); // { dg-error "lvalue" } + return 0; +} + +three sink_4_3578(volatile A&); +five sink_4_3578( A&&); +seven sink_4_3578(volatile A&&); +eight sink_4_3578(const volatile A&&); // { dg-message "" } + +int test4_3578() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_4_3578(ca); // { dg-error "lvalue" } + sink_4_3578(cva); // { dg-error "lvalue" } + return 0; +} + +three sink_4_3678(volatile A&); +six sink_4_3678(const A&&); // { dg-message "" } +seven sink_4_3678(volatile A&&); // { dg-message "note" } +eight sink_4_3678(const volatile A&&); // { dg-message "" } + +int test4_3678() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 1009 } + return 0; +} + +four sink_4_4567(const volatile A&); // { dg-message "note" } +five sink_4_4567( A&&); // { dg-message "note" } +six sink_4_4567(const A&&); // { dg-message "note" } +seven sink_4_4567(volatile A&&); // { dg-message "note" } + +int test4_4567() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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; +} + +four sink_4_4678(const volatile A&); +six sink_4_4678(const A&&); // { dg-message "note" } +seven sink_4_4678(volatile A&&); // { dg-message "note" } +eight sink_4_4678(const volatile A&&); // { dg-message "note" } + +int test4_4678() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_4_4678(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 1041 } + return 0; +} + +five sink_4_5678( A&&); // { dg-message "" } +six sink_4_5678(const A&&); // { dg-message "" } +seven sink_4_5678(volatile A&&); // { dg-message "" } +eight sink_4_5678(const volatile A&&); // { dg-message "" } + +int test4_5678() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + sink_4_5678(cva); // { dg-error "lvalue" } + return 0; +} + +int main() +{ + return test4_1235() + test4_1236() + test4_1237() + test4_1256() + test4_1257() + + test4_1267() + test4_1356() + test4_1357() + test4_1467() + test4_1567() + + test4_1678() + test4_2345() + test4_2346() + test4_2347() + test4_2348() + + test4_2356() + test4_2357() + test4_2358() + test4_2367() + test4_2368() + + test4_2378() + test4_2467() + test4_2567() + test4_2678() + test4_3467() + + test4_3567() + test4_3678() + test4_4678(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv4p.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv4p.C new file mode 100644 index 0000000..8d720c7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv4p.C @@ -0,0 +1,1448 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile { target c++11 } } +// { dg-skip-if "packed attribute missing for struct one/three/five/seven" { "epiphany-*-*" } { "*" } { "" } } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {long x[1];}; +struct two {long x[2];}; +struct three {long x[3];}; +struct four {long x[4];}; +struct five {long x[5];}; +struct six {long x[6];}; +struct seven {long x[7];}; +struct eight {long x[8];}; + +struct A +{ + A(); + A(const volatile A&&); +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 4 at a time + +one sink_4_1234( A&); +two sink_4_1234(const A&); +three sink_4_1234(volatile A&); +four sink_4_1234(const volatile A&); + +int test4_1234() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1234(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1234(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1234(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1234(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1234(source())) == 2 * sizeof(long)> t5; + sa<sizeof(sink_4_1234(c_source())) == 2 * sizeof(long)> t6; + return 0; +} + +one sink_4_1235( A&); +two sink_4_1235(const A&); +three sink_4_1235(volatile A&); +five sink_4_1235( A&&); + +int test4_1235() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1235(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1235(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1235(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1235(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_1235(c_source())) == 2 * sizeof(long)> t6; + return 0; +} + +one sink_4_1236( A&); +two sink_4_1236(const A&); +three sink_4_1236(volatile A&); +six sink_4_1236(const A&&); + +int test4_1236() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1236(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1236(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1236(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1236(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_4_1236(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +one sink_4_1237( A&); +two sink_4_1237(const A&); +three sink_4_1237(volatile A&); +seven sink_4_1237(volatile A&&); + +int test4_1237() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1237(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1237(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1237(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1237(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_4_1237(c_source())) == 2 * sizeof(long)> t6; + sa<sizeof(sink_4_1237(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_4_1238( A&); +two sink_4_1238(const A&); +three sink_4_1238(volatile A&); +eight sink_4_1238(const volatile A&&); + +int test4_1238() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1238(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1238(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1238(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1238(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_4_1238(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_1238(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_1238(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_4_1245( A&); +two sink_4_1245(const A&); +four sink_4_1245(const volatile A&); +five sink_4_1245( A&&); + +int test4_1245() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1245(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1245(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1245(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_1245(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1245(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_1245(c_source())) == 2 * sizeof(long)> t6; + return 0; +} + +one sink_4_1246( A&); +two sink_4_1246(const A&); +four sink_4_1246(const volatile A&); +six sink_4_1246(const A&&); + +int test4_1246() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1246(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1246(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1246(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_1246(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1246(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_4_1246(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +one sink_4_1247( A&); +two sink_4_1247(const A&); +four sink_4_1247(const volatile A&); +seven sink_4_1247(volatile A&&); + +int test4_1247() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1247(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1247(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1247(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_1247(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1247(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_4_1247(c_source())) == 2 * sizeof(long)> t6; + sa<sizeof(sink_4_1247(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_4_1248( A&); +two sink_4_1248(const A&); +four sink_4_1248(const volatile A&); +eight sink_4_1248(const volatile A&&); + +int test4_1248() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1248(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1248(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1248(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_1248(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1248(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_4_1248(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_1248(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_1248(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_4_1256( A&); +two sink_4_1256(const A&); +five sink_4_1256( A&&); +six sink_4_1256(const A&&); + +int test4_1256() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1256(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1256(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1256(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_1256(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +one sink_4_1257( A&); +two sink_4_1257(const A&); +five sink_4_1257( A&&); +seven sink_4_1257(volatile A&&); + +int test4_1257() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1257(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1257(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1257(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_1257(c_source())) == 2 * sizeof(long)> t6; + sa<sizeof(sink_4_1257(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_4_1258( A&); +two sink_4_1258(const A&); +five sink_4_1258( A&&); +eight sink_4_1258(const volatile A&&); + +int test4_1258() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1258(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1258(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1258(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_1258(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_1258(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_1258(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_4_1267( A&); +two sink_4_1267(const A&); +six sink_4_1267(const A&&); +seven sink_4_1267(volatile A&&); + +int test4_1267() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1267(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1267(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1267(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_1267(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_4_1268( A&); +two sink_4_1268(const A&); +six sink_4_1268(const A&&); +eight sink_4_1268(const volatile A&&); + +int test4_1268() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1268(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1268(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1268(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_4_1268(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_1268(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_1268(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_4_1278( A&); +two sink_4_1278(const A&); +seven sink_4_1278(volatile A&&); +eight sink_4_1278(const volatile A&&); + +int test4_1278() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1278(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1278(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1278(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_4_1278(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_1278(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_1278(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_4_1345( A&); +three sink_4_1345(volatile A&); +four sink_4_1345(const volatile A&); +five sink_4_1345( A&&); + +int test4_1345() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1345(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1345(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_1345(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1345(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1345(source())) == 5 * sizeof(long)> t5; + return 0; +} + +one sink_4_1346( A&); +three sink_4_1346(volatile A&); +four sink_4_1346(const volatile A&); +six sink_4_1346(const A&&); + +int test4_1346() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1346(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1346(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_1346(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1346(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1346(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_4_1346(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +one sink_4_1347( A&); +three sink_4_1347(volatile A&); +four sink_4_1347(const volatile A&); +seven sink_4_1347(volatile A&&); + +int test4_1347() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1347(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1347(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_1347(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1347(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1347(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_4_1347(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_4_1348( A&); +three sink_4_1348(volatile A&); +four sink_4_1348(const volatile A&); +eight sink_4_1348(const volatile A&&); + +int test4_1348() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1348(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1348(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_1348(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1348(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1348(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_4_1348(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_1348(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_1348(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_4_1356( A&); +three sink_4_1356(volatile A&); +five sink_4_1356( A&&); +six sink_4_1356(const A&&); + +int test4_1356() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1356(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1356(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1356(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_1356(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +one sink_4_1357( A&); +three sink_4_1357(volatile A&); +five sink_4_1357( A&&); +seven sink_4_1357(volatile A&&); + +int test4_1357() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1357(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1357(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1357(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_1357(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_4_1358( A&); +three sink_4_1358(volatile A&); +five sink_4_1358( A&&); +eight sink_4_1358(const volatile A&&); + +int test4_1358() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1358(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1358(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1358(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_1358(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_1358(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_1358(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_4_1367( A&); +three sink_4_1367(volatile A&); +six sink_4_1367(const A&&); +seven sink_4_1367(volatile A&&); + +int test4_1367() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1367(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1367(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1367(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_1367(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_4_1368( A&); +three sink_4_1368(volatile A&); +six sink_4_1368(const A&&); +eight sink_4_1368(const volatile A&&); + +int test4_1368() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1368(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1368(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1368(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_4_1368(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_1368(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_1368(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_4_1378( A&); +three sink_4_1378(volatile A&); +seven sink_4_1378(volatile A&&); +eight sink_4_1378(const volatile A&&); + +int test4_1378() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1378(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1378(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1378(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_4_1378(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_1378(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_1378(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_4_1456( A&); +four sink_4_1456(const volatile A&); +five sink_4_1456( A&&); +six sink_4_1456(const A&&); + +int test4_1456() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1456(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1456(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_1456(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_1456(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1456(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_1456(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +one sink_4_1457( A&); +four sink_4_1457(const volatile A&); +five sink_4_1457( A&&); +seven sink_4_1457(volatile A&&); + +int test4_1457() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1457(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1457(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_1457(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_1457(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1457(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_1457(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_4_1458( A&); +four sink_4_1458(const volatile A&); +five sink_4_1458( A&&); +eight sink_4_1458(const volatile A&&); + +int test4_1458() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1458(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1458(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_1458(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_1458(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1458(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_1458(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_1458(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_1458(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_4_1467( A&); +four sink_4_1467(const volatile A&); +six sink_4_1467(const A&&); +seven sink_4_1467(volatile A&&); + +int test4_1467() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1467(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1467(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_1467(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_1467(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1467(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_1467(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_4_1468( A&); +four sink_4_1468(const volatile A&); +six sink_4_1468(const A&&); +eight sink_4_1468(const volatile A&&); + +int test4_1468() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1468(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1468(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_1468(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_1468(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1468(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_4_1468(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_1468(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_1468(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_4_1478( A&); +four sink_4_1478(const volatile A&); +seven sink_4_1478(volatile A&&); +eight sink_4_1478(const volatile A&&); + +int test4_1478() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1478(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1478(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_1478(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_1478(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1478(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_4_1478(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_1478(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_1478(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_4_1567( A&); +five sink_4_1567( A&&); +six sink_4_1567(const A&&); +seven sink_4_1567(volatile A&&); + +int test4_1567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1567(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1567(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_1567(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_1567(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_4_1568( A&); +five sink_4_1568( A&&); +six sink_4_1568(const A&&); +eight sink_4_1568(const volatile A&&); + +int test4_1568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1568(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1568(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_1568(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_1568(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_1568(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_4_1578( A&); +five sink_4_1578( A&&); +seven sink_4_1578(volatile A&&); +eight sink_4_1578(const volatile A&&); + +int test4_1578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1578(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1578(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_1578(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_1578(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_1578(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_4_1678( A&); +six sink_4_1678(const A&&); +seven sink_4_1678(volatile A&&); +eight sink_4_1678(const volatile A&&); + +int test4_1678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1678(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_1678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_1678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_4_2345(const A&); +three sink_4_2345(volatile A&); +four sink_4_2345(const volatile A&); +five sink_4_2345( A&&); + +int test4_2345() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2345(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2345(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_2345(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_2345(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_2345(c_source())) == 2 * sizeof(long)> t6; + return 0; +} + +two sink_4_2346(const A&); +three sink_4_2346(volatile A&); +four sink_4_2346(const volatile A&); +six sink_4_2346(const A&&); + +int test4_2346() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2346(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2346(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_2346(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_2346(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_4_2346(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +two sink_4_2347(const A&); +three sink_4_2347(volatile A&); +four sink_4_2347(const volatile A&); +seven sink_4_2347(volatile A&&); + +int test4_2347() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2347(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2347(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_2347(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_2347(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_4_2347(c_source())) == 2 * sizeof(long)> t6; + sa<sizeof(sink_4_2347(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +two sink_4_2348(const A&); +three sink_4_2348(volatile A&); +four sink_4_2348(const volatile A&); +eight sink_4_2348(const volatile A&&); + +int test4_2348() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2348(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2348(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_2348(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_2348(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_4_2348(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_2348(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_2348(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_4_2356(const A&); +three sink_4_2356(volatile A&); +five sink_4_2356( A&&); +six sink_4_2356(const A&&); + +int test4_2356() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2356(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2356(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_2356(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_2356(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +two sink_4_2357(const A&); +three sink_4_2357(volatile A&); +five sink_4_2357( A&&); +seven sink_4_2357(volatile A&&); + +int test4_2357() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2357(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2357(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_2357(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_2357(c_source())) == 2 * sizeof(long)> t6; + sa<sizeof(sink_4_2357(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +two sink_4_2358(const A&); +three sink_4_2358(volatile A&); +five sink_4_2358( A&&); +eight sink_4_2358(const volatile A&&); + +int test4_2358() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2358(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2358(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_2358(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_2358(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_2358(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_2358(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_4_2367(const A&); +three sink_4_2367(volatile A&); +six sink_4_2367(const A&&); +seven sink_4_2367(volatile A&&); + +int test4_2367() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2367(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2367(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_2367(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_2367(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +two sink_4_2368(const A&); +three sink_4_2368(volatile A&); +six sink_4_2368(const A&&); +eight sink_4_2368(const volatile A&&); + +int test4_2368() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2368(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2368(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_2368(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_4_2368(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_2368(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_2368(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_4_2378(const A&); +three sink_4_2378(volatile A&); +seven sink_4_2378(volatile A&&); +eight sink_4_2378(const volatile A&&); + +int test4_2378() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2378(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2378(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_2378(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_4_2378(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_2378(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_2378(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_4_2456(const A&); +four sink_4_2456(const volatile A&); +five sink_4_2456( A&&); +six sink_4_2456(const A&&); + +int test4_2456() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2456(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_4_2456(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2456(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_2456(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_2456(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_2456(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +two sink_4_2457(const A&); +four sink_4_2457(const volatile A&); +five sink_4_2457( A&&); +seven sink_4_2457(volatile A&&); + +int test4_2457() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2457(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_4_2457(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2457(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_2457(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_2457(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_2457(c_source())) == 2 * sizeof(long)> t6; + sa<sizeof(sink_4_2457(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +two sink_4_2458(const A&); +four sink_4_2458(const volatile A&); +five sink_4_2458( A&&); +eight sink_4_2458(const volatile A&&); + +int test4_2458() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2458(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_4_2458(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2458(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_2458(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_2458(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_2458(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_2458(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_2458(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_4_2467(const A&); +four sink_4_2467(const volatile A&); +six sink_4_2467(const A&&); +seven sink_4_2467(volatile A&&); + +int test4_2467() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2467(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_4_2467(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2467(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_2467(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_2467(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_2467(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +two sink_4_2468(const A&); +four sink_4_2468(const volatile A&); +six sink_4_2468(const A&&); +eight sink_4_2468(const volatile A&&); + +int test4_2468() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2468(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_4_2468(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2468(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_2468(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_2468(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_4_2468(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_2468(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_2468(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_4_2478(const A&); +four sink_4_2478(const volatile A&); +seven sink_4_2478(volatile A&&); +eight sink_4_2478(const volatile A&&); + +int test4_2478() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2478(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_4_2478(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2478(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_2478(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_2478(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_4_2478(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_2478(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_2478(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_4_2567(const A&); +five sink_4_2567( A&&); +six sink_4_2567(const A&&); +seven sink_4_2567(volatile A&&); + +int test4_2567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2567(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_4_2567(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2567(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_2567(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_2567(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +two sink_4_2568(const A&); +five sink_4_2568( A&&); +six sink_4_2568(const A&&); +eight sink_4_2568(const volatile A&&); + +int test4_2568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2568(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_4_2568(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2568(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_2568(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_2568(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_2568(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_4_2578(const A&); +five sink_4_2578( A&&); +seven sink_4_2578(volatile A&&); +eight sink_4_2578(const volatile A&&); + +int test4_2578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2578(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_4_2578(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2578(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_2578(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_2578(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_2578(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_4_2678(const A&); +six sink_4_2678(const A&&); +seven sink_4_2678(volatile A&&); +eight sink_4_2678(const volatile A&&); + +int test4_2678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2678(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_4_2678(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_2678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_2678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +three sink_4_3456(volatile A&); +four sink_4_3456(const volatile A&); +five sink_4_3456( A&&); +six sink_4_3456(const A&&); + +int test4_3456() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_3456(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_4_3456(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_3456(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_3456(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_3456(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_3456(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +three sink_4_3457(volatile A&); +four sink_4_3457(const volatile A&); +five sink_4_3457( A&&); +seven sink_4_3457(volatile A&&); + +int test4_3457() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_3457(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_4_3457(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_3457(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_3457(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_3457(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_3457(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +three sink_4_3458(volatile A&); +four sink_4_3458(const volatile A&); +five sink_4_3458( A&&); +eight sink_4_3458(const volatile A&&); + +int test4_3458() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_3458(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_4_3458(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_3458(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_3458(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_3458(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_3458(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_3458(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_3458(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +three sink_4_3467(volatile A&); +four sink_4_3467(const volatile A&); +six sink_4_3467(const A&&); +seven sink_4_3467(volatile A&&); + +int test4_3467() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_3467(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_4_3467(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_3467(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_3467(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_3467(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_3467(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +three sink_4_3468(volatile A&); +four sink_4_3468(const volatile A&); +six sink_4_3468(const A&&); +eight sink_4_3468(const volatile A&&); + +int test4_3468() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_3468(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_4_3468(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_3468(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_3468(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_3468(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_4_3468(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_3468(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_3468(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +three sink_4_3478(volatile A&); +four sink_4_3478(const volatile A&); +seven sink_4_3478(volatile A&&); +eight sink_4_3478(const volatile A&&); + +int test4_3478() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_3478(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_4_3478(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_3478(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_3478(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_3478(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_4_3478(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_3478(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_3478(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +three sink_4_3567(volatile A&); +five sink_4_3567( A&&); +six sink_4_3567(const A&&); +seven sink_4_3567(volatile A&&); + +int test4_3567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_3567(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_4_3567(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_3567(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_3567(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_3567(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +three sink_4_3568(volatile A&); +five sink_4_3568( A&&); +six sink_4_3568(const A&&); +eight sink_4_3568(const volatile A&&); + +int test4_3568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_3568(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_4_3568(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_3568(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_3568(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_3568(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_3568(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +three sink_4_3578(volatile A&); +five sink_4_3578( A&&); +seven sink_4_3578(volatile A&&); +eight sink_4_3578(const volatile A&&); + +int test4_3578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_3578(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_4_3578(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_3578(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_3578(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_3578(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_3578(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +three sink_4_3678(volatile A&); +six sink_4_3678(const A&&); +seven sink_4_3678(volatile A&&); +eight sink_4_3678(const volatile A&&); + +int test4_3678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_3678(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_4_3678(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_3678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_3678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_3678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +four sink_4_4567(const volatile A&); +five sink_4_4567( A&&); +six sink_4_4567(const A&&); +seven sink_4_4567(volatile A&&); + +int test4_4567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_4567(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_4_4567(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_4567(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_4567(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_4567(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_4567(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_4567(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +four sink_4_4568(const volatile A&); +five sink_4_4568( A&&); +six sink_4_4568(const A&&); +eight sink_4_4568(const volatile A&&); + +int test4_4568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_4568(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_4_4568(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_4568(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_4568(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_4568(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_4568(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_4568(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_4568(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +four sink_4_4578(const volatile A&); +five sink_4_4578( A&&); +seven sink_4_4578(volatile A&&); +eight sink_4_4578(const volatile A&&); + +int test4_4578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_4578(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_4_4578(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_4578(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_4578(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_4578(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_4578(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_4578(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_4578(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +four sink_4_4678(const volatile A&); +six sink_4_4678(const A&&); +seven sink_4_4678(volatile A&&); +eight sink_4_4678(const volatile A&&); + +int test4_4678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_4678(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_4_4678(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_4678(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_4678(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_4678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_4678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_4678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +five sink_4_5678( A&&); +six sink_4_5678(const A&&); +seven sink_4_5678(volatile A&&); +eight sink_4_5678(const volatile A&&); + +int test4_5678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_5678(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_5678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_5678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_5678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +int main() +{ + return test4_1234() + test4_1235() + test4_1236() + test4_1237() + test4_1238() + + test4_1245() + test4_1246() + test4_1247() + test4_1248() + test4_1256() + + test4_1257() + test4_1258() + test4_1267() + test4_1268() + test4_1278() + + test4_1345() + test4_1346() + test4_1347() + test4_1348() + test4_1356() + + test4_1357() + test4_1358() + test4_1367() + test4_1368() + test4_1378() + + test4_1456() + test4_1457() + test4_1458() + test4_1467() + test4_1468() + + test4_1478() + test4_1567() + test4_1568() + test4_1578() + test4_1678() + + test4_2345() + test4_2346() + test4_2347() + test4_2348() + test4_2356() + + test4_2357() + test4_2358() + test4_2367() + test4_2368() + test4_2378() + + test4_2456() + test4_2457() + test4_2458() + test4_2467() + test4_2468() + + test4_2478() + test4_2567() + test4_2568() + test4_2578() + test4_2678() + + test4_3456() + test4_3457() + test4_3458() + test4_3467() + test4_3468() + + test4_3478() + test4_3567() + test4_3568() + test4_3578() + test4_3678() + + test4_4567() + test4_4568() + test4_4578() + test4_4678() + test4_5678(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv5n.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv5n.C new file mode 100644 index 0000000..ca179cd --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv5n.C @@ -0,0 +1,806 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile { target c++11 } } +// { dg-options "" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {char x[1];}; +struct two {char x[2];}; +struct three {char x[3];}; +struct four {char x[4];}; +struct five {char x[5];}; +struct six {char x[6];}; +struct seven {char x[7];}; +struct eight {char x[8];}; + +struct A +{ + A(); + A(const volatile A&&); +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 5 at a time + +one sink_5_12345( A&); // { dg-message "one sink_5_12345|no known conversion" } +two sink_5_12345(const A&); // { dg-message "note" } +three sink_5_12345(volatile A&); // { dg-message "note" } +four sink_5_12345(const volatile A&); // { dg-message "note" } +five sink_5_12345( A&&); // { dg-message "note" } + +int test5_12345() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 47 } + return 0; +} + +one sink_5_12346( A&); // { dg-message "one sink_5_12346|no known conversion" } +two sink_5_12346(const A&); // { dg-message "note" } +three sink_5_12346(volatile A&); // { dg-message "note" } +four sink_5_12346(const volatile A&); // { dg-message "note" } +six sink_5_12346(const A&&); // { dg-message "note" } + +int test5_12346() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 66 } + return 0; +} + +one sink_5_12347( A&); // { dg-message "one sink_5_12347|no known conversion" } +two sink_5_12347(const A&); // { dg-message "note" } +three sink_5_12347(volatile A&); // { dg-message "note" } +four sink_5_12347(const volatile A&); // { dg-message "note" } +seven sink_5_12347(volatile A&&); // { dg-message "note" } + +int test5_12347() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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; +} + +one sink_5_12356( A&); // { dg-message "one sink_5_12356|no known conversion" } +two sink_5_12356(const A&); // { dg-message "note" } +three sink_5_12356(volatile A&); // { dg-message "note" } +five sink_5_12356( A&&); // { dg-message "note" } +six sink_5_12356(const A&&); // { dg-message "note" } + +int test5_12356() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 102 } + sink_5_12356(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 104 } + return 0; +} + +one sink_5_12357( A&); // { dg-message "one sink_5_12357|no known conversion" } +two sink_5_12357(const A&); // { dg-message "note" } +three sink_5_12357(volatile A&); // { dg-message "note" } +five sink_5_12357( A&&); // { dg-message "note" } +seven sink_5_12357(volatile A&&); // { dg-message "note" } + +int test5_12357() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 123 } + return 0; +} + +one sink_5_12358( A&); +two sink_5_12358(const A&); +three sink_5_12358(volatile A&); +five sink_5_12358( A&&); +eight sink_5_12358(const volatile A&&); // { dg-message "" } + +int test5_12358() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_5_12358(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_5_12367( A&); // { dg-message "one sink_5_12367|no known conversion" } +two sink_5_12367(const A&); // { dg-message "note" } +three sink_5_12367(volatile A&); // { dg-message "note" } +six sink_5_12367(const A&&); // { dg-message "note" } +seven sink_5_12367(volatile A&&); // { dg-message "note" } + +int test5_12367() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 158 } + sink_5_12367(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 160 } + return 0; +} + +one sink_5_12368( A&); +two sink_5_12368(const A&); +three sink_5_12368(volatile A&); +six sink_5_12368(const A&&); +eight sink_5_12368(const volatile A&&); // { dg-message "" } + +int test5_12368() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_5_12368(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_5_12378( A&); +two sink_5_12378(const A&); +three sink_5_12378(volatile A&); +seven sink_5_12378(volatile A&&); +eight sink_5_12378(const volatile A&&); // { dg-message "" } + +int test5_12378() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_5_12378(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_5_12456( A&); // { dg-message "one sink_5_12456|no known conversion" } +two sink_5_12456(const A&); // { dg-message "note" } +four sink_5_12456(const volatile A&); // { dg-message "note" } +five sink_5_12456( A&&); // { dg-message "note" } +six sink_5_12456(const A&&); // { dg-message "note" } + +int test5_12456() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 211 } + return 0; +} + +one sink_5_12457( A&); // { dg-message "one sink_5_12457|no known conversion" } +two sink_5_12457(const A&); // { dg-message "note" } +four sink_5_12457(const volatile A&); // { dg-message "note" } +five sink_5_12457( A&&); // { dg-message "note" } +seven sink_5_12457(volatile A&&); // { dg-message "note" } + +int test5_12457() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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; +} + +one sink_5_12467( A&); // { dg-message "one sink_5_12467|no known conversion" } +two sink_5_12467(const A&); // { dg-message "note" } +four sink_5_12467(const volatile A&); // { dg-message "note" } +six sink_5_12467(const A&&); // { dg-message "note" } +seven sink_5_12467(volatile A&&); // { dg-message "note" } + +int test5_12467() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 247 } + return 0; +} + +one sink_5_12567( A&); // { dg-message "one sink_5_12567|no known conversion" } +two sink_5_12567(const A&); // { dg-message "note" } +five sink_5_12567( A&&); // { dg-message "note" } +six sink_5_12567(const A&&); // { dg-message "note" } +seven sink_5_12567(volatile A&&); // { dg-message "" } + +int test5_12567() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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 } + sink_5_12567(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 267 } + return 0; +} + +one sink_5_12568( A&); +two sink_5_12568(const A&); +five sink_5_12568( A&&); +six sink_5_12568(const A&&); +eight sink_5_12568(const volatile A&&); // { dg-message "" } + +int test5_12568() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_5_12568(va); // { dg-error "lvalue" } + sink_5_12568(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_5_12578( A&); +two sink_5_12578(const A&); +five sink_5_12578( A&&); +seven sink_5_12578(volatile A&&); // { dg-message "" } +eight sink_5_12578(const volatile A&&); // { dg-message "" } + +int test5_12578() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_5_12578(va); // { dg-error "lvalue" } + sink_5_12578(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_5_12678( A&); +two sink_5_12678(const A&); // { dg-message "note" } +six sink_5_12678(const A&&); // { dg-message "note" } +seven sink_5_12678(volatile A&&); // { dg-message "" } +eight sink_5_12678(const volatile A&&); // { dg-message "" } + +int test5_12678() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 320 } + return 0; +} + +one sink_5_13456( A&); // { dg-message "one sink_5_13456|no known conversion" } +three sink_5_13456(volatile A&); // { dg-message "note" } +four sink_5_13456(const volatile A&); // { dg-message "note" } +five sink_5_13456( A&&); // { dg-message "note" } +six sink_5_13456(const A&&); // { dg-message "note" } + +int test5_13456() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 339 } + return 0; +} + +one sink_5_13457( A&); // { dg-message "one sink_5_13457|no known conversion" } +three sink_5_13457(volatile A&); // { dg-message "note" } +four sink_5_13457(const volatile A&); // { dg-message "note" } +five sink_5_13457( A&&); // { dg-message "note" } +seven sink_5_13457(volatile A&&); // { dg-message "note" } + +int test5_13457() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 358 } + return 0; +} + +one sink_5_13467( A&); // { dg-message "one sink_5_13467|no known conversion" } +three sink_5_13467(volatile A&); // { dg-message "note" } +four sink_5_13467(const volatile A&); // { dg-message "note" } +six sink_5_13467(const A&&); // { dg-message "note" } +seven sink_5_13467(volatile A&&); // { dg-message "note" } + +int test5_13467() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 377 } + return 0; +} + +one sink_5_13567( A&); // { dg-message "one sink_5_13567|no known conversion" } +three sink_5_13567(volatile A&); // { dg-message "note" } +five sink_5_13567( A&&); // { dg-message "note" } +six sink_5_13567(const A&&); // { dg-message "" } +seven sink_5_13567(volatile A&&); // { dg-message "note" } + +int test5_13567() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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 } + sink_5_13567(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 397 } + return 0; +} + +one sink_5_13568( A&); +three sink_5_13568(volatile A&); +five sink_5_13568( A&&); +six sink_5_13568(const A&&); // { dg-message "" } +eight sink_5_13568(const volatile A&&); // { dg-message "" } + +int test5_13568() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_5_13568(ca); // { dg-error "lvalue" } + sink_5_13568(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_5_13578( A&); +three sink_5_13578(volatile A&); +five sink_5_13578( A&&); +seven sink_5_13578(volatile A&&); +eight sink_5_13578(const volatile A&&); // { dg-message "" } + +int test5_13578() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_5_13578(ca); // { dg-error "lvalue" } + sink_5_13578(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_5_13678( A&); +three sink_5_13678(volatile A&); +six sink_5_13678(const A&&); // { dg-message "" } +seven sink_5_13678(volatile A&&); // { dg-message "note" } +eight sink_5_13678(const volatile A&&); // { dg-message "" } + +int test5_13678() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 450 } + return 0; +} + +one sink_5_14567( A&); // { dg-message "one sink_5_14567|no known conversion" } +four sink_5_14567(const volatile A&); // { dg-message "note" } +five sink_5_14567( A&&); // { dg-message "note" } +six sink_5_14567(const A&&); // { dg-message "note" } +seven sink_5_14567(volatile A&&); // { dg-message "note" } + +int test5_14567() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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; +} + +one sink_5_14678( A&); +four sink_5_14678(const volatile A&); +six sink_5_14678(const A&&); // { dg-message "note" } +seven sink_5_14678(volatile A&&); // { dg-message "note" } +eight sink_5_14678(const volatile A&&); // { dg-message "note" } + +int test5_14678() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_5_14678(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 484 } + return 0; +} + +one sink_5_15678( A&); +five sink_5_15678( A&&); +six sink_5_15678(const A&&); // { dg-message "" } +seven sink_5_15678(volatile A&&); // { dg-message "" } +eight sink_5_15678(const volatile A&&); // { dg-message "" } + +int test5_15678() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + return 0; +} + +two sink_5_23456(const A&); // { dg-message "two sink_5_23456|no known conversion" } +three sink_5_23456(volatile A&); // { dg-message "note" } +four sink_5_23456(const volatile A&); // { dg-message "note" } +five sink_5_23456( A&&); // { dg-message "note" } +six sink_5_23456(const A&&); // { dg-message "note" } + +int test5_23456() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 521 } + sink_5_23456(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 523 } + return 0; +} + +two sink_5_23457(const A&); // { dg-message "two sink_5_23457|no known conversion" } +three sink_5_23457(volatile A&); // { dg-message "note" } +four sink_5_23457(const volatile A&); // { dg-message "note" } +five sink_5_23457( A&&); // { dg-message "note" } +seven sink_5_23457(volatile A&&); // { dg-message "note" } + +int test5_23457() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 542 } + return 0; +} + +two sink_5_23458(const A&); // { dg-message "note" } +three sink_5_23458(volatile A&); // { dg-message "note" } +four sink_5_23458(const volatile A&); // { dg-message "note" } +five sink_5_23458( A&&); // { dg-message "note" } +eight sink_5_23458(const volatile A&&); // { dg-message "note" } + +int test5_23458() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_5_23458(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 559 } + return 0; +} + +two sink_5_23467(const A&); // { dg-message "two sink_5_23467|no known conversion" } +three sink_5_23467(volatile A&); // { dg-message "note" } +four sink_5_23467(const volatile A&); // { dg-message "note" } +six sink_5_23467(const A&&); // { dg-message "note" } +seven sink_5_23467(volatile A&&); // { dg-message "note" } + +int test5_23467() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 578 } + sink_5_23467(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 580 } + return 0; +} + +two sink_5_23468(const A&); // { dg-message "note" } +three sink_5_23468(volatile A&); // { dg-message "note" } +four sink_5_23468(const volatile A&); // { dg-message "note" } +six sink_5_23468(const A&&); // { dg-message "note" } +eight sink_5_23468(const volatile A&&); // { dg-message "note" } + +int test5_23468() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_5_23468(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 597 } + return 0; +} + +two sink_5_23478(const A&); // { dg-message "note" } +three sink_5_23478(volatile A&); // { dg-message "note" } +four sink_5_23478(const volatile A&); // { dg-message "note" } +seven sink_5_23478(volatile A&&); // { dg-message "note" } +eight sink_5_23478(const volatile A&&); // { dg-message "note" } + +int test5_23478() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_5_23478(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 614 } + return 0; +} + +two sink_5_23567(const A&); // { dg-message "two sink_5_23567|no known conversion" } +three sink_5_23567(volatile A&); // { dg-message "note" } +five sink_5_23567( A&&); // { dg-message "note" } +six sink_5_23567(const A&&); // { dg-message "note" } +seven sink_5_23567(volatile A&&); // { dg-message "note" } + +int test5_23567() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 633 } + sink_5_23567(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 635 } + return 0; +} + +two sink_5_23568(const A&); // { dg-message "note" } +three sink_5_23568(volatile A&); // { dg-message "note" } +five sink_5_23568( A&&); // { dg-message "note" } +six sink_5_23568(const A&&); // { dg-message "note" } +eight sink_5_23568(const volatile A&&); // { dg-message "" } + +int test5_23568() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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 } + return 0; +} + +two sink_5_23578(const A&); // { dg-message "note" } +three sink_5_23578(volatile A&); // { dg-message "note" } +five sink_5_23578( A&&); // { dg-message "note" } +seven sink_5_23578(volatile A&&); // { dg-message "note" } +eight sink_5_23578(const volatile A&&); // { dg-message "" } + +int test5_23578() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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 } + return 0; +} + +two sink_5_23678(const A&); // { dg-message "note" } +three sink_5_23678(volatile A&); // { dg-message "note" } +six sink_5_23678(const A&&); // { dg-message "note" } +seven sink_5_23678(volatile A&&); // { dg-message "note" } +eight sink_5_23678(const volatile A&&); // { dg-message "" } + +int test5_23678() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + sink_5_23678(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 691 } + return 0; +} + +two sink_5_24567(const A&); // { dg-message "two sink_5_24567|no known conversion" } +four sink_5_24567(const volatile A&); // { dg-message "note" } +five sink_5_24567( A&&); // { dg-message "note" } +six sink_5_24567(const A&&); // { dg-message "note" } +seven sink_5_24567(volatile A&&); // { dg-message "note" } + +int test5_24567() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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; +} + +two sink_5_24678(const A&); // { dg-message "note" } +four sink_5_24678(const volatile A&); +six sink_5_24678(const A&&); // { dg-message "note" } +seven sink_5_24678(volatile A&&); // { dg-message "note" } +eight sink_5_24678(const volatile A&&); // { dg-message "note" } + +int test5_24678() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_5_24678(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 725 } + return 0; +} + +two sink_5_25678(const A&); +five sink_5_25678( A&&); +six sink_5_25678(const A&&); +seven sink_5_25678(volatile A&&); // { dg-message "" } +eight sink_5_25678(const volatile A&&); // { dg-message "" } + +int test5_25678() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_5_25678(va); // { dg-error "lvalue" } + sink_5_25678(cva); // { dg-error "lvalue" } + return 0; +} + +three sink_5_34567(volatile A&); // { dg-message "three sink_5_34567|no known conversion" } +four sink_5_34567(const volatile A&); // { dg-message "note" } +five sink_5_34567( A&&); // { dg-message "note" } +six sink_5_34567(const A&&); // { dg-message "note" } +seven sink_5_34567(volatile A&&); // { dg-message "note" } + +int test5_34567() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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; +} + +three sink_5_34678(volatile A&); +four sink_5_34678(const volatile A&); +six sink_5_34678(const A&&); // { dg-message "note" } +seven sink_5_34678(volatile A&&); // { dg-message "note" } +eight sink_5_34678(const volatile A&&); // { dg-message "note" } + +int test5_34678() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_5_34678(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 776 } + return 0; +} + +three sink_5_35678(volatile A&); +five sink_5_35678( A&&); +six sink_5_35678(const A&&); // { dg-message "" } +seven sink_5_35678(volatile A&&); +eight sink_5_35678(const volatile A&&); // { dg-message "" } + +int test5_35678() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_5_35678(ca); // { dg-error "lvalue" } + sink_5_35678(cva); // { dg-error "lvalue" } + return 0; +} + +int main() +{ + return test5_12356() + test5_12357() + test5_12367() + test5_12467() + + test5_12567() + test5_12678() + test5_13467() + test5_13567() + + test5_13678() + test5_13678() + test5_23456() + test5_23457() + + test5_23458() + test5_23467() + test5_23468() + test5_23478() + + test5_23567() + test5_23568() + test5_23578() + test5_23678() + + test5_24678() + test5_34678(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv5p.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv5p.C new file mode 100644 index 0000000..7030277 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv5p.C @@ -0,0 +1,1256 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile { target c++11 } } +// { dg-skip-if "packed attribute missing for struct one/three/five/seven" { "epiphany-*-*" } { "*" } { "" } } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {long x[1];}; +struct two {long x[2];}; +struct three {long x[3];}; +struct four {long x[4];}; +struct five {long x[5];}; +struct six {long x[6];}; +struct seven {long x[7];}; +struct eight {long x[8];}; + +struct A +{ + A(); + A(const volatile A&&); +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 5 at a time + +one sink_5_12345( A&); +two sink_5_12345(const A&); +three sink_5_12345(volatile A&); +four sink_5_12345(const volatile A&); +five sink_5_12345( A&&); + +int test5_12345() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12345(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12345(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12345(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_12345(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_12345(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_12345(c_source())) == 2* sizeof(long)> t6; + return 0; +} + +one sink_5_12346( A&); +two sink_5_12346(const A&); +three sink_5_12346(volatile A&); +four sink_5_12346(const volatile A&); +six sink_5_12346(const A&&); + +int test5_12346() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12346(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12346(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12346(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_12346(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_12346(source())) == 6* sizeof(long)> t5; + sa<sizeof(sink_5_12346(c_source())) == 6* sizeof(long)> t6; + return 0; +} + +one sink_5_12347( A&); +two sink_5_12347(const A&); +three sink_5_12347(volatile A&); +four sink_5_12347(const volatile A&); +seven sink_5_12347(volatile A&&); + +int test5_12347() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12347(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12347(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12347(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_12347(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_12347(source())) == 7* sizeof(long)> t5; + sa<sizeof(sink_5_12347(c_source())) == 2* sizeof(long)> t6; + sa<sizeof(sink_5_12347(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +one sink_5_12348( A&); +two sink_5_12348(const A&); +three sink_5_12348(volatile A&); +four sink_5_12348(const volatile A&); +eight sink_5_12348(const volatile A&&); + +int test5_12348() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12348(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12348(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12348(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_12348(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_12348(source())) == 8* sizeof(long)> t5; + sa<sizeof(sink_5_12348(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_12348(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_12348(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_12356( A&); +two sink_5_12356(const A&); +three sink_5_12356(volatile A&); +five sink_5_12356( A&&); +six sink_5_12356(const A&&); + +int test5_12356() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12356(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12356(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12356(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_12356(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_12356(c_source())) == 6* sizeof(long)> t6; + return 0; +} + +one sink_5_12357( A&); +two sink_5_12357(const A&); +three sink_5_12357(volatile A&); +five sink_5_12357( A&&); +seven sink_5_12357(volatile A&&); + +int test5_12357() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12357(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12357(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12357(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_12357(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_12357(c_source())) == 2* sizeof(long)> t6; + sa<sizeof(sink_5_12357(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +one sink_5_12358( A&); +two sink_5_12358(const A&); +three sink_5_12358(volatile A&); +five sink_5_12358( A&&); +eight sink_5_12358(const volatile A&&); + +int test5_12358() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12358(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12358(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12358(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_12358(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_12358(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_12358(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_12358(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_12367( A&); +two sink_5_12367(const A&); +three sink_5_12367(volatile A&); +six sink_5_12367(const A&&); +seven sink_5_12367(volatile A&&); + +int test5_12367() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12367(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12367(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12367(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_12367(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_12367(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +one sink_5_12368( A&); +two sink_5_12368(const A&); +three sink_5_12368(volatile A&); +six sink_5_12368(const A&&); +eight sink_5_12368(const volatile A&&); + +int test5_12368() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12368(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12368(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12368(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_12368(source())) == 6* sizeof(long)> t5; + sa<sizeof(sink_5_12368(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_12368(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_12368(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_12378( A&); +two sink_5_12378(const A&); +three sink_5_12378(volatile A&); +seven sink_5_12378(volatile A&&); +eight sink_5_12378(const volatile A&&); + +int test5_12378() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12378(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12378(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12378(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_12378(source())) == 7* sizeof(long)> t5; + sa<sizeof(sink_5_12378(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_12378(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_12378(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_12456( A&); +two sink_5_12456(const A&); +four sink_5_12456(const volatile A&); +five sink_5_12456( A&&); +six sink_5_12456(const A&&); + +int test5_12456() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12456(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12456(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12456(va)) == 4* sizeof(long)> t3; + sa<sizeof(sink_5_12456(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_12456(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_12456(c_source())) == 6* sizeof(long)> t6; + return 0; +} + +one sink_5_12457( A&); +two sink_5_12457(const A&); +four sink_5_12457(const volatile A&); +five sink_5_12457( A&&); +seven sink_5_12457(volatile A&&); + +int test5_12457() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12457(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12457(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12457(va)) == 4* sizeof(long)> t3; + sa<sizeof(sink_5_12457(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_12457(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_12457(c_source())) == 2* sizeof(long)> t6; + sa<sizeof(sink_5_12457(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +one sink_5_12458( A&); +two sink_5_12458(const A&); +four sink_5_12458(const volatile A&); +five sink_5_12458( A&&); +eight sink_5_12458(const volatile A&&); + +int test5_12458() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12458(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12458(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12458(va)) == 4* sizeof(long)> t3; + sa<sizeof(sink_5_12458(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_12458(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_12458(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_12458(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_12458(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_12467( A&); +two sink_5_12467(const A&); +four sink_5_12467(const volatile A&); +six sink_5_12467(const A&&); +seven sink_5_12467(volatile A&&); + +int test5_12467() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12467(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12467(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12467(va)) == 4* sizeof(long)> t3; + sa<sizeof(sink_5_12467(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_12467(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_12467(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +one sink_5_12468( A&); +two sink_5_12468(const A&); +four sink_5_12468(const volatile A&); +six sink_5_12468(const A&&); +eight sink_5_12468(const volatile A&&); + +int test5_12468() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12468(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12468(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12468(va)) == 4* sizeof(long)> t3; + sa<sizeof(sink_5_12468(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_12468(source())) == 6* sizeof(long)> t5; + sa<sizeof(sink_5_12468(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_12468(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_12468(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_12478( A&); +two sink_5_12478(const A&); +four sink_5_12478(const volatile A&); +seven sink_5_12478(volatile A&&); +eight sink_5_12478(const volatile A&&); + +int test5_12478() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12478(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12478(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12478(va)) == 4* sizeof(long)> t3; + sa<sizeof(sink_5_12478(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_12478(source())) == 7* sizeof(long)> t5; + sa<sizeof(sink_5_12478(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_12478(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_12478(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_12567( A&); +two sink_5_12567(const A&); +five sink_5_12567( A&&); +six sink_5_12567(const A&&); +seven sink_5_12567(volatile A&&); + +int test5_12567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12567(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12567(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12567(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_12567(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_12567(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +one sink_5_12568( A&); +two sink_5_12568(const A&); +five sink_5_12568( A&&); +six sink_5_12568(const A&&); +eight sink_5_12568(const volatile A&&); + +int test5_12568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12568(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12568(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12568(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_12568(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_12568(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_12568(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_12578( A&); +two sink_5_12578(const A&); +five sink_5_12578( A&&); +seven sink_5_12578(volatile A&&); +eight sink_5_12578(const volatile A&&); + +int test5_12578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12578(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12578(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12578(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_12578(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_12578(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_12578(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_12678( A&); +two sink_5_12678(const A&); +six sink_5_12678(const A&&); +seven sink_5_12678(volatile A&&); +eight sink_5_12678(const volatile A&&); + +int test5_12678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12678(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12678(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12678(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_12678(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_12678(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_13456( A&); +three sink_5_13456(volatile A&); +four sink_5_13456(const volatile A&); +five sink_5_13456( A&&); +six sink_5_13456(const A&&); + +int test5_13456() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_13456(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_13456(ca)) == 4* sizeof(long)> t2; + sa<sizeof(sink_5_13456(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_13456(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_13456(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_13456(c_source())) == 6* sizeof(long)> t6; + return 0; +} + +one sink_5_13457( A&); +three sink_5_13457(volatile A&); +four sink_5_13457(const volatile A&); +five sink_5_13457( A&&); +seven sink_5_13457(volatile A&&); + +int test5_13457() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_13457(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_13457(ca)) == 4* sizeof(long)> t2; + sa<sizeof(sink_5_13457(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_13457(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_13457(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_13457(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +one sink_5_13458( A&); +three sink_5_13458(volatile A&); +four sink_5_13458(const volatile A&); +five sink_5_13458( A&&); +eight sink_5_13458(const volatile A&&); + +int test5_13458() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_13458(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_13458(ca)) == 4* sizeof(long)> t2; + sa<sizeof(sink_5_13458(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_13458(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_13458(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_13458(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_13458(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_13458(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_13467( A&); +three sink_5_13467(volatile A&); +four sink_5_13467(const volatile A&); +six sink_5_13467(const A&&); +seven sink_5_13467(volatile A&&); + +int test5_13467() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_13467(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_13467(ca)) == 4* sizeof(long)> t2; + sa<sizeof(sink_5_13467(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_13467(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_13467(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_13467(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +one sink_5_13468( A&); +three sink_5_13468(volatile A&); +four sink_5_13468(const volatile A&); +six sink_5_13468(const A&&); +eight sink_5_13468(const volatile A&&); + +int test5_13468() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_13468(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_13468(ca)) == 4* sizeof(long)> t2; + sa<sizeof(sink_5_13468(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_13468(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_13468(source())) == 6* sizeof(long)> t5; + sa<sizeof(sink_5_13468(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_13468(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_13468(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_13478( A&); +three sink_5_13478(volatile A&); +four sink_5_13478(const volatile A&); +seven sink_5_13478(volatile A&&); +eight sink_5_13478(const volatile A&&); + +int test5_13478() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_13478(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_13478(ca)) == 4* sizeof(long)> t2; + sa<sizeof(sink_5_13478(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_13478(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_13478(source())) == 7* sizeof(long)> t5; + sa<sizeof(sink_5_13478(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_13478(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_13478(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_13567( A&); +three sink_5_13567(volatile A&); +five sink_5_13567( A&&); +six sink_5_13567(const A&&); +seven sink_5_13567(volatile A&&); + +int test5_13567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_13567(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_13567(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_13567(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_13567(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_13567(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +one sink_5_13568( A&); +three sink_5_13568(volatile A&); +five sink_5_13568( A&&); +six sink_5_13568(const A&&); +eight sink_5_13568(const volatile A&&); + +int test5_13568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_13568(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_13568(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_13568(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_13568(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_13568(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_13568(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_13578( A&); +three sink_5_13578(volatile A&); +five sink_5_13578( A&&); +seven sink_5_13578(volatile A&&); +eight sink_5_13578(const volatile A&&); + +int test5_13578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_13578(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_13578(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_13578(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_13578(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_13578(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_13578(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_13678( A&); +three sink_5_13678(volatile A&); +six sink_5_13678(const A&&); +seven sink_5_13678(volatile A&&); +eight sink_5_13678(const volatile A&&); + +int test5_13678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_13678(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_13678(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_13678(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_13678(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_13678(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_14567( A&); +four sink_5_14567(const volatile A&); +five sink_5_14567( A&&); +six sink_5_14567(const A&&); +seven sink_5_14567(volatile A&&); + +int test5_14567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_14567(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_14567(ca)) == 4* sizeof(long)> t2; + sa<sizeof(sink_5_14567(va)) == 4* sizeof(long)> t3; + sa<sizeof(sink_5_14567(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_14567(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_14567(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_14567(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +one sink_5_14568( A&); +four sink_5_14568(const volatile A&); +five sink_5_14568( A&&); +six sink_5_14568(const A&&); +eight sink_5_14568(const volatile A&&); + +int test5_14568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_14568(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_14568(ca)) == 4* sizeof(long)> t2; + sa<sizeof(sink_5_14568(va)) == 4* sizeof(long)> t3; + sa<sizeof(sink_5_14568(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_14568(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_14568(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_14568(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_14568(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_14578( A&); +four sink_5_14578(const volatile A&); +five sink_5_14578( A&&); +seven sink_5_14578(volatile A&&); +eight sink_5_14578(const volatile A&&); + +int test5_14578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_14578(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_14578(ca)) == 4* sizeof(long)> t2; + sa<sizeof(sink_5_14578(va)) == 4* sizeof(long)> t3; + sa<sizeof(sink_5_14578(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_14578(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_14578(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_14578(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_14578(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_14678( A&); +four sink_5_14678(const volatile A&); +six sink_5_14678(const A&&); +seven sink_5_14678(volatile A&&); +eight sink_5_14678(const volatile A&&); + +int test5_14678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_14678(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_14678(ca)) == 4* sizeof(long)> t2; + sa<sizeof(sink_5_14678(va)) == 4* sizeof(long)> t3; + sa<sizeof(sink_5_14678(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_14678(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_14678(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_14678(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_15678( A&); +five sink_5_15678( A&&); +six sink_5_15678(const A&&); +seven sink_5_15678(volatile A&&); +eight sink_5_15678(const volatile A&&); + +int test5_15678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_15678(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_15678(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_15678(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_15678(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_15678(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +two sink_5_23456(const A&); +three sink_5_23456(volatile A&); +four sink_5_23456(const volatile A&); +five sink_5_23456( A&&); +six sink_5_23456(const A&&); + +int test5_23456() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_23456(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_23456(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_23456(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_23456(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_23456(c_source())) == 6* sizeof(long)> t6; + return 0; +} + +two sink_5_23457(const A&); +three sink_5_23457(volatile A&); +four sink_5_23457(const volatile A&); +five sink_5_23457( A&&); +seven sink_5_23457(volatile A&&); + +int test5_23457() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_23457(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_23457(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_23457(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_23457(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_23457(c_source())) == 2* sizeof(long)> t6; + sa<sizeof(sink_5_23457(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +two sink_5_23458(const A&); +three sink_5_23458(volatile A&); +four sink_5_23458(const volatile A&); +five sink_5_23458( A&&); +eight sink_5_23458(const volatile A&&); + +int test5_23458() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_23458(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_23458(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_23458(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_23458(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_23458(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_23458(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_23458(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +two sink_5_23467(const A&); +three sink_5_23467(volatile A&); +four sink_5_23467(const volatile A&); +six sink_5_23467(const A&&); +seven sink_5_23467(volatile A&&); + +int test5_23467() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_23467(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_23467(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_23467(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_23467(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_23467(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +two sink_5_23468(const A&); +three sink_5_23468(volatile A&); +four sink_5_23468(const volatile A&); +six sink_5_23468(const A&&); +eight sink_5_23468(const volatile A&&); + +int test5_23468() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_23468(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_23468(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_23468(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_23468(source())) == 6* sizeof(long)> t5; + sa<sizeof(sink_5_23468(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_23468(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_23468(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +two sink_5_23478(const A&); +three sink_5_23478(volatile A&); +four sink_5_23478(const volatile A&); +seven sink_5_23478(volatile A&&); +eight sink_5_23478(const volatile A&&); + +int test5_23478() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_23478(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_23478(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_23478(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_23478(source())) == 7* sizeof(long)> t5; + sa<sizeof(sink_5_23478(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_23478(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_23478(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +two sink_5_23567(const A&); +three sink_5_23567(volatile A&); +five sink_5_23567( A&&); +six sink_5_23567(const A&&); +seven sink_5_23567(volatile A&&); + +int test5_23567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_23567(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_23567(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_23567(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_23567(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_23567(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +two sink_5_23568(const A&); +three sink_5_23568(volatile A&); +five sink_5_23568( A&&); +six sink_5_23568(const A&&); +eight sink_5_23568(const volatile A&&); + +int test5_23568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_23568(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_23568(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_23568(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_23568(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_23568(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_23568(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +two sink_5_23578(const A&); +three sink_5_23578(volatile A&); +five sink_5_23578( A&&); +seven sink_5_23578(volatile A&&); +eight sink_5_23578(const volatile A&&); + +int test5_23578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_23578(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_23578(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_23578(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_23578(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_23578(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_23578(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +two sink_5_23678(const A&); +three sink_5_23678(volatile A&); +six sink_5_23678(const A&&); +seven sink_5_23678(volatile A&&); +eight sink_5_23678(const volatile A&&); + +int test5_23678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_23678(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_23678(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_23678(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_23678(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_23678(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +two sink_5_24567(const A&); +four sink_5_24567(const volatile A&); +five sink_5_24567( A&&); +six sink_5_24567(const A&&); +seven sink_5_24567(volatile A&&); + +int test5_24567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_24567(a)) == 2* sizeof(long)> t1; + sa<sizeof(sink_5_24567(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_24567(va)) == 4* sizeof(long)> t3; + sa<sizeof(sink_5_24567(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_24567(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_24567(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_24567(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +two sink_5_24568(const A&); +four sink_5_24568(const volatile A&); +five sink_5_24568( A&&); +six sink_5_24568(const A&&); +eight sink_5_24568(const volatile A&&); + +int test5_24568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_24568(a)) == 2* sizeof(long)> t1; + sa<sizeof(sink_5_24568(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_24568(va)) == 4* sizeof(long)> t3; + sa<sizeof(sink_5_24568(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_24568(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_24568(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_24568(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_24568(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +two sink_5_24578(const A&); +four sink_5_24578(const volatile A&); +five sink_5_24578( A&&); +seven sink_5_24578(volatile A&&); +eight sink_5_24578(const volatile A&&); + +int test5_24578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_24578(a)) == 2* sizeof(long)> t1; + sa<sizeof(sink_5_24578(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_24578(va)) == 4* sizeof(long)> t3; + sa<sizeof(sink_5_24578(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_24578(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_24578(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_24578(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_24578(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +two sink_5_24678(const A&); +four sink_5_24678(const volatile A&); +six sink_5_24678(const A&&); +seven sink_5_24678(volatile A&&); +eight sink_5_24678(const volatile A&&); + +int test5_24678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_24678(a)) == 2* sizeof(long)> t1; + sa<sizeof(sink_5_24678(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_24678(va)) == 4* sizeof(long)> t3; + sa<sizeof(sink_5_24678(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_24678(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_24678(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_24678(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +two sink_5_25678(const A&); +five sink_5_25678( A&&); +six sink_5_25678(const A&&); +seven sink_5_25678(volatile A&&); +eight sink_5_25678(const volatile A&&); + +int test5_25678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_25678(a)) == 2* sizeof(long)> t1; + sa<sizeof(sink_5_25678(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_25678(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_25678(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_25678(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_25678(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +three sink_5_34567(volatile A&); +four sink_5_34567(const volatile A&); +five sink_5_34567( A&&); +six sink_5_34567(const A&&); +seven sink_5_34567(volatile A&&); + +int test5_34567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_34567(a)) == 3* sizeof(long)> t1; + sa<sizeof(sink_5_34567(ca)) == 4* sizeof(long)> t2; + sa<sizeof(sink_5_34567(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_34567(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_34567(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_34567(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_34567(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +three sink_5_34568(volatile A&); +four sink_5_34568(const volatile A&); +five sink_5_34568( A&&); +six sink_5_34568(const A&&); +eight sink_5_34568(const volatile A&&); + +int test5_34568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_34568(a)) == 3* sizeof(long)> t1; + sa<sizeof(sink_5_34568(ca)) == 4* sizeof(long)> t2; + sa<sizeof(sink_5_34568(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_34568(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_34568(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_34568(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_34568(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_34568(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +three sink_5_34578(volatile A&); +four sink_5_34578(const volatile A&); +five sink_5_34578( A&&); +seven sink_5_34578(volatile A&&); +eight sink_5_34578(const volatile A&&); + +int test5_34578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_34578(a)) == 3* sizeof(long)> t1; + sa<sizeof(sink_5_34578(ca)) == 4* sizeof(long)> t2; + sa<sizeof(sink_5_34578(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_34578(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_34578(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_34578(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_34578(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_34578(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +three sink_5_34678(volatile A&); +four sink_5_34678(const volatile A&); +six sink_5_34678(const A&&); +seven sink_5_34678(volatile A&&); +eight sink_5_34678(const volatile A&&); + +int test5_34678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_34678(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_5_34678(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_5_34678(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_5_34678(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_5_34678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_5_34678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_5_34678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +three sink_5_35678(volatile A&); +five sink_5_35678( A&&); +six sink_5_35678(const A&&); +seven sink_5_35678(volatile A&&); +eight sink_5_35678(const volatile A&&); + +int test5_35678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_35678(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_5_35678(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_5_35678(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_5_35678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_5_35678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_5_35678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +four sink_5_45678(const volatile A&); +five sink_5_45678( A&&); +six sink_5_45678(const A&&); +seven sink_5_45678(volatile A&&); +eight sink_5_45678(const volatile A&&); + +int test5_45678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_45678(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_5_45678(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_5_45678(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_5_45678(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_5_45678(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_5_45678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_5_45678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_5_45678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +int main() +{ + return test5_12345() + test5_12346() + test5_12347() + test5_12348() + + test5_12356() + test5_12357() + test5_12358() + test5_12367() + + test5_12368() + test5_12378() + test5_12456() + test5_12457() + + test5_12458() + test5_12467() + test5_12468() + test5_12478() + + test5_12567() + test5_12568() + test5_12578() + test5_12678() + + test5_13456() + test5_13457() + test5_13458() + test5_13467() + + test5_13468() + test5_13478() + test5_13567() + test5_13568() + + test5_13578() + test5_13678() + test5_14567() + test5_14568() + + test5_14578() + test5_14678() + test5_15678() + test5_23456() + + test5_23457() + test5_23458() + test5_23467() + test5_23468() + + test5_23478() + test5_23567() + test5_23568() + test5_23578() + + test5_23678() + test5_24567() + test5_24568() + test5_24578() + + test5_24678() + test5_25678() + test5_34567() + test5_34568() + + test5_34578() + test5_34678() + test5_35678() + test5_45678(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv6n.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv6n.C new file mode 100644 index 0000000..d00c1e2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv6n.C @@ -0,0 +1,372 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile { target c++11 } } +// { dg-options "" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {char x[1];}; +struct two {char x[2];}; +struct three {char x[3];}; +struct four {char x[4];}; +struct five {char x[5];}; +struct six {char x[6];}; +struct seven {char x[7];}; +struct eight {char x[8];}; + +struct A +{ + A(); + A(const volatile A&&); +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 6 at a time + +one sink_6_123456( A&); // { dg-message "one sink_6_123456|no known conversion" } +two sink_6_123456(const A&); // { dg-message "note" } +three sink_6_123456(volatile A&); // { dg-message "note" } +four sink_6_123456(const volatile A&); // { dg-message "note" } +five sink_6_123456( A&&); // { dg-message "note" } +six sink_6_123456(const A&&); // { dg-message "note" } + +int test6_123456() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 48 } + return 0; +} + +one sink_6_123457( A&); // { dg-message "one sink_6_123457|no known conversion" } +two sink_6_123457(const A&); // { dg-message "note" } +three sink_6_123457(volatile A&); // { dg-message "note" } +four sink_6_123457(const volatile A&); // { dg-message "note" } +five sink_6_123457( A&&); // { dg-message "note" } +seven sink_6_123457(volatile A&&); // { dg-message "note" } + +int test6_123457() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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; +} + +two sink_6_235678(const A&); // { dg-message "note" } +three sink_6_235678(volatile A&); // { dg-message "note" } +five sink_6_235678( A&&); // { dg-message "note" } +six sink_6_235678(const A&&); // { dg-message "note" } +seven sink_6_235678(volatile A&&); // { dg-message "note" } +eight sink_6_235678(const volatile A&&); // { dg-message "" } + +int test6_235678() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + return 0; +} + +two sink_6_234678(const A&); // { dg-message "note" } +three sink_6_234678(volatile A&); // { dg-message "note" } +four sink_6_234678(const volatile A&); // { dg-message "note" } +six sink_6_234678(const A&&); // { dg-message "note" } +seven sink_6_234678(volatile A&&); // { dg-message "note" } +eight sink_6_234678(const volatile A&&); // { dg-message "note" } + +int test6_234678() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 105 } + return 0; +} + +two sink_6_234578(const A&); // { dg-message "note" } +three sink_6_234578(volatile A&); // { dg-message "note" } +four sink_6_234578(const volatile A&); // { dg-message "note" } +five sink_6_234578( A&&); // { dg-message "note" } +seven sink_6_234578(volatile A&&); // { dg-message "note" } +eight sink_6_234578(const volatile A&&); // { dg-message "note" } + +int test6_234578() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_6_234578(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 123 } + return 0; +} + +two sink_6_234568(const A&); // { dg-message "note" } +three sink_6_234568(volatile A&); // { dg-message "note" } +four sink_6_234568(const volatile A&); // { dg-message "note" } +five sink_6_234568( A&&); // { dg-message "note" } +six sink_6_234568(const A&&); // { dg-message "note" } +eight sink_6_234568(const volatile A&&); // { dg-message "note" } + +int test6_234568() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_6_234568(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 141 } + return 0; +} + +two sink_6_234567(const A&); // { dg-message "two sink_6_234567|no known conversion" } +three sink_6_234567(volatile A&); // { dg-message "note" } +four sink_6_234567(const volatile A&); // { dg-message "note" } +five sink_6_234567( A&&); // { dg-message "note" } +six sink_6_234567(const A&&); // { dg-message "note" } +seven sink_6_234567(volatile A&&); // { dg-message "note" } + +int test6_234567() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 161 } + return 0; +} + +one sink_6_134678( A&); +three sink_6_134678(volatile A&); +four sink_6_134678(const volatile A&); +six sink_6_134678(const A&&); // { dg-message "note" } +seven sink_6_134678(volatile A&&); // { dg-message "note" } +eight sink_6_134678(const volatile A&&); // { dg-message "note" } + +int test6_134678() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_6_134678(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 179 } + return 0; +} + +one sink_6_124678( A&); +two sink_6_124678(const A&); // { dg-message "note" } +four sink_6_124678(const volatile A&); +six sink_6_124678(const A&&); // { dg-message "note" } +seven sink_6_124678(volatile A&&); // { dg-message "note" } +eight sink_6_124678(const volatile A&&); // { dg-message "note" } + +int test6_124678() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_6_124678(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 197 } + return 0; +} + +one sink_6_123678( A&); +two sink_6_123678(const A&); // { dg-message "note" } +three sink_6_123678(volatile A&); +six sink_6_123678(const A&&); // { dg-message "note" } +seven sink_6_123678(volatile A&&); // { dg-message "note" } +eight sink_6_123678(const volatile A&&); // { dg-message "" } + +int test6_123678() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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 } + return 0; +} + +one sink_6_123567( A&); // { dg-message "one sink_6_123567|no known conversion" } +two sink_6_123567(const A&); // { dg-message "note" } +three sink_6_123567(volatile A&); // { dg-message "note" } +five sink_6_123567( A&&); // { dg-message "note" } +six sink_6_123567(const A&&); // { dg-message "note" } +seven sink_6_123567(volatile A&&); // { dg-message "note" } + +int test6_123567() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 236 } + return 0; +} + +one sink_6_123568( A&); +two sink_6_123568(const A&); +three sink_6_123568(volatile A&); +five sink_6_123568( A&&); +six sink_6_123568(const A&&); +eight sink_6_123568(const volatile A&&); // { dg-message "" } + +int test6_123568() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_6_123568(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_6_123578( A&); +two sink_6_123578(const A&); +three sink_6_123578(volatile A&); +five sink_6_123578( A&&); +seven sink_6_123578(volatile A&&); +eight sink_6_123578(const volatile A&&); // { dg-message "" } + +int test6_123578() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_6_123578(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_6_123467( A&); // { dg-message "one sink_6_123467|no known conversion" } +two sink_6_123467(const A&); // { dg-message "note" } +three sink_6_123467(volatile A&); // { dg-message "note" } +four sink_6_123467(const volatile A&); // { dg-message "note" } +six sink_6_123467(const A&&); // { dg-message "note" } +seven sink_6_123467(volatile A&&); // { dg-message "note" } + +int test6_123467() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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" } + // { dg-message "candidate" "candidate note" { target *-*-* } 290 } + return 0; +} + +one sink_6_124567( A&); // { dg-message "one sink_6_124567|no known conversion" } +two sink_6_124567(const A&); // { dg-message "note" } +four sink_6_124567(const volatile A&); // { dg-message "note" } +five sink_6_124567( A&&); // { dg-message "note" } +six sink_6_124567(const A&&); // { dg-message "note" } +seven sink_6_124567(volatile A&&); // { dg-message "note" } + +int test6_124567() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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; +} + +one sink_6_125678( A&); +two sink_6_125678(const A&); +five sink_6_125678( A&&); +six sink_6_125678(const A&&); +seven sink_6_125678(volatile A&&); // { dg-message "" } +eight sink_6_125678(const volatile A&&); // { dg-message "" } + +int test6_125678() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_6_125678(va); // { dg-error "lvalue" } + sink_6_125678(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_6_134567( A&); // { dg-message "one sink_6_134567|no known conversion" } +three sink_6_134567(volatile A&); // { dg-message "note" } +four sink_6_134567(const volatile A&); // { dg-message "note" } +five sink_6_134567( A&&); // { dg-message "note" } +six sink_6_134567(const A&&); // { dg-message "note" } +seven sink_6_134567(volatile A&&); // { dg-message "note" } + +int test6_134567() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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; +} + +one sink_6_135678( A&); +three sink_6_135678(volatile A&); +five sink_6_135678( A&&); +six sink_6_135678(const A&&); // { dg-message "" } +seven sink_6_135678(volatile A&&); +eight sink_6_135678(const volatile A&&); // { dg-message "" } + +int test6_135678() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_6_135678(ca); // { dg-error "lvalue" } + sink_6_135678(cva); // { dg-error "lvalue" } + return 0; +} + +int main() +{ + return test6_235678() + test6_234678() + test6_234578() + test6_234568() + + test6_234567() + test6_134678() + test6_124678() + test6_123678() + + test6_123567(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv6p.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv6p.C new file mode 100644 index 0000000..4be8343 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv6p.C @@ -0,0 +1,687 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile { target c++11 } } +// { dg-skip-if "packed attribute missing for struct one/three/five/seven" { "epiphany-*-*" } { "*" } { "" } } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {long x[1];}; +struct two {long x[2];}; +struct three {long x[3];}; +struct four {long x[4];}; +struct five {long x[5];}; +struct six {long x[6];}; +struct seven {long x[7];}; +struct eight {long x[8];}; + +struct A +{ + A(); + A(const volatile A&&); +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 6 at a time + +one sink_6_123456( A&); +two sink_6_123456(const A&); +three sink_6_123456(volatile A&); +four sink_6_123456(const volatile A&); +five sink_6_123456( A&&); +six sink_6_123456(const A&&); + +int test6_123456() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_123456(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_123456(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_123456(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_123456(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_123456(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_123456(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +one sink_6_123457( A&); +two sink_6_123457(const A&); +three sink_6_123457(volatile A&); +four sink_6_123457(const volatile A&); +five sink_6_123457( A&&); +seven sink_6_123457(volatile A&&); + +int test6_123457() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_123457(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_123457(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_123457(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_123457(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_123457(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_123457(c_source())) == 2 * sizeof(long)> t6; + sa<sizeof(sink_6_123457(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_6_123458( A&); +two sink_6_123458(const A&); +three sink_6_123458(volatile A&); +four sink_6_123458(const volatile A&); +five sink_6_123458( A&&); +eight sink_6_123458(const volatile A&&); + +int test6_123458() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_123458(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_123458(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_123458(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_123458(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_123458(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_123458(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_6_123458(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_6_123458(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_6_123467( A&); +two sink_6_123467(const A&); +three sink_6_123467(volatile A&); +four sink_6_123467(const volatile A&); +six sink_6_123467(const A&&); +seven sink_6_123467(volatile A&&); + +int test6_123467() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_123467(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_123467(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_123467(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_123467(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_123467(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_123467(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_6_123468( A&); +two sink_6_123468(const A&); +three sink_6_123468(volatile A&); +four sink_6_123468(const volatile A&); +six sink_6_123468(const A&&); +eight sink_6_123468(const volatile A&&); + +int test6_123468() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_123468(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_123468(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_123468(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_123468(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_123468(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_6_123468(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_123468(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_6_123468(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_6_123478( A&); +two sink_6_123478(const A&); +three sink_6_123478(volatile A&); +four sink_6_123478(const volatile A&); +seven sink_6_123478(volatile A&&); +eight sink_6_123478(const volatile A&&); + +int test6_123478() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_123478(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_123478(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_123478(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_123478(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_123478(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_6_123478(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_6_123478(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_123478(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_6_123567( A&); +two sink_6_123567(const A&); +three sink_6_123567(volatile A&); +five sink_6_123567( A&&); +six sink_6_123567(const A&&); +seven sink_6_123567(volatile A&&); + +int test6_123567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_123567(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_123567(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_123567(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_123567(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_123567(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_123567(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_6_123568( A&); +two sink_6_123568(const A&); +three sink_6_123568(volatile A&); +five sink_6_123568( A&&); +six sink_6_123568(const A&&); +eight sink_6_123568(const volatile A&&); + +int test6_123568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_123568(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_123568(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_123568(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_123568(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_123568(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_123568(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_6_123568(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_6_123578( A&); +two sink_6_123578(const A&); +three sink_6_123578(volatile A&); +five sink_6_123578( A&&); +seven sink_6_123578(volatile A&&); +eight sink_6_123578(const volatile A&&); + +int test6_123578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_123578(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_123578(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_123578(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_123578(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_123578(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_6_123578(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_123578(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_6_123678( A&); +two sink_6_123678(const A&); +three sink_6_123678(volatile A&); +six sink_6_123678(const A&&); +seven sink_6_123678(volatile A&&); +eight sink_6_123678(const volatile A&&); + +int test6_123678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_123678(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_123678(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_123678(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_123678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_123678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_123678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_6_124567( A&); +two sink_6_124567(const A&); +four sink_6_124567(const volatile A&); +five sink_6_124567( A&&); +six sink_6_124567(const A&&); +seven sink_6_124567(volatile A&&); + +int test6_124567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_124567(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_124567(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_124567(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_6_124567(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_124567(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_124567(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_124567(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_6_124568( A&); +two sink_6_124568(const A&); +four sink_6_124568(const volatile A&); +five sink_6_124568( A&&); +six sink_6_124568(const A&&); +eight sink_6_124568(const volatile A&&); + +int test6_124568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_124568(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_124568(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_124568(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_6_124568(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_124568(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_124568(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_124568(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_6_124568(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_6_124578( A&); +two sink_6_124578(const A&); +four sink_6_124578(const volatile A&); +five sink_6_124578( A&&); +seven sink_6_124578(volatile A&&); +eight sink_6_124578(const volatile A&&); + +int test6_124578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_124578(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_124578(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_124578(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_6_124578(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_124578(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_124578(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_6_124578(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_124578(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_6_124678( A&); +two sink_6_124678(const A&); +four sink_6_124678(const volatile A&); +six sink_6_124678(const A&&); +seven sink_6_124678(volatile A&&); +eight sink_6_124678(const volatile A&&); + +int test6_124678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_124678(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_124678(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_124678(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_6_124678(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_124678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_124678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_124678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_6_125678( A&); +two sink_6_125678(const A&); +five sink_6_125678( A&&); +six sink_6_125678(const A&&); +seven sink_6_125678(volatile A&&); +eight sink_6_125678(const volatile A&&); + +int test6_125678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_125678(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_125678(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_125678(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_125678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_125678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_125678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_6_134567( A&); +three sink_6_134567(volatile A&); +four sink_6_134567(const volatile A&); +five sink_6_134567( A&&); +six sink_6_134567(const A&&); +seven sink_6_134567(volatile A&&); + +int test6_134567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_134567(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_134567(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_6_134567(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_134567(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_134567(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_134567(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_134567(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_6_134568( A&); +three sink_6_134568(volatile A&); +four sink_6_134568(const volatile A&); +five sink_6_134568( A&&); +six sink_6_134568(const A&&); +eight sink_6_134568(const volatile A&&); + +int test6_134568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_134568(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_134568(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_6_134568(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_134568(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_134568(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_134568(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_134568(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_6_134568(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_6_134578( A&); +three sink_6_134578(volatile A&); +four sink_6_134578(const volatile A&); +five sink_6_134578( A&&); +seven sink_6_134578(volatile A&&); +eight sink_6_134578(const volatile A&&); + +int test6_134578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_134578(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_134578(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_6_134578(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_134578(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_134578(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_134578(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_6_134578(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_134578(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_6_134678( A&); +three sink_6_134678(volatile A&); +four sink_6_134678(const volatile A&); +six sink_6_134678(const A&&); +seven sink_6_134678(volatile A&&); +eight sink_6_134678(const volatile A&&); + +int test6_134678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_134678(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_134678(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_6_134678(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_134678(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_134678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_134678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_134678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_6_135678( A&); +three sink_6_135678(volatile A&); +five sink_6_135678( A&&); +six sink_6_135678(const A&&); +seven sink_6_135678(volatile A&&); +eight sink_6_135678(const volatile A&&); + +int test6_135678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_135678(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_135678(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_135678(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_135678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_135678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_135678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_6_145678( A&); +four sink_6_145678(const volatile A&); +five sink_6_145678( A&&); +six sink_6_145678(const A&&); +seven sink_6_145678(volatile A&&); +eight sink_6_145678(const volatile A&&); + +int test6_145678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_145678(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_145678(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_6_145678(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_6_145678(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_145678(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_145678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_145678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_145678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_6_234567(const A&); +three sink_6_234567(volatile A&); +four sink_6_234567(const volatile A&); +five sink_6_234567( A&&); +six sink_6_234567(const A&&); +seven sink_6_234567(volatile A&&); + +int test6_234567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_234567(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_234567(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_234567(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_234567(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_234567(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_234567(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +two sink_6_234568(const A&); +three sink_6_234568(volatile A&); +four sink_6_234568(const volatile A&); +five sink_6_234568( A&&); +six sink_6_234568(const A&&); +eight sink_6_234568(const volatile A&&); + +int test6_234568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_234568(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_234568(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_234568(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_234568(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_234568(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_234568(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_6_234568(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_6_234578(const A&); +three sink_6_234578(volatile A&); +four sink_6_234578(const volatile A&); +five sink_6_234578( A&&); +seven sink_6_234578(volatile A&&); +eight sink_6_234578(const volatile A&&); + +int test6_234578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_234578(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_234578(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_234578(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_234578(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_234578(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_6_234578(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_234578(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_6_234678(const A&); +three sink_6_234678(volatile A&); +four sink_6_234678(const volatile A&); +six sink_6_234678(const A&&); +seven sink_6_234678(volatile A&&); +eight sink_6_234678(const volatile A&&); + +int test6_234678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_234678(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_234678(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_234678(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_234678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_234678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_234678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_6_235678(const A&); +three sink_6_235678(volatile A&); +five sink_6_235678( A&&); +six sink_6_235678(const A&&); +seven sink_6_235678(volatile A&&); +eight sink_6_235678(const volatile A&&); + +int test6_235678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_235678(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_235678(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_235678(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_235678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_235678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_235678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_6_245678(const A&); +four sink_6_245678(const volatile A&); +five sink_6_245678( A&&); +six sink_6_245678(const A&&); +seven sink_6_245678(volatile A&&); +eight sink_6_245678(const volatile A&&); + +int test6_245678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_245678(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_6_245678(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_245678(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_6_245678(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_245678(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_245678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_245678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_245678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +three sink_6_345678(volatile A&); +four sink_6_345678(const volatile A&); +five sink_6_345678( A&&); +six sink_6_345678(const A&&); +seven sink_6_345678(volatile A&&); +eight sink_6_345678(const volatile A&&); + +int test6_345678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_345678(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_6_345678(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_6_345678(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_345678(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_345678(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_345678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_345678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_345678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +int main() +{ + return test6_123456() + test6_123457() + test6_123458() + test6_123467() + + test6_123468() + test6_123478() + test6_123567() + test6_123568() + + test6_123578() + test6_123678() + test6_124567() + test6_124568() + + test6_124578() + test6_124678() + test6_125678() + test6_134567() + + test6_134568() + test6_134578() + test6_134678() + test6_135678() + + test6_145678() + test6_234567() + test6_234568() + test6_234578() + + test6_234678() + test6_235678() + test6_245678() + test6_345678(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv7n.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv7n.C new file mode 100644 index 0000000..7e7a664 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv7n.C @@ -0,0 +1,111 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile { target c++11 } } +// { dg-options "" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {char x[1];}; +struct two {char x[2];}; +struct three {char x[3];}; +struct four {char x[4];}; +struct five {char x[5];}; +struct six {char x[6];}; +struct seven {char x[7];}; +struct eight {char x[8];}; + +struct A +{ + A(); + A(const volatile A&&); +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 7 at a time + +one sink_7_1234567( A&); // { dg-message "one sink_7_1234567|no known conversion" } +two sink_7_1234567(const A&); // { dg-message "note" } +three sink_7_1234567(volatile A&); // { dg-message "note" } +four sink_7_1234567(const volatile A&); // { dg-message "note" } +five sink_7_1234567( A&&); // { dg-message "note" } +six sink_7_1234567(const A&&); // { dg-message "note" } +seven sink_7_1234567(volatile A&&); // { dg-message "note" } + +int test7_1234567() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + 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; +} + +one sink_7_1235678( A&); +two sink_7_1235678(const A&); +three sink_7_1235678(volatile A&); +five sink_7_1235678( A&&); +six sink_7_1235678(const A&&); +seven sink_7_1235678(volatile A&&); +eight sink_7_1235678(const volatile A&&); // { dg-message "" } + +int test7_1235678() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_7_1235678(cva); // { dg-error "lvalue" } + return 0; +} + +two sink_7_2345678(const A&); // { dg-message "note" } +three sink_7_2345678(volatile A&); // { dg-message "note" } +four sink_7_2345678(const volatile A&); // { dg-message "note" } +five sink_7_2345678( A&&); // { dg-message "note" } +six sink_7_2345678(const A&&); // { dg-message "note" } +seven sink_7_2345678(volatile A&&); // { dg-message "note" } +eight sink_7_2345678(const volatile A&&); // { dg-message "note" } + +int test7_2345678() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_7_2345678(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 84 } + return 0; +} + +one sink_7_1234678( A&); +two sink_7_1234678(const A&); // { dg-message "note" } +three sink_7_1234678(volatile A&); +four sink_7_1234678(const volatile A&); +six sink_7_1234678(const A&&); // { dg-message "note" } +seven sink_7_1234678(volatile A&&); // { dg-message "note" } +eight sink_7_1234678(const volatile A&&); // { dg-message "note" } + +int test7_1234678() +{ + A a; + const A ca = a; // { dg-error "deleted" } + volatile A va; + const volatile A cva = a; // { dg-error "deleted" } + sink_7_1234678(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 103 } + return 0; +} + +int main() +{ + return test7_2345678() + test7_1234678(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv7p.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv7p.C new file mode 100644 index 0000000..55fc5d7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv7p.C @@ -0,0 +1,233 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile { target c++11 } } +// { dg-skip-if "packed attribute missing for struct one/three/five/seven" { "epiphany-*-*" } { "*" } { "" } } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {long x[1];}; +struct two {long x[2];}; +struct three {long x[3];}; +struct four {long x[4];}; +struct five {long x[5];}; +struct six {long x[6];}; +struct seven {long x[7];}; +struct eight {long x[8];}; + +struct A +{ + A(); + A(const volatile A&&); +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 7 at a time + +one sink_7_1234567( A&); +two sink_7_1234567(const A&); +three sink_7_1234567(volatile A&); +four sink_7_1234567(const volatile A&); +five sink_7_1234567( A&&); +six sink_7_1234567(const A&&); +seven sink_7_1234567(volatile A&&); + +int test7_1234567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_7_1234567(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_7_1234567(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_7_1234567(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_7_1234567(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_7_1234567(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_7_1234567(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_7_1234567(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_7_1234568( A&); +two sink_7_1234568(const A&); +three sink_7_1234568(volatile A&); +four sink_7_1234568(const volatile A&); +five sink_7_1234568( A&&); +six sink_7_1234568(const A&&); +eight sink_7_1234568(const volatile A&&); + +int test7_1234568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_7_1234568(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_7_1234568(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_7_1234568(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_7_1234568(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_7_1234568(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_7_1234568(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_7_1234568(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_7_1234568(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_7_1234578( A&); +two sink_7_1234578(const A&); +three sink_7_1234578(volatile A&); +four sink_7_1234578(const volatile A&); +five sink_7_1234578( A&&); +seven sink_7_1234578(volatile A&&); +eight sink_7_1234578(const volatile A&&); + +int test7_1234578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_7_1234578(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_7_1234578(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_7_1234578(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_7_1234578(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_7_1234578(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_7_1234578(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_7_1234578(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_7_1234578(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_7_1234678( A&); +two sink_7_1234678(const A&); +three sink_7_1234678(volatile A&); +four sink_7_1234678(const volatile A&); +six sink_7_1234678(const A&&); +seven sink_7_1234678(volatile A&&); +eight sink_7_1234678(const volatile A&&); + +int test7_1234678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_7_1234678(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_7_1234678(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_7_1234678(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_7_1234678(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_7_1234678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_7_1234678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_7_1234678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_7_1235678( A&); +two sink_7_1235678(const A&); +three sink_7_1235678(volatile A&); +five sink_7_1235678( A&&); +six sink_7_1235678(const A&&); +seven sink_7_1235678(volatile A&&); +eight sink_7_1235678(const volatile A&&); + +int test7_1235678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_7_1235678(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_7_1235678(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_7_1235678(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_7_1235678(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_7_1235678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_7_1235678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_7_1235678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_7_1245678( A&); +two sink_7_1245678(const A&); +four sink_7_1245678(const volatile A&); +five sink_7_1245678( A&&); +six sink_7_1245678(const A&&); +seven sink_7_1245678(volatile A&&); +eight sink_7_1245678(const volatile A&&); + +int test7_1245678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_7_1245678(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_7_1245678(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_7_1245678(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_7_1245678(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_7_1245678(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_7_1245678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_7_1245678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_7_1245678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_7_1345678( A&); +three sink_7_1345678(volatile A&); +four sink_7_1345678(const volatile A&); +five sink_7_1345678( A&&); +six sink_7_1345678(const A&&); +seven sink_7_1345678(volatile A&&); +eight sink_7_1345678(const volatile A&&); + +int test7_1345678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_7_1345678(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_7_1345678(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_7_1345678(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_7_1345678(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_7_1345678(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_7_1345678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_7_1345678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_7_1345678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_7_2345678(const A&); +three sink_7_2345678(volatile A&); +four sink_7_2345678(const volatile A&); +five sink_7_2345678( A&&); +six sink_7_2345678(const A&&); +seven sink_7_2345678(volatile A&&); +eight sink_7_2345678(const volatile A&&); + +int test7_2345678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_7_2345678(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_7_2345678(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_7_2345678(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_7_2345678(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_7_2345678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_7_2345678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_7_2345678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +int main() +{ + return test7_1234567() + test7_1234568() + test7_1234578() + test7_1234678() + + test7_1235678() + test7_1245678() + test7_1345678() + test7_2345678(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv8p.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv8p.C new file mode 100644 index 0000000..4424793 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv8p.C @@ -0,0 +1,62 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile { target c++11 } } +// { dg-skip-if "packed attribute missing for struct one/three/five/seven" { "epiphany-*-*" } { "*" } { "" } } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {long x[1];}; +struct two {long x[2];}; +struct three {long x[3];}; +struct four {long x[4];}; +struct five {long x[5];}; +struct six {long x[6];}; +struct seven {long x[7];}; +struct eight {long x[8];}; + +struct A +{ + A(); + A(const volatile A&&); +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 8 at a time + +one sink_8_12345678( A&); +two sink_8_12345678(const A&); +three sink_8_12345678(volatile A&); +four sink_8_12345678(const volatile A&); +five sink_8_12345678( A&&); +six sink_8_12345678(const A&&); +seven sink_8_12345678(volatile A&&); +eight sink_8_12345678(const volatile A&&); + +int test8_12345678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_8_12345678(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_8_12345678(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_8_12345678(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_8_12345678(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_8_12345678(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_8_12345678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_8_12345678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_8_12345678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +int main() +{ + return test8_12345678(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv9p.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv9p.C new file mode 100644 index 0000000..a221f32 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rv9p.C @@ -0,0 +1,21 @@ +// PR c++/36744 +// { dg-do run { target c++11 } } + +struct S +{ + S(): i(2) {} + S(S const&s): i(s.i) {} + int i; +}; + +void f(S x) { x.i = 0; } + +extern "C" void abort (void); +int main() +{ + S y; + f(static_cast<S&&>(y)); + if (y.i != 2) + abort (); + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rvo.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rvo.C new file mode 100644 index 0000000..fc83b1b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/rvo.C @@ -0,0 +1,24 @@ +// { dg-do run { target c++11 } } +// Contributed by Sylvain Pion +static int rvalue_constructions = 0; + +struct A { + A () { } + A (const A&) { } + A (A&&) { ++rvalue_constructions; } + ~A () { } +}; + +A f() { return A(); } + +extern "C" { + void abort(void); +} + +int main() +{ + A c = f(); + + if (rvalue_constructions != 0) + abort(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/scoped_enum.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/scoped_enum.C new file mode 100644 index 0000000..0ca3a1f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/scoped_enum.C @@ -0,0 +1,76 @@ +// { dg-do compile { target c++11 } } +enum class Color1 { + Red, + Green, + Blue +}; + +enum struct Color2 { + Red, // { dg-message "previously declared here" } + Orange, + Yellow, + Green, + Blue, + Indigo = Green + 2, + Violet, + Red // { dg-error "redeclaration" } +}; + +enum Color { + Red, Green, Blue +}; + +enum class Color3 { + Red +}; + +enum Color color; +enum Color3 color3; + +void f(int); +void f2(Color3); + +void g() +{ + int i = 0; + f(color); // okay: unscoped enum + f(color3); // { dg-error "cannot convert" } + f2(color); // { dg-error "cannot convert" } + f2(color3); + f2(i); // { dg-error "cannot convert" } + i = color3; // { dg-error "cannot convert" } + color3 = i; // { dg-error "cannot convert" } + f(static_cast<int>(color3)); // okay + + int a[5]; + a[color3]; // { dg-error "array subscript is not an integer" } + + bool b = color3; // { dg-error "cannot convert" } +} + +void h() +{ + Color1 c1 = Color1::Red; + Color2 c2 = Color1::Red; // { dg-error "cannot convert" } + c2 = Color1::Red; // { dg-error "cannot convert" } + + c2 = Color2::Red; + int c3 = Color::Red; +} + +template<typename T, T value> +struct constant { }; + +template<typename T> +int& sfinae(constant<T, T::Green>*); + +float& sfinae(void*); + +void sfinae_test() +{ + int& test1 = sfinae((constant<Color1, Color1::Green>*)0); + int& test2 = sfinae((constant<Color2, Color2::Green>*)0); + float& test3 = sfinae((constant<Color1, Color1::Red>*)0); + int& test4 = sfinae((constant<Color, Green>*)0); + float& test5 = sfinae((constant<Color, Red>*)0); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/scoped_enum2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/scoped_enum2.C new file mode 100644 index 0000000..bb8ad75 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/scoped_enum2.C @@ -0,0 +1,11 @@ +// { dg-do compile { target c++11 } } + +enum class E { e = 10 }; +enum E2 { e2 = 10 }; + +struct C { + int arr[E::e]; // { dg-error "non-integral type" } + int arr2[E2::e2]; // OK + int i: E::e; // { dg-error "non-integral type" } + int i2: E2::e2; // OK +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/scoped_enum_98.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/scoped_enum_98.C new file mode 100644 index 0000000..8c24e86 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/scoped_enum_98.C @@ -0,0 +1,4 @@ +// { dg-do compile } +// { dg-options "-std=c++98" } +enum class E1 { e1 }; // { dg-warning "scoped enums" } +enum E2 : char { e2 }; // { dg-warning "scoped enums" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/scoped_enum_examples.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/scoped_enum_examples.C new file mode 100644 index 0000000..8dc2fa6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/scoped_enum_examples.C @@ -0,0 +1,26 @@ +// { dg-do compile { target c++11 } } +enum class Col { red, yellow, green }; + +int x = Col::red; // { dg-error "cannot convert" } +Col y = Col::red; + +void f() +{ + if (y) { } // { dg-error "could not convert" } +} + +enum direction { left='l', right='r' }; +void g() { + // OK + direction d; + // OK + d = left; + // OK + d = direction::right; +} +enum class altitude { high='h', low='l' }; +void h() { + altitude a; + a = high; // { dg-error "not declared in this scope" } + a = altitude::low; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae1.C new file mode 100644 index 0000000..0e015d9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae1.C @@ -0,0 +1,11 @@ +// { dg-do compile { target c++11 } } + +template< typename T_VECTOR > +void f(const T_VECTOR &a, decltype(a[0]) t = 0); +template< typename T > +void f(const T &a, decltype(a*1) t = 0); + +int main() { + int c; + f(c); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae10.C new file mode 100644 index 0000000..25ef77d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae10.C @@ -0,0 +1,18 @@ +// PR c++/48452 +// { dg-do compile { target c++11 } } +namespace std { + template <class T> T&& declval(); +} + +template<class T, class... Args> +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-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae11.C new file mode 100644 index 0000000..89bd76d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae11.C @@ -0,0 +1,57 @@ +// PR c++/48468 +// { dg-do compile { target c++11 } } +// { dg-prune-output "note" } + +template<class T> +T&& declval() noexcept; + +template< class T > +inline void f1( T& x ) noexcept( noexcept( declval<T&>().foo() ) ) // { dg-error "Z" } +{ + x.foo(); +} + +template< class T, + bool Noexcept = noexcept( declval<T&>().foo() ) // { dg-error "no member|not convert" } + +> +inline void f2( T& x ) noexcept( Noexcept ) +{ + x.foo(); +} + +// a common and trivial mistake +template< class T > +inline void f3( T& x ) noexcept( declval<T&>().foo() ) // { dg-error "Z" } +{ + x.foo(); +} + +struct X +{ + void foo(); +}; + +struct Y +{ + void foo() noexcept; +}; + +struct Z {}; + +int main() +{ + X x; Y y; Z z; + + static_assert( !noexcept( f1(x) ), "OK." ); + static_assert( !noexcept( f2(x) ), "OK." ); + // static_assert( !noexcept( f3(x) ), "shall be ill-formed(OK)." ); + + static_assert( noexcept( f1(y) ), "OK." ); + static_assert( noexcept( f2(y) ), "OK." ); + // static_assert( noexcept( f3(y) ), "shall be ill-formed(OK)." ); + + noexcept( f1(z) ); // { dg-message "required" } + static_assert( noexcept( f2(z) ), "shall be ill-formed." ); // { dg-error "no match" } + noexcept( f3(z) ); // { dg-message "required" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae12.C new file mode 100644 index 0000000..22a9847 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae12.C @@ -0,0 +1,18 @@ +// PR c++/48535 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae13.C new file mode 100644 index 0000000..3cff1b4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae13.C @@ -0,0 +1,20 @@ +// PR c++/48581 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae14.C new file mode 100644 index 0000000..14e5e05 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae14.C @@ -0,0 +1,27 @@ +// PR c++/48557 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae15.C new file mode 100644 index 0000000..d8b3228 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae15.C @@ -0,0 +1,12 @@ +// PR c++/48531 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae16.C new file mode 100644 index 0000000..56cbdad --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae16.C @@ -0,0 +1,17 @@ +// PR c++/48531 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae17.C new file mode 100644 index 0000000..c56a5d4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae17.C @@ -0,0 +1,31 @@ +// PR c++/48530 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae18.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae18.C new file mode 100644 index 0000000..ea46df0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae18.C @@ -0,0 +1,17 @@ +// PR c++/48530 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae19.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae19.C new file mode 100644 index 0000000..52cc6ad --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae19.C @@ -0,0 +1,13 @@ +// PR c++/48737 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae2.C new file mode 100644 index 0000000..6f617b2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae2.C @@ -0,0 +1,39 @@ +// PR c++/44967 +// { dg-do compile { target c++11 } } + +template <typename T> T&& declval(); + +template<typename T1, typename T2, typename... Args> +struct has_construct +{ + typedef char one; + typedef struct {char _m[2]; } two; + + template<typename U1, typename U2, typename... Args2> + static decltype(declval<U1>().construct(declval<U2*>(), declval<Args2>()...), one()) test(int); + template<typename, typename, typename...> + static two test(...); + + static const bool value = sizeof(test<T1, T2, Args...>(0)) == 1; +}; + + +struct A0 +{}; + +struct A1 +{ + void construct(int*, int); +}; + +template<typename _Tp> +struct A2 +{ + template<typename _Tp1, typename... _Args> + void construct(_Tp1*, _Args&&...) {} +}; + +#define SA(X) static_assert(X,#X) +SA((!has_construct<A0, int, int>::value)); // ok +SA((has_construct<A1, int, int>::value)); // bang +SA((has_construct<A2<int>, int>::value)); // bang diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae20.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae20.C new file mode 100644 index 0000000..882efe7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae20.C @@ -0,0 +1,23 @@ +// PR c++/48744 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae21.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae21.C new file mode 100644 index 0000000..743d7cf --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae21.C @@ -0,0 +1,18 @@ +// PR c++/48735 +// { dg-do compile { target c++11 } } + +template<class T, + class = decltype(T{}) +> +char f(int); + +template<class> +char (&f(...))[2]; + +struct ND { + // Make ND() non-aggregate. + virtual void f(); + ND() = delete; +}; + +static_assert(sizeof(f<ND[1]>(0)) != 1, "Error"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae22.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae22.C new file mode 100644 index 0000000..2c55b8a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae22.C @@ -0,0 +1,23 @@ +// PR c++/48745 +// { dg-do compile { target c++11 } } + +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... Args> +decltype(T{create<Args>()...}, char()) f(int); + +template<class, class...> +char (&f(...))[2]; + +static_assert(sizeof(f<int, void>(0)) != 1, "Error"); // # diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae23.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae23.C new file mode 100644 index 0000000..53d5c9b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae23.C @@ -0,0 +1,28 @@ +// PR c++/48647 +// { dg-do compile { target c++11 } } + +template< class T > +T&& declval(); + +template< class T, class U > +decltype( true ? declval<T>() : declval<U>() ) test( int ); + +template< class T, class U > +void test( ... ); + + +template< class T, class U > +struct is_same { + static const bool value = false; +}; + +template< class T > +struct is_same<T, T> { + static const bool value = true; +}; + +#define SA(X) static_assert ((X),#X) + +typedef decltype( test<int*, double*>(0) ) void_expected; +SA ((is_same<void_expected, void>::value)); +SA ((!is_same<void_expected, void*>::value)); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae24.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae24.C new file mode 100644 index 0000000..6d275d3 --- /dev/null +++ b/gcc-4.9/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-do compile { target c++11 } } +// { 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>()( ) )> // { dg-error "no match" } + R f() const; +}; + +int main() +{ + Bind<F1> b; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae25.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae25.C new file mode 100644 index 0000000..0ff872c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae25.C @@ -0,0 +1,10 @@ +// PR c++/49105 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae26.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae26.C new file mode 100644 index 0000000..f55e1d8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae26.C @@ -0,0 +1,38 @@ +// PR c++/49229 +// { dg-do compile { target c++11 } } + +extern void* enabler; + +template<bool, class = void> +struct enable_if {}; + +template<class T> +struct enable_if<true, T> { + typedef T type; +}; + +template<class... Bn> +struct and_; + +template<class B1> +struct and_<B1> : B1 {}; + +template<class, class> +struct is_same { + static constexpr bool value = false; +}; + +template<class T> +struct is_same<T, T> { + static constexpr bool value = true; +}; + +template<class... T> +struct S { + template<class... U, + typename enable_if<and_<is_same<T, U>...>::value>::type*& = enabler // { dg-error "no type" } + > + S(U...){} +}; + +S<bool> s(0); // { dg-error "no match" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae27.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae27.C new file mode 100644 index 0000000..ddd484a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae27.C @@ -0,0 +1,20 @@ +// PR c++/50157 +// { dg-do compile { target c++11 } } + +template<class T> +T val(); + +template<class T, class Arg, class = + decltype(::new T(val<Arg>())) +> +auto test(int) -> char; + +template<class, class> +auto test(...) -> char (&)[2]; + +struct P { + explicit operator bool(); // (#13) +}; + +typedef decltype(test<bool, P>(0)) type; // OK +typedef decltype(test<float, P>(0)) type2; // Error (#17) diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae28.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae28.C new file mode 100644 index 0000000..1eeba64 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae28.C @@ -0,0 +1,16 @@ +// PR c++/50324 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae29.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae29.C new file mode 100644 index 0000000..8792778 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae29.C @@ -0,0 +1,17 @@ +// PR c++/51047 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae3.C new file mode 100644 index 0000000..5009c84 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae3.C @@ -0,0 +1,56 @@ +// { dg-do compile { target c++11 } } + +namespace std { template <class T> T&& declval(); } + +template<typename _Tp, typename... _Args> + class is_constructible_mini + { + typedef char __one; + typedef struct { char __arr[2]; } __two; + + template<typename _Tp1, typename... _Args1> + static decltype(::new _Tp1(std::declval<_Args1>()...), __one()) + __test(int); + + template<typename, typename...> + static __two __test(...); + + public: + static const bool value = sizeof(__test<_Tp, _Args...>(0)) == 1; + }; + +/* +template<typename _Tp> + class is_constructible_mini<_Tp> + { + typedef char __one; + typedef struct { char __arr[2]; } __two; + + template<typename _Tp1> + static decltype(::new _Tp1, __one()) __test(int); + + template<typename> + static __two __test(...); + + public: + static const bool value + = sizeof(__test<typename std::remove_cv<_Tp>::type>(0)) == 1; + }; +*/ + +struct A +{ + A(int); +}; + +struct B { }; + +static_assert( is_constructible_mini<A, int>::value, ""); +static_assert( is_constructible_mini<A, A>::value, ""); +static_assert( !is_constructible_mini<A, int, double>::value, ""); + +static_assert( !is_constructible_mini<A>::value, ""); // doesn't compile without the + // partial specialization + +static_assert( is_constructible_mini<B>::value, ""); +static_assert( is_constructible_mini<const B>::value, ""); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae30.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae30.C new file mode 100644 index 0000000..6fcf5f7 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae31.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae31.C new file mode 100644 index 0000000..8695ebc --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae31.C @@ -0,0 +1,13 @@ +// PR c++/51973 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae32.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae32.C new file mode 100644 index 0000000..97945c6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae32.C @@ -0,0 +1,18 @@ +// PR c++/51989 +// { dg-do compile { target c++11 } } + +template <typename T> +struct is_container +{ + template <typename U, typename V = decltype(((U*)0)->begin())> + static char test(U* u); + + template <typename U> static long test(...); + + enum { value = sizeof test<T>(0) == 1 }; +}; + +int main() +{ + return is_container<void>::value; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae33.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae33.C new file mode 100644 index 0000000..f543c1f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae33.C @@ -0,0 +1,27 @@ +// PR c++/52422 +// { dg-do compile { target c++11 } } + +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 = decltype(create<T>()()) +> +auto f(int) -> char(&)[1]; + +template<class> +auto f(...) -> char(&)[2]; + +static_assert(sizeof(f<void>(0)) != 1, ""); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae34.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae34.C new file mode 100644 index 0000000..615a2bc --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae34.C @@ -0,0 +1,27 @@ +// PR c++/52422 +// { dg-do compile { target c++11 } } + +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>())() ) +> +auto f(int) -> char(&)[1]; + +template<class, class> +auto f(...) -> char(&)[2]; + +static_assert(sizeof(f<void, void>(0)) != 1, ""); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae35.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae35.C new file mode 100644 index 0000000..86b6103 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae35.C @@ -0,0 +1,13 @@ +// PR c++/52363 +// { dg-do compile { target c++11 } } + +#include <type_traits> + +struct proxy +{ + void operator=(int const&); + void operator=(int&&) const; +}; + +static_assert( !std::is_assignable<proxy, int>::value, "" ); +static_assert( std::is_assignable<const proxy, int>::value, "" ); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae36.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae36.C new file mode 100644 index 0000000..6597bc3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae36.C @@ -0,0 +1,14 @@ +// PR c++/52363 +// { dg-do compile { target c++11 } } +// { dg-options "-pedantic" } + +#include <type_traits> + +struct proxy +{ + void operator=(int const&); + void operator=(int&&) const; +}; + +static_assert( !std::is_assignable<proxy, int>::value, "" ); +static_assert( std::is_assignable<const proxy, int>::value, "" ); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae37.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae37.C new file mode 100644 index 0000000..e89106a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae37.C @@ -0,0 +1,36 @@ +// PR c++/51213 +// { dg-do compile { target c++11 } } + +class C { + typedef int type; +}; + +template<int> +struct I; + +template<> +struct I<2> { }; + +template<class T, class = typename T::type> +auto f(int) -> char; + +template<class> +auto f(...) -> char (&)[2]; + +static_assert(sizeof(f<C>(0)) == 2, "Ouch"); + +typedef int testf[sizeof(f<C>(0)) == 2 ? 1 : -1]; + +I<sizeof(f<C>(0))> vf; + +template<class T> +auto g(int) -> decltype(typename T::type(), char()); + +template<class> +auto g(...) -> char (&)[2]; + +static_assert(sizeof(g<C>(0)) == 2, "Ouch"); + +typedef int testg[sizeof(g<C>(0)) == 2 ? 1 : -1]; + +I<sizeof(g<C>(0))> vg; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae38.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae38.C new file mode 100644 index 0000000..2e860ee --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae38.C @@ -0,0 +1,10 @@ +// { dg-do compile { target c++11 } } + +template<class T, unsigned = sizeof(T)> +auto f(int) -> char; + +template<class> +auto f(...) -> char(&)[2]; + +static_assert(sizeof(f<void>(0)) != 1, ""); +static_assert(sizeof(f<void()>(0)) != 1, ""); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae39.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae39.C new file mode 100644 index 0000000..8183bda --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae39.C @@ -0,0 +1,146 @@ +// PR c++/54191 +// { dg-do compile { target c++11 } } + +struct B +{}; + +struct D + : private B +{}; + +template<typename T> +T &&declval(); + + +template<typename From, typename = decltype(B{declval<From>()})> +constexpr bool test_braced_cast_to_base(int) +{ return true; } + +template<typename> +constexpr bool test_braced_cast_to_base(bool) +{ return false; } + +static_assert(!test_braced_cast_to_base<D>(0), ""); + + +template<typename From, typename = decltype(D{declval<From>()})> +constexpr bool test_braced_cast_to_derived(int) +{ return true; } + +template<typename> +constexpr bool test_braced_cast_to_derived(bool) +{ return false; } + +static_assert(!test_braced_cast_to_derived<B>(0), ""); + + +typedef B *PB; + +template<typename From, typename = decltype(PB{declval<From>()})> +constexpr bool test_braced_cast_to_ptr_to_base(int) +{ return true; } + +template<typename> +constexpr bool test_braced_cast_to_ptr_to_base(bool) +{ return false; } + +static_assert(!test_braced_cast_to_ptr_to_base<D *>(0), ""); + + +typedef D *PD; + +template<typename From, typename = decltype(PD{declval<From>()})> +constexpr bool test_braced_cast_to_ptr_to_derived(int) +{ return true; } + +template<typename> +constexpr bool test_braced_cast_to_ptr_to_derived(bool) +{ return false; } + +static_assert(!test_braced_cast_to_ptr_to_derived<B *>(0), ""); + + +template<typename From, typename To, + typename = decltype(static_cast<To>(declval<From>()))> +constexpr bool test_static_cast(int) +{ return true; } + +template<typename, typename> +constexpr bool test_static_cast(bool) +{ return false; } + +static_assert(!test_static_cast<B &, D &>(0), ""); +static_assert(!test_static_cast<B *, D *>(0), ""); + + +template<typename From, typename To, + typename = decltype(dynamic_cast<To>(declval<From>()))> +constexpr bool test_dynamic_cast(int) +{ return true; } + +template<typename, typename> +constexpr bool test_dynamic_cast(bool) +{ return false; } + +static_assert(!test_dynamic_cast<D &, B &>(0), ""); +static_assert(!test_dynamic_cast<D *, B *>(0), ""); + + +int B::*pm = 0; + +template<typename T, typename = decltype(declval<T>().*pm)> +constexpr bool test_member_ptr_dot(int) +{ return true; } + +template<typename> +constexpr bool test_member_ptr_dot(bool) +{ return false; } + +static_assert(!test_member_ptr_dot<D>(0), ""); + + +template<typename T, typename = decltype(declval<T>()->*pm)> +constexpr bool test_member_ptr_arrow(int) +{ return true; } + +template<typename> +constexpr bool test_member_ptr_arrow(bool) +{ return false; } + +static_assert(!test_member_ptr_arrow<D *>(0), ""); + + +template<typename T, typename U, + typename = decltype(declval<T>() < declval<U>())> +constexpr bool test_rel_op(int) +{ return true; } + +template<typename, typename> +constexpr bool test_rel_op(bool) +{ return false; } + +static_assert(!test_rel_op<D *, B *>(0), ""); + + +template<typename T, typename U, + typename = decltype(declval<T>() == declval<U>())> +constexpr bool test_eq(int) +{ return true; } + +template<typename, typename> +constexpr bool test_eq(bool) +{ return false; } + +static_assert(!test_eq<D *, B *>(0), ""); + + +template<typename T, typename U, + typename = decltype(false ? declval<T>() : declval<U>())> +constexpr bool test_cond_op(int) +{ return true; } + +template<typename, typename> +constexpr bool test_cond_op(bool) +{ return false; } + +static_assert(!test_cond_op<B *, D *>(0), ""); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae4.C new file mode 100644 index 0000000..1b24966 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae4.C @@ -0,0 +1,23 @@ +// { dg-do compile { target c++11 } } + +namespace std { template <class T> T&& declval(); } + +template<typename _Tp, typename... _Args> + class is_constructible_mini + { + typedef char __one; + typedef struct { char __arr[2]; } __two; + + template<typename _Tp1, typename... _Args1> + static decltype(::new _Tp1(std::declval<_Args1>()...), __one()) + __test(int); + + template<typename, typename...> + static __two __test(...); + + public: + static const bool value = sizeof(__test<_Tp, _Args...>(0)) == 1; + }; + +static_assert( !is_constructible_mini<int[], int>::value, ""); +static_assert( !is_constructible_mini<void, int>::value, ""); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae40.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae40.C new file mode 100644 index 0000000..18e5fec --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae40.C @@ -0,0 +1,21 @@ +// PR c++/54541 +// { dg-do compile { target c++11 } } + +template <typename T> T&& declval(); + +struct X; + +X f(int); + +template <class T> +void g(decltype((void)f(declval<T>())) *) +{} + +template <class T> +void g(...) +{} + +int main() +{ + g<int>(0); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae41.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae41.C new file mode 100644 index 0000000..bd6f624 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae41.C @@ -0,0 +1,17 @@ +// PR c++/54542 +// { dg-do compile { target c++11 } } + +template <class T> +void f(decltype(new T(1, 2)) *) +{ + T(1, 2); +} + +template <class T> +void f(...) +{} + +int main() +{ + f<int>(0); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae42.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae42.C new file mode 100644 index 0000000..a7a23a3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae42.C @@ -0,0 +1,46 @@ +// PR c++/54738 +// { dg-do compile { target c++11 } } + +template<class T> +T&& declval(); + +template<class F, class T1, class... Ts> +decltype(((*declval<T1>()).*declval<F>())(declval<Ts>()...)) +test1(int); + +template<class...> +void test1(...); + +template<class F, class T1, class... Ts> +decltype((declval<T1>().*declval<F>())(declval<Ts>()...)) +test2(int); + +template<class...> +void test2(...); + +struct S {}; + +typedef void (S::*Func)(int) const; +typedef void (S::*Func2)(int); + +typedef decltype(test1<Func, S*>(0)) type1a; +typedef decltype(test1<Func, S*&>(0)) type1b; +typedef decltype(test1<Func, S*, int, int>(0)) type1c; +typedef decltype(test1<Func, S*&, int, int>(0)) type1d; + +typedef decltype(test2<Func, S>(0)) type2a; +typedef decltype(test2<Func, S&>(0)) type2b; +typedef decltype(test2<Func, S, int, int>(0)) type2c; +typedef decltype(test2<Func, S&, int, int>(0)) type2d; + +typedef decltype(test1<Func, S*, S>(0)) type3a; +typedef decltype(test1<Func, S*&, S>(0)) type3b; + +typedef decltype(test2<Func, S, S>(0)) type4a; +typedef decltype(test2<Func, S&, S>(0)) type4b; + +typedef decltype(test1<Func2, const S*, int>(0)) type5a; +typedef decltype(test1<Func2, const S*&, int>(0)) type5b; + +typedef decltype(test2<Func2, const S, int>(0)) type6a; +typedef decltype(test2<Func2, const S&, int>(0)) type6b; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae43.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae43.C new file mode 100644 index 0000000..14c31f6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae43.C @@ -0,0 +1,31 @@ +// PR c++/56208 +// { dg-do compile { target c++11 } } + +struct ostream { + ostream& operator<<(int); +}; + +struct sfinae_base { + + typedef char one; + typedef char (&two)[2]; + + template<class T> + static T make(); + + template<unsigned> struct ok { typedef int type; }; + + template<class U, class T> + static one test(decltype((make<U>() << make<T>()), 0)); + + template<class, class> + static two test(...); +}; + +template<class T> +struct is_printable : private sfinae_base +{ + enum { value = sizeof(test<ostream&, T>(0)) == sizeof(one) }; +}; + +typedef int ok[is_printable<int>::value ? 1 : -1]; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae44.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae44.C new file mode 100644 index 0000000..bbcae62 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae44.C @@ -0,0 +1,26 @@ +// PR c++/56913 +// { dg-do compile { target c++11 } } + +template<typename T> +T &&declval(); + +template<typename T, typename U, + typename = decltype((declval<T>().*declval<U>())())> +constexpr bool test(int) +{ + return true; +} + +template<typename T, typename U> +constexpr bool test(...) +{ + return false; +} + +struct S +{}; + +static_assert(!test<S, void (S::*)() &>(0), ""); +static_assert(test<S, void (S::*)() &&>(0), ""); +static_assert(test<S &, void (S::*)() &>(0), ""); +static_assert(!test<S &, void (S::*)() &&>(0), ""); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae45.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae45.C new file mode 100644 index 0000000..bd37514 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae45.C @@ -0,0 +1,35 @@ +// PR c++/56970 +// { dg-do compile { target c++11 } } + +template <typename T> +struct has +{ + template <typename> + constexpr static int test(...) { + return 0; + } + + template <typename C> + constexpr static int test(decltype(sizeof(C::x))) { // Doesn't compile. + return 1; // Is a member variable. + } + + template <typename C, int c = sizeof(decltype(((C*)nullptr)->x()))> + constexpr static int test(int) { + return 2; // Is a member function. + } + + static const int value = test<T>(0); +}; + +struct foo { + int x; +}; + +struct bar { + int x(); +}; + +static_assert(has<int>::value == 0, ""); +static_assert(has<foo>::value == 1, ""); +static_assert(has<bar>::value == 2, ""); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae46.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae46.C new file mode 100644 index 0000000..20e859c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae46.C @@ -0,0 +1,13 @@ +// PR c++/57419 +// { dg-do compile { target c++11 } } + +template< typename q > +decltype( &q::f ) t( q ) {} + +char t( ... ) { return {}; } + +class c { void f() = delete; }; +class d { static void f() = delete; }; + +static_assert( sizeof( t( c() ) ), "c" ); +static_assert( sizeof( t( d() ) ), "d" ); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae47.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae47.C new file mode 100644 index 0000000..1058a28 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae47.C @@ -0,0 +1,25 @@ +// Source: Comment 16 of PR51213 +// { dg-do compile { target c++11 } } + +template <class T> +T && declval(); + +template <class T> +constexpr auto hasSize(int) -> decltype(declval<T&>().size(), bool()) +{ return true; } + +template <class T> +constexpr bool hasSize(...) +{ return false; } + +struct A +{ + int size(); +}; + +struct B : private A +{ +}; + +static_assert(hasSize<A>(0), "A"); +static_assert(!hasSize<B>(0), "B"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae48.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae48.C new file mode 100644 index 0000000..ba728d9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae48.C @@ -0,0 +1,21 @@ +// PR c++/57874 +// { dg-do compile { target c++11 } } + +namespace NX +{ + struct X {}; + void foo(X) {} +} + +namespace NY +{ + struct Y {}; +} + +template<class T> +auto ADLfoo(T&&) -> decltype((foo(T{}), short())); + +char ADLfoo(...); + +static_assert(sizeof(ADLfoo(NY::Y{})) == 1, ""); +static_assert(sizeof(ADLfoo(NX::X{})) == 2, ""); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae49.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae49.C new file mode 100644 index 0000000..59381f3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae49.C @@ -0,0 +1,29 @@ +// PR c++/58932 +// { dg-do compile { target c++11 } } + +using nullptr_t = decltype(nullptr); + +template<typename T, typename Sfinae = nullptr_t> +struct B { + static float& int_if_addable(); +}; + +template<typename T> +struct B<T, decltype( (T() + T()), nullptr )> { + static int& int_if_addable(); +}; + +struct X { }; + +struct Y { }; +Y operator+(Y, Y); + +struct Z { }; +Z operator+(Z, Z) = delete; + +int main() +{ + float& a = B<X>::int_if_addable(); + int& b = B<Y>::int_if_addable(); + float& c = B<Z>::int_if_addable(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae5.C new file mode 100644 index 0000000..421a06e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae5.C @@ -0,0 +1,16 @@ +// { dg-do compile { target c++11 } } + +template<class T> +T&& create(); + +template <class T, class U, + class = decltype(create<T>() = create<U>()) + > +char test(int); + +template <class, class> +double test(...); + +int main() { + test<int[], int[]>(0); // #1 +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae6.C new file mode 100644 index 0000000..4ee0146 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae6.C @@ -0,0 +1,31 @@ +// PR c++/48113 +// { dg-do compile { target c++11 } } + +template<typename T> T declval(); + +struct tuple { }; + +struct F1 +{ + void operator()(tuple, int); +}; + +typedef void (*F2)(tuple, int); + +template<typename F, typename T> +struct Bind +{ + template<typename A, + typename R = decltype( F()(declval<T&>(), A()) )> + R f(A); + + template<typename A, + typename R = decltype( F()(declval<volatile T&>(), A()) )> + R f(A) volatile; +}; + +int main() +{ + Bind<F1, tuple>().f(0); // OK + Bind<F2, tuple>().f(0); // ERROR, should be OK +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae7.C new file mode 100644 index 0000000..18b3d8f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae7.C @@ -0,0 +1,20 @@ +// { dg-do compile { target c++11 } } + +struct A +{ + void f(); + void f(int); + typedef int g; +}; + +template <class T> decltype (T::f) f(); +template <class T> void f(); + +template <class T> decltype (T::g) g(); +template <class T> void g(); + +int main() +{ + f<A>(); + g<A>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae8.C new file mode 100644 index 0000000..43381d0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae8.C @@ -0,0 +1,14 @@ +// PR c++/48449 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae9.C new file mode 100644 index 0000000..68656c6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae9.C @@ -0,0 +1,24 @@ +// PR c++/48450 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert1.C new file mode 100644 index 0000000..49b5a97 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert1.C @@ -0,0 +1,14 @@ +// { dg-do compile { target c++11 } } +void foo() +{ + static_assert(1, "okay"); + static_assert (0 == 1, "zero is never equal to one"); // { dg-error "never equal" } +} + +class X { + static_assert(1, "okay"); + static_assert (0 == 1, "zero is never equal to one"); // { dg-error "never equal" } +}; + +static_assert(1, "okay"); +static_assert (0 == 1, "zero is never equal to one"); // { dg-error "never equal" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert10.C new file mode 100644 index 0000000..216f259 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert10.C @@ -0,0 +1,8 @@ +// PR c++/60254 +// { dg-do compile { target c++11 } } + +template<typename T> bool foo(T) +{ + int i; + static_assert(foo(i), "Error"); // { dg-error "non-constant condition|not usable" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert11.C new file mode 100644 index 0000000..8a7362d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert11.C @@ -0,0 +1,10 @@ +// PR c++/60254 +// { dg-do compile { target c++11 } } + +struct A +{ + template<typename T> bool foo(T) + { + static_assert(foo(0), "Error"); // { dg-error "non-constant condition|constant expression" } + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert2.C new file mode 100644 index 0000000..1ef2bc6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert2.C @@ -0,0 +1,35 @@ +// { dg-do compile { target c++11 } } +template<int I> +struct accept_evens { + static_assert( I % 2 == 0, "I must be an even number"); // { dg-error "even number" } +}; + +template<int I> +struct accept_evens_ok { + static_assert( I % 2 == 0, "I must be an even number"); +}; + +template<int I> +void accept_odds() { + static_assert( I % 2 == 1, "I must be an odd number"); // { dg-error "odd number" } +} + +template<int I> +void accept_odds_ok() { + static_assert( I % 2 == 1, "I must be an odd number"); +} + +void f() +{ + accept_odds<1>(); + accept_odds<2>(); + accept_odds<3>(); + accept_odds_ok<5>(); + accept_odds_ok<7>(); +} + +accept_evens<0> ok0; +accept_evens<1> error1; +accept_evens<2> ok2; +accept_evens_ok<4> ok4; +accept_evens_ok<6> ok6; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert3.C new file mode 100644 index 0000000..addde13 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert3.C @@ -0,0 +1,4 @@ +// { dg-do compile { target c++11 } } +static_assert(7 / 0, "X"); // { dg-error "non-constant condition" "non-constant" } +// { dg-warning "division by zero" "zero" { target *-*-* } 2 } +// { dg-error "division by zero is not a constant-expression" "not a constant" { target *-*-* } 2 } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert4.C new file mode 100644 index 0000000..9a74735 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert4.C @@ -0,0 +1,16 @@ +// { dg-do compile { target c++11 } } +// { dg-options "--param ggc-min-heapsize=0 --param ggc-min-expand=0 " } +// PR C++/30033 +// Make sure that the static assert does not crash the GC. + +template <class T> +struct default_delete +{ + void + operator() (T * ptr) const + { + static_assert (sizeof (T) > 0, "Can't delete pointer to incomplete type"); + } +}; + + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert5.C new file mode 100644 index 0000000..36cf2eb --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert5.C @@ -0,0 +1,21 @@ +// PR c++/50837 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert6.C new file mode 100644 index 0000000..5323e71 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert6.C @@ -0,0 +1,4 @@ +// PR c++/51397 +// { dg-do compile { target c++11 } } + +static_assert('X' != '\130', "'X' has the wrong value"); // { dg-error "'X' has the wrong value" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert7.C new file mode 100644 index 0000000..f571de2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert7.C @@ -0,0 +1,21 @@ +// PR c++/53166 +// { dg-do compile { target c++11 } } +// { dg-options "-Waddress" } + +template <typename X, X a> +struct A +{ + static_assert (a != nullptr, "oops"); + static_assert (nullptr != a, "oops"); + + int f() + { + static_assert (a != nullptr, "oops"); + static_assert (nullptr != a, "oops"); + return 1; + } +}; + +int i1; +A<int*, &i1> a1; +int i2 = a1.f(); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert8.C new file mode 100644 index 0000000..ea23afb --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert8.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } + +static_assert (1 == 0); // { dg-error "expected (string-literal|',') before" } + +static_assert (1 == 0,); // { dg-error "expected string-literal before '\\)'" } + +static_assert (1 == 0, "oops"); // { dg-error "static assertion failed" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert9.C new file mode 100644 index 0000000..fccaa44 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/static_assert9.C @@ -0,0 +1,7 @@ +// PR c++/58837 +// { dg-require-effective-target c++11 } + +void f(); +static_assert(f, ""); +struct A {}; +static_assert(A::~A, ""); // { dg-error "non-static member function" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/std-layout1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/std-layout1.C new file mode 100644 index 0000000..09273c5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/std-layout1.C @@ -0,0 +1,91 @@ +// { dg-do compile { target c++11 } } + +// [basic.types]/10: +// Scalar types, standard-layout class types (Clause 9), arrays of such +// types and cv-qualified versions of these types (3.9.3) are collectively +// called standard-layout types. + +// [class]/7: +// A standard-layout class is a class that: +// * has no non-static data members of type non-standard-layout class (or +// array of such types) or reference, +// * has no virtual functions (10.3) and no virtual base classes (10.1), +// * has the same access control (Clause 11) for all non-static data members, +// * has no non-standard-layout base classes, +// * either has no non-static data members in the most-derived class and at +// most one base class with non-static data members, or has no base classes +// with non-static data members, and +// * has no base classes of the same type as the first non-static data member. + +#include <type_traits> + +#define TRY(expr) static_assert (expr, #expr) +#define YES(type) TRY(std::is_standard_layout<type>::value); \ + TRY(std::is_standard_layout<type[]>::value); \ + TRY(std::is_standard_layout<const volatile type>::value) +#define NO(type) TRY(!std::is_standard_layout<type>::value); \ + TRY(!std::is_standard_layout<type[]>::value); \ + TRY(!std::is_standard_layout<const volatile type>::value) +#define NONPOD(type) TRY(!std::is_pod<type>::value); \ + TRY(!std::is_pod<type[]>::value); \ + TRY(!std::is_pod<const volatile type>::value) + +struct A; + +YES(int); +YES(__complex int); +YES(void *); +YES(int A::*); +typedef int (A::*pmf)(); +YES(pmf); + +struct A { ~A(); }; +YES(A); +NONPOD(A); +struct F: public A { int i; }; +YES(F); +NONPOD(F); +struct G: public A { A a; }; +NO(G); +struct M { A a; }; +YES(M); + +class B +{ + int i; + __complex int c; + void *p; + double ar[4]; + int A::* pm; + int (A::*pmf)(); +}; +YES(B); +struct D: public B { }; +YES(D); +struct E: public B { int q; }; +NO(E); +struct D2: public B { }; +YES(D2); +struct I: public D, public D2 { }; +NO(I); + +struct C +{ + int i; +private: + int j; +}; +NO(C); +struct H: public C { }; +NO(H); +struct N { C c; }; +NO(N); + +struct J { virtual void f(); }; +struct J2: J { }; +NO(J); +NO(J2); +struct K { }; +struct L: virtual K {}; +YES(K); +NO(L); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/std_fext-numeric-literals.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/std_fext-numeric-literals.C new file mode 100644 index 0000000..7caaa7c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/std_fext-numeric-literals.C @@ -0,0 +1,115 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-fext-numeric-literals" } + +// Integer imaginary... + +constexpr unsigned long long +operator"" i(unsigned long long n) // { dg-warning "shadowed by implementation" } +{ return 4 * n + 0; } + +constexpr unsigned long long +operator"" I(unsigned long long n) // { dg-warning "shadowed by implementation" } +{ return 4 * n + 1; } + +constexpr unsigned long long +operator"" j(unsigned long long n) // { dg-warning "shadowed by implementation" } +{ return 4 * n + 2; } + +constexpr unsigned long long +operator"" J(unsigned long long n) // { dg-warning "shadowed by implementation" } +{ return 4 * n + 3; } + +// Floating-point imaginary... + +constexpr long double +operator"" i(long double n) // { dg-warning "shadowed by implementation" } +{ return 4.0L * n + 0.0L; } + +constexpr long double +operator"" I(long double n) // { dg-warning "shadowed by implementation" } +{ return 4.0L * n + 1.0L; } + +constexpr long double +operator"" j(long double n) // { dg-warning "shadowed by implementation" } +{ return 4.0L * n + 2.0L; } + +constexpr long double +operator"" J(long double n) // { dg-warning "shadowed by implementation" } +{ return 4.0L * n + 3.0L; } + +// Fixed-point... + +constexpr long double +operator"" k(long double n) // { dg-warning "shadowed by implementation" } +{ return 4 * (n + 1) + 0; } + +constexpr long double +operator"" K(long double n) // { dg-warning "shadowed by implementation" } +{ return 4 * (n + 1) + 1; } + +constexpr long double +operator"" r(long double n) // { dg-warning "shadowed by implementation" } +{ return 4 * (n + 1) + 2; } + +constexpr long double +operator"" R(long double n) // { dg-warning "shadowed by implementation" } +{ return 4 * (n + 1) + 3; } + +// Machine-defined... + +constexpr long double +operator"" w(long double n) // { dg-warning "shadowed by implementation" } +{ return 4 * (n + 2) + 0; } + +constexpr long double +operator"" W(long double n) // { dg-warning "shadowed by implementation" } +{ return 4 * (n + 2) + 1; } + +constexpr long double +operator"" q(long double n) // { dg-warning "shadowed by implementation" } +{ return 4 * (n + 2) + 2; } + +constexpr long double +operator"" Q(long double n) // { dg-warning "shadowed by implementation" } +{ return 4 * (n + 2) + 3; } + +int +main() +{ + auto ii = 1i; + auto Ii = 1I; + auto ji = 1j; + auto Ji = 1J; + + auto ifp = 1.0i; + auto Ifp = 1.0I; + auto jfp = 1.0j; + auto Jfp = 1.0J; + + auto kfp = 1.0k; // { dg-error "fixed-point types not supported" } + auto Kfp = 1.0K; // { dg-error "fixed-point types not supported" } + auto rfp = 1.0r; // { dg-error "fixed-point types not supported" } + auto Rfp = 1.0R; // { dg-error "fixed-point types not supported" } + + auto wfp = 1.0w; // { dg-error "unsupported" "" { target { ! has_w_floating_suffix } } } + auto Wfp = 1.0W; // { dg-error "unsupported" "" { target { ! has_w_floating_suffix } } } + auto qfp = 1.0q; // { dg-error "unsupported" "" { target { ! has_q_floating_suffix } } } + auto Qfp = 1.0Q; // { dg-error "unsupported" "" { target { ! has_q_floating_suffix } } } +} + +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 7 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 11 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 15 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 19 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 25 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 29 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 33 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 37 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 43 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 47 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 51 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 55 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 61 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 65 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 69 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 73 } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/std_fno-ext-numeric-literals.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/std_fno-ext-numeric-literals.C new file mode 100644 index 0000000..0b245f4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/std_fno-ext-numeric-literals.C @@ -0,0 +1,115 @@ +// { dg-do compile { target c++11 } } + + +// Integer imaginary... + +constexpr unsigned long long +operator"" i(unsigned long long n) +{ return 4 * n + 0; } + +constexpr unsigned long long +operator"" I(unsigned long long n) +{ return 4 * n + 1; } + +constexpr unsigned long long +operator"" j(unsigned long long n) +{ return 4 * n + 2; } + +constexpr unsigned long long +operator"" J(unsigned long long n) +{ return 4 * n + 3; } + +// Floating-point imaginary... + +constexpr long double +operator"" i(long double n) +{ return 4.0L * n + 0.0L; } + +constexpr long double +operator"" I(long double n) +{ return 4.0L * n + 1.0L; } + +constexpr long double +operator"" j(long double n) +{ return 4.0L * n + 2.0L; } + +constexpr long double +operator"" J(long double n) +{ return 4.0L * n + 3.0L; } + +// Fixed-point... + +constexpr long double +operator"" k(long double n) +{ return 4 * (n + 1) + 0; } + +constexpr long double +operator"" K(long double n) +{ return 4 * (n + 1) + 1; } + +constexpr long double +operator"" r(long double n) +{ return 4 * (n + 1) + 2; } + +constexpr long double +operator"" R(long double n) +{ return 4 * (n + 1) + 3; } + +// Machine-defined... + +constexpr long double +operator"" w(long double n) +{ return 4 * (n + 2) + 0; } + +constexpr long double +operator"" W(long double n) +{ return 4 * (n + 2) + 1; } + +constexpr long double +operator"" q(long double n) +{ return 4 * (n + 2) + 2; } + +constexpr long double +operator"" Q(long double n) +{ return 4 * (n + 2) + 3; } + +int +main() +{ + auto ii = 1i; + auto Ii = 1I; + auto ji = 1j; + auto Ji = 1J; + + auto ifp = 1.0i; + auto Ifp = 1.0I; + auto jfp = 1.0j; + auto Jfp = 1.0J; + + auto kfp = 1.0k; + auto Kfp = 1.0K; + auto rfp = 1.0r; + auto Rfp = 1.0R; + + auto wfp = 1.0w; + auto Wfp = 1.0W; + auto qfp = 1.0q; + auto Qfp = 1.0Q; +} + +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 7 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 11 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 15 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 19 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 25 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 29 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 33 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 37 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 43 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 47 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 51 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 55 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 61 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 65 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 69 } +// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 73 } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/stddef.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/stddef.C new file mode 100644 index 0000000..dad9200 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/stddef.C @@ -0,0 +1,6 @@ +// PR c++/54249 +// { dg-do compile { target c++11 } } + +#include <stddef.h> + +::nullptr_t n; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/stdint.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/stdint.C new file mode 100644 index 0000000..434d458 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/stdint.C @@ -0,0 +1,135 @@ +// PR c++/52764 +// { dg-require-effective-target stdint_types } +// { dg-do compile { target c++11 } } + +#include <stdint.h> + +#ifdef __INT8_TYPE__ +# if (!defined INT8_MAX \ + || !defined INT8_MIN) +# error +# endif +#endif +#ifdef __UINT8_TYPE__ +# if !defined UINT8_MAX +# error +# endif +#endif +#ifdef __INT16_TYPE__ +# if (!defined INT16_MAX \ + || !defined INT16_MIN) +# error +# endif +#endif +#ifdef __UINT16_TYPE__ +# if !defined UINT16_MAX +# error +# endif +#endif +#ifdef __INT32_TYPE__ +# if (!defined INT32_MAX \ + || !defined INT32_MIN) +# error +# endif +#endif +#ifdef __UINT32_TYPE__ +# if !defined UINT32_MAX +# error +# endif +#endif +#ifdef __INT64_TYPE__ +# if (!defined INT64_MAX \ + || !defined INT64_MIN) +# error +# endif +#endif +#ifdef __UINT64_TYPE__ +# if !defined UINT64_MAX +# error +# endif +#endif + +#if (!defined INT_LEAST8_MAX \ + || !defined INT_LEAST8_MIN \ + || !defined UINT_LEAST8_MAX \ + || !defined INT_LEAST16_MAX \ + || !defined INT_LEAST16_MIN \ + || !defined UINT_LEAST16_MAX \ + || !defined INT_LEAST32_MAX \ + || !defined INT_LEAST32_MIN \ + || !defined UINT_LEAST32_MAX \ + || !defined INT_LEAST64_MAX \ + || !defined INT_LEAST64_MIN \ + || !defined UINT_LEAST64_MAX) +#error +#endif + +#if (!defined INT_FAST8_MAX \ + || !defined INT_FAST8_MIN \ + || !defined UINT_FAST8_MAX \ + || !defined INT_FAST16_MAX \ + || !defined INT_FAST16_MIN \ + || !defined UINT_FAST16_MAX \ + || !defined INT_FAST32_MAX \ + || !defined INT_FAST32_MIN \ + || !defined UINT_FAST32_MAX \ + || !defined INT_FAST64_MAX \ + || !defined INT_FAST64_MIN \ + || !defined UINT_FAST64_MAX) +#error +#endif + +#ifdef __INTPTR_TYPE__ +# if (!defined INTPTR_MAX \ + || !defined INTPTR_MIN) +# error +# endif +#endif +#ifdef __UINTPTR_TYPE__ +# if !defined UINTPTR_MAX +# error +# endif +#endif + +#if (!defined INTMAX_MAX \ + || !defined INTMAX_MIN \ + || !defined UINTMAX_MAX) +#error +#endif + +#if (!defined PTRDIFF_MAX \ + || !defined PTRDIFF_MIN) +#error +#endif + +#if (!defined SIG_ATOMIC_MAX \ + || !defined SIG_ATOMIC_MIN) +#error +#endif + +#if !defined SIZE_MAX +#error +#endif + +#if (!defined WCHAR_MAX \ + || !defined WCHAR_MIN) +#error +#endif + +#if (!defined WINT_MAX \ + || !defined WINT_MIN) +#error +#endif + +#if (!defined INT8_C \ + || !defined INT16_C \ + || !defined INT32_C \ + || !defined INT64_C \ + || !defined UINT8_C \ + || !defined UINT16_C \ + || !defined UINT32_C \ + || !defined UINT64_C \ + || !defined INTMAX_C \ + || !defined UINTMAX_C) +#error +#endif diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/syntax-err1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/syntax-err1.C new file mode 100644 index 0000000..5f5a236 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/syntax-err1.C @@ -0,0 +1,8 @@ +// PR c++/47198 +// { dg-do compile { target c++11 } } + +struct S +{ + template < int > sometype foo (); // { dg-error "sometype. does not name a type" } + S () = default; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp-constructor-bug.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp-constructor-bug.C new file mode 100644 index 0000000..9d8a3bd --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp-constructor-bug.C @@ -0,0 +1,16 @@ +// { dg-do compile { target c++11 } } +// { dg-options "" } + +struct S { }; + +struct T +{ + S s; +}; + +void f(T const &); + +void g() +{ + f((T){S()}); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp-va-arg-bug.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp-va-arg-bug.C new file mode 100644 index 0000000..616f2f4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp-va-arg-bug.C @@ -0,0 +1,11 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-Wno-abi" { target arm_eabi } } +#include <stdarg.h> + +struct S { }; +void f(S const &); + +void g(va_list args) +{ + f(va_arg(args, S)); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default1.C new file mode 100644 index 0000000..33f6c9e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default1.C @@ -0,0 +1,32 @@ +// { dg-do compile { target c++11 } } + +template<typename T, typename U> +struct is_same +{ + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> { + static const bool value = true; +}; + +template<typename T = int> void f() +{ + static_assert(is_same<T, int>::value, + "T can only be instantiated with an int"); +} + +template<typename T = int, typename U> +void f(U) +{ + static_assert(is_same<T, int>::value, + "T can only be instantiated with an int"); +} + +void g() +{ + float pi = 3.14159; + f(); + f(pi); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default2.C new file mode 100644 index 0000000..2a41e22 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default2.C @@ -0,0 +1,14 @@ +// { dg-do compile { target c++11 } } + +template <class T, class U = double> +void f(T t = 0, U u = 0); // { dg-message "note" } + +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|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-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default3.C new file mode 100644 index 0000000..2d59f47 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default3.C @@ -0,0 +1,16 @@ +// { dg-do compile { target c++11 } } + +template<typename T, typename U = typename T::value_type> +void f(T); + +void f(...); + +struct X { + typedef int value_type; +}; + +void g() +{ + f(X()); // okay + f(17); // okay? +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default4.C new file mode 100644 index 0000000..783ff5b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default4.C @@ -0,0 +1,11 @@ +// { dg-do compile { target c++11 } } + +class X { + template<typename T = int> friend void f(X) { } + template<typename T> friend void g(X); // { dg-message "previously declared here" } + template<typename T = int> friend void h(X); // { dg-error "function template friend" } +}; + +template<typename T = int> void g(X) // { dg-error "default template argument" } +{ +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default5.C new file mode 100644 index 0000000..dd84d26 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/temp_default5.C @@ -0,0 +1,13 @@ +// { dg-do compile { target c++11 } } + +template <class Z = void, class T> +void Foo(T) +{ + struct X {}; +} + +template <class T = int, typename U> +void f(const U&) +{ + auto g = [] () {}; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/template_deduction.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/template_deduction.C new file mode 100644 index 0000000..1186e80 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/template_deduction.C @@ -0,0 +1,67 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test the "Augmented" template argument deduction when binding an lvalue to an rvalue reference. + +// { dg-do compile { target c++11 } } + +template <bool> struct sa; +template <> struct sa<true> {}; + +template <class T, T v> +struct integral_constant +{ + static const T value = v; + typedef T value_type; + typedef integral_constant<T, v> type; +}; + +typedef integral_constant<bool, true> true_type; +typedef integral_constant<bool, false> false_type; + +template <class T> struct is_lvalue_reference : public integral_constant<bool, false> {}; +template <class T> struct is_lvalue_reference<T&> : public integral_constant<bool, true> {}; + +template <class T> struct is_rvalue_reference : public integral_constant<bool, false> {}; +template <class T> struct is_rvalue_reference<T&&> : public integral_constant<bool, true> {}; + +template <bool is_lvalue_ref, bool is_rvalue_ref, class T> +void +test1(T&&) +{ + sa<is_lvalue_reference<T&&>::value == is_lvalue_ref> t1; + sa<is_rvalue_reference<T&&>::value == is_rvalue_ref> t2; +} + +template <bool is_lvalue_ref, bool is_rvalue_ref, class T> +void +test2(const T&&) // { dg-message "argument" } +{ + sa<is_lvalue_reference<const T&&>::value == is_lvalue_ref> t1; + sa<is_rvalue_reference<const T&&>::value == is_rvalue_ref> t2; +} + +template <bool is_lvalue_ref, bool is_rvalue_ref, class T> +void +test3(T*&&) +{ + sa<is_lvalue_reference<T*&&>::value == is_lvalue_ref> t1; + sa<is_rvalue_reference<T*&&>::value == is_rvalue_ref> t2; +} + +struct A {}; + +A a; + +A source() {return A();} +A* sourcep() {return 0;} + +int main() +{ + test1<true, false>(a); + test1<false, true>(source()); + test2<false, true>(a); // { dg-error "lvalue" } + test2<false, true>(source()); + test3<false, true>(&a); + test3<false, true>(sourcep()); + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing1.C new file mode 100644 index 0000000..7d9a906 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing1.C @@ -0,0 +1,118 @@ +// Tests for late-specified return type. +// { dg-do compile { target c++11 } } +// { dg-options "-fabi-version=5" } + +auto f() -> int +{ + return 0; +} + +template<class T, class U> +auto add(T t, U u) -> decltype (t+u) +{ + return t+u; +} + +template<class T, class U> +decltype(T()+U()) add2(T t, U u) +{ + return t+u; +} + +template <class T, class U> +U ag (T, U) +{ + return U(); +} + +template<class T, class U> +auto add3(T t, U u) -> decltype (ag(t,u)) +{ + return ag(t,u); +} + +template<class T, class U> +decltype(*(T*)0+*(U*)0) add4(T t, U u) +{ + return t+u; +} + +template <class T> +struct A +{ + T f() {} + template <class U> + T g() {} + template <class V> + struct B + { + int MEM; + }; +}; + +template <class T> +auto f(T* t) -> decltype (t->f()) +{ + return t->f(); +} + +template <class T> +auto g(T t) -> decltype (t.f()) +{ + return t.f(); +} + +template <class T, class U> +auto h(T t, U u) -> decltype (t.template g<U>()) +{ + return t.template g<U>(); +} + +struct D { }; +struct C: public A<int>::B<D> +{ +}; + +template <class T, class U, class V> +auto k(T t, U u, V v) -> decltype (t.U::template B<V>::MEM) +{ + return t.U::template B<V>::MEM; +} + +template <class T> +auto l(T t) -> decltype (t) +{ + return t; +} + +template <class T, T u> +auto m(T t) -> decltype (u) +{ + return t; +} + +A<int> a, *p; + +int main() +{ + // { dg-final { scan-assembler "_Z3addIidEDTplfp_fp0_ET_T0_" } } + auto i = add(1, 2.0); + // { dg-final { scan-assembler "_Z4add4IidEDTpldecvPT_Li0EdecvPT0_Li0EES0_S2_" } } + auto i4 = add4(1, 2.0); + // { dg-final { scan-assembler "_Z4add2IidEDTplcvT__EcvT0__EES0_S1_" } } + auto i2 = add2(1, 2.0); + // { dg-final { scan-assembler "_Z4add3IidEDTcl2agfp_fp0_EET_T0_" } } + auto i3 = add3(1, 2.0); + // { dg-final { scan-assembler "_Z1fI1AIiEEDTclptfp_1fEEPT_" } } + f(p); + // { dg-final { scan-assembler "_Z1gI1AIiEEDTcldtfp_1fEET_" } } + g(a); + // { dg-final { scan-assembler "_Z1hI1AIiEdEDTcldtfp_1gIT0_EEET_S2_" } } + h(a,1.0); + // { dg-final { scan-assembler "_Z1kI1C1AIiE1DEDtdtfp_srNT0_1BIT1_EE3MEMET_S4_S6_" } } + k( C(), A<int>(), D() ); + // { dg-final { scan-assembler "_Z1lIiEDtfp_ET_" } } + l(1); + // { dg-final { scan-assembler "_Z1mIiLi1EEDtT0_ET_" } } + m<int,1>(1); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing2.C new file mode 100644 index 0000000..888d6f9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing2.C @@ -0,0 +1,16 @@ +// PR c++/37967 +// Negative test for auto +// { dg-do compile { target c++11 } } + +auto f1 () -> int; +auto f2 (); // { dg-error "without trailing return type" "" { target { ! c++1y } } } +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 trailing return type" "" { target { ! c++1y } } } + int f7 () -> int; // { dg-error "trailing return type" } + auto *f8 () -> int; // { dg-error "trailing return type" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing3.C new file mode 100644 index 0000000..ced5d5e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing3.C @@ -0,0 +1,64 @@ +// More auto/decltype mangling tests. +// { dg-do compile { target c++11 } } +// { dg-options "-fabi-version=0" } + +template <class T> +struct B +{ + static int i; +}; + +int&& x(); + +template <class T> +struct A +{ + static int i; + static int &ir; + static int &&irr; + template <class U> + auto f(U u) -> decltype (u + i); + template <class U> + auto fr(U u) -> decltype (u + ir); + template <class U> + auto frr(U u) -> decltype (u + irr); + template <class U> + auto g(U u) -> decltype (u + sizeof (i)); + template <class U> + auto h(U u) -> decltype (u + B<U>::i); + template <class U> + auto j(U u) -> decltype (u + x()); +}; + +template<class T> template<class U> +auto A<T>::f(U u) -> decltype (u + i) +{ + return u + i; +} + +template <class... Args> +int f (Args... args); + +template <class... Args> +auto g (Args... args) -> decltype (f ((args+1)...)) +{ + return (f ((args+1)...)); +} + +int main() +{ + // { dg-final { scan-assembler "_ZN1AIiE1fIiEEDTplfp_L_ZNS0_1iEEET_" } } + A<int>().f(1); + // { dg-final { scan-assembler "_ZN1AIiE2frIiEEDTplfp_L_ZNS0_2irEEET_" } } + A<int>().fr(1); + // { dg-final { scan-assembler "_ZN1AIiE3frrIiEEDTplfp_L_ZNS0_3irrEEET_" } } + A<int>().frr(1); + // { dg-final { scan-assembler "_ZN1AIiE1gIiEEDTplfp_szL_ZNS0_1iEEET_" } } + A<int>().g(1); + // { dg-final { scan-assembler "_ZN1AIiE1hIiEEDTplfp_sr1BIT_E1iES3_" } } + A<int>().h(1); + // { dg-final { scan-assembler "_ZN1AIiE1jIiEEDTplfp_clL_Z1xvEEET_" } } + A<int>().j(1); + // { dg-final { scan-assembler "_Z1gIJidEEDTcl1fspplfp_Li1EEEDpT_" } } + g(42, 1.0); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing4.C new file mode 100644 index 0000000..0ca96e4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing4.C @@ -0,0 +1,12 @@ +// PR c++/38597 +// { dg-do compile { target c++11 } } + +template<class T, class U> +auto f(T,U) -> decltype(T() + U()) +{ return T() + U(); } + +template<class T> void g(T){} // { dg-message "note" } + +int main() { g(f); } // { dg-error "no matching function" } +// { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 10 } + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing5.C new file mode 100644 index 0000000..48f3145 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing5.C @@ -0,0 +1,10 @@ +// PR c++/38798, DR 770 +// { dg-do compile { target c++11 } } + +struct A {}; +auto foo() -> struct A {} + +enum B {}; +auto bar() -> enum B {} + +auto baz() -> struct C {} {} // { dg-error "" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing6.C new file mode 100644 index 0000000..0238740 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing6.C @@ -0,0 +1,6 @@ +// PR c++/49003 +// { dg-do compile { target c++11 } } + +struct A { + auto a() const -> decltype(this) { return this; } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing7.C new file mode 100644 index 0000000..b3397ea --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing7.C @@ -0,0 +1,14 @@ +// PR c++/50365 +// { dg-do compile { target c++11 } } + +struct A { int i; }; + +struct B { + B(); + A* f(); +}; + +B::B() +{ + int(f()->i); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing8.C new file mode 100644 index 0000000..304845e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing8.C @@ -0,0 +1,25 @@ +// PR c++/54359 +// { dg-require-effective-target c++11 } + +int& ref(int& x) { return x; } +const int& ref(const int& x) { return x; } + +class A { + int x; + int f() const; + auto test1() const -> decltype(this); + auto test2() const -> decltype(ref(x)); + auto test3() const -> decltype(f()); +}; + +auto A::test1() const -> decltype(this) { + return this; +} + +auto A::test2() const -> decltype(ref(x)) { + return ref(x); +} + +auto A::test3() const -> decltype(f()) { + return f(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trailing9.C new file mode 100644 index 0000000..d7895b3 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/traits1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/traits1.C new file mode 100644 index 0000000..9085b71 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/traits1.C @@ -0,0 +1,133 @@ +// PR c++/57016 +// { dg-require-effective-target c++11 } + +template < typename _Tp, _Tp __v > struct integral_constant +{ + static constexpr _Tp value = __v; +}; +template < bool, typename, typename > struct conditional; +template < typename ... >struct __and_; +template + < + typename + _B1, + typename + _B2 > struct __and_ <_B1, _B2 >:conditional < _B1::value, _B2, _B1 >::type +{}; +template < typename _Pp > struct __not_:integral_constant < bool, _Pp::value > +{}; +template < typename > struct add_rvalue_reference; +template + < typename _Tp > typename add_rvalue_reference < _Tp >::type declval (); +template < bool, typename _Iftrue, typename > struct conditional +{ + typedef _Iftrue type; +}; +template < class, class > struct pair; +template < typename > class allocator; +template < typename, typename, typename > struct binary_function; +template < typename _Tp > struct equal_to:binary_function < _Tp, _Tp, bool > +{}; +template < typename > struct hash; +template < >struct hash <int > +{}; +template + < + typename, + typename, + typename, + typename, typename, typename, typename, typename > struct _Hashtable_base; +template + < + typename, + typename + > struct __is_noexcept_hash:integral_constant < bool, noexcept ((declval)) > +{} +; +struct _Identity; +template < bool, bool _Constant_iterators, bool > struct _Hashtable_traits + ; +struct _Mod_range_hashing; +struct _Default_ranged_hash; +struct _Prime_rehash_policy; +template + < + typename + _Tp, + typename + _Hash + > + using + __cache_default + = + __not_ + < + __and_ + < + integral_constant + < bool, __is_final (_Hash) >, __is_noexcept_hash < _Tp, _Hash > >>; +template < typename _Key, typename _Value, typename, typename _ExtractKey, typename _Equal, typename _H1, typename _H2, typename, typename _RehashPolicy, typename _Traits > class _Hashtable: +_Hashtable_base + < _Key, _Value, _ExtractKey, _Equal, _H1, _H2, _RehashPolicy, _Traits > +{} +; +template + < + bool + _Cache > using __uset_traits = _Hashtable_traits < _Cache, true, true >; +template + < + typename + _Value, + typename + _Hash + = + hash + < + _Value + >, + typename + _Pred + = + equal_to + < + _Value + >, + typename + _Alloc + = + allocator + < + _Value + >, + typename + _Tr + = + __uset_traits + < + __cache_default + < + _Value, + _Hash + >::value + > + > + using + __uset_hashtable + = + _Hashtable + < + _Value, + _Value, + _Alloc, + _Identity, + _Pred, + _Hash, + _Mod_range_hashing, _Default_ranged_hash, _Prime_rehash_policy, _Tr >; +template < class _Value, class = hash < _Value > >class unordered_set +{ + typedef __uset_hashtable < _Value > iterator; + template < typename > pair < iterator, bool > emplace (); +} +; +template class unordered_set < int >; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trivial1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trivial1.C new file mode 100644 index 0000000..3fed570 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/trivial1.C @@ -0,0 +1,86 @@ +// { dg-do compile { target c++11 } } + +// [basic.types]/10: +// Scalar types, trivial class types (Clause 9), arrays of such types and +// cv-qualified versions of these types (3.9.3) are collectively called +// trivial types. + +// [class]/6: +// A trivially copyable class is a class that: +// * has no non-trivial copy constructors (12.8), +// * has no non-trivial copy assignment operators (13.5.3, 12.8), and +// * has a trivial destructor (12.4). +// A trivial class is a class that has a trivial default constructor (12.1) +// and is trivially copyable. + +#include <type_traits> + +#define TRY(expr) static_assert (expr, #expr) +#define YES(type) TRY(std::is_trivial<type>::value); \ + TRY(std::is_trivial<type[]>::value); \ + TRY(std::is_trivial<const volatile type>::value) +#define NO(type) TRY(!std::is_trivial<type>::value); \ + TRY(!std::is_trivial<type[]>::value); \ + TRY(!std::is_trivial<const volatile type>::value) + +struct A; + +YES(int); +YES(__complex int); +YES(void *); +YES(int A::*); +typedef int (A::*pmf)(); +YES(pmf); + +struct A { ~A(); }; +NO(A); +struct F: public A { int i; }; +NO(F); +struct G: public A { A a; }; +NO(G); +struct M { A a; }; +NO(M); + +class B +{ + int i; + __complex int c; + void *p; + double ar[4]; + int A::* pm; + int (A::*pmf)(); +}; +YES(B); +struct D: public B { }; +YES(D); +struct E: public B { int q; }; +YES(E); +struct D2: public B { }; +YES(D2); +struct I: public D, public D2 { }; +YES(I); + +struct C +{ + int i; +private: + int j; +}; +YES(C); +struct H: public C { }; +YES(H); +struct N { C c; }; +YES(N); + +struct J { virtual void f(); }; +struct J2: J { }; +NO(J); +NO(J2); +struct K { }; +struct L: virtual K {}; +YES(K); +NO(L); + +// PR c++/41421 +struct O { O(int); }; +NO(O); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-addr.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-addr.C new file mode 100644 index 0000000..11389bf --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-addr.C @@ -0,0 +1,10 @@ +// { dg-do compile { target c++11 } } + +#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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-args-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-args-neg.C new file mode 100644 index 0000000..d8d672e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-args-neg.C @@ -0,0 +1,41 @@ +// { dg-do compile { target c++11 } } + +#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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-args.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-args.C new file mode 100644 index 0000000..4680288 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-args.C @@ -0,0 +1,38 @@ +// { dg-do compile { target c++11 } } + +#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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-args2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-args2.C new file mode 100644 index 0000000..b9cb8e0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-args2.C @@ -0,0 +1,14 @@ +// PR c++/52521 +// { dg-do compile { target 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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-clink-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-clink-neg.C new file mode 100644 index 0000000..87e0082 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-clink-neg.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } + +extern "C" { + +int +operator"" _badclinkage(unsigned long long); // { dg-error "operator with C linkage" } + +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-concat-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-concat-neg.C new file mode 100644 index 0000000..3093a7c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-concat-neg.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +#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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-concat.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-concat.C new file mode 100644 index 0000000..d4f10c2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-concat.C @@ -0,0 +1,24 @@ +// { dg-do compile { target c++11 } } + +#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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-constexpr.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-constexpr.C new file mode 100644 index 0000000..4c2f7ed --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-constexpr.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } + +constexpr unsigned long long +operator"" _grow(unsigned long long n) +{ return 2 * n; } + +double buffer[25_grow]; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-cpp98-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-cpp98-neg.C new file mode 100644 index 0000000..cb4c359 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-declare-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-declare-neg.C new file mode 100644 index 0000000..a68e2e0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-declare-neg.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } + +// 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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-embed-quote.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-embed-quote.C new file mode 100644 index 0000000..fef1a53 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-embed-quote.C @@ -0,0 +1,33 @@ +// { dg-do run { target c++11 } } + +// 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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-friend.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-friend.C new file mode 100644 index 0000000..54d7b7a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-friend.C @@ -0,0 +1,28 @@ +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-general.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-general.C new file mode 100644 index 0000000..d69db56 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-general.C @@ -0,0 +1,51 @@ +// { dg-do run { target c++11 } } + +// 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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-implicit-conv-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-implicit-conv-neg.C new file mode 100644 index 0000000..ea6095d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-implicit-conv-neg.C @@ -0,0 +1,63 @@ +// { dg-do compile { target c++11 } } + +#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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-inline.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-inline.C new file mode 100644 index 0000000..fd8b9a0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-inline.C @@ -0,0 +1,22 @@ +// { dg-do compile { target c++11 } } + +// 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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-linkage-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-linkage-neg.C new file mode 100644 index 0000000..3e99807 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-linkage-neg.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } + +extern "C"_badlinkage { // { dg-error "expected unqualified-id before" } + +int foo(); + +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-mangle.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-mangle.C new file mode 100644 index 0000000..8840dcd --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-mangle.C @@ -0,0 +1,8 @@ +// PR c++/52521 +// { dg-do compile { target c++11 } } +// { dg-final { scan-assembler "_Zli2_wPKc" } } + +int operator "" _w(const char*); +int main() { + 123_w; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-member-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-member-neg.C new file mode 100644 index 0000000..2a31452 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-member-neg.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-namespace.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-namespace.C new file mode 100644 index 0000000..7329890 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-namespace.C @@ -0,0 +1,42 @@ +// { dg-do run { target c++11 } } + +// 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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nofunc-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nofunc-neg.C new file mode 100644 index 0000000..89c7581 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nofunc-neg.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +// 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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nonempty-str-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nonempty-str-neg.C new file mode 100644 index 0000000..ddaa1aa6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nonempty-str-neg.C @@ -0,0 +1,6 @@ +// { dg-do compile { target c++11 } } + +// 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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nospace-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nospace-neg.C new file mode 100644 index 0000000..d1f3238 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nospace-neg.C @@ -0,0 +1,5 @@ +// { dg-do compile { target c++11 } } + +float operator ""_abc(const char*); + +int operator""_def(long double); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nosuffix-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nosuffix-neg.C new file mode 100644 index 0000000..790726f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nosuffix-neg.C @@ -0,0 +1,5 @@ +// { dg-do compile { target c++11 } } + +char32_t +operator"" (char32_t C) // { dg-error "expected suffix identifier" } +{ return C; } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nounder-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nounder-neg.C new file mode 100644 index 0000000..9120ae4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-nounder-neg.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +// 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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-operator-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-operator-neg.C new file mode 100644 index 0000000..d71f4a2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-operator-neg.C @@ -0,0 +1,42 @@ +// { dg-do compile { target c++11 } } + +// 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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-overflow-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-overflow-neg.C new file mode 100644 index 0000000..d7e5e4b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-overflow-neg.C @@ -0,0 +1,18 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-Woverflow" } +// PR c++/52654 +int +operator"" _w(unsigned long long) +{ return 0; } + +int +operator"" _w(long double) +{ return 0.0L; } + +int i = 12345678901234567890123456789012345678901234567890_w; +int j = 12345678901234567890123456789.012345678901234567890e+1234567890_w; +int k = 12345678901234567890123456789.012345678901234567890e-1234567890_w; + +// { dg-warning "integer literal exceeds range of " "" { target *-*-* } 12 } +// { dg-warning "floating literal exceeds range of " "" { target *-*-* } 13 } +// { dg-warning "floating literal truncated to zero" "" { target *-*-* } 14 } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-overflow.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-overflow.C new file mode 100644 index 0000000..057978c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-overflow.C @@ -0,0 +1,19 @@ +// { dg-do compile { target c++11 } } +// PR c++/52654
+
+int
+operator"" _w(const char*)
+{ return 0; }
+
+template<char...>
+ int
+ operator"" _tw()
+ { return 0; }
+
+int i = 12345678901234567890123456789012345678901234567890_w;
+int j = 12345678901234567890123456789.012345678901234567890e+1234567890_w;
+int k = 12345678901234567890123456789.012345678901234567890e-1234567890_w;
+
+int ti = 12345678901234567890123456789012345678901234567890_tw;
+int tj = 12345678901234567890123456789.012345678901234567890e+1234567890_tw;
+int tk = 12345678901234567890123456789.012345678901234567890e-1234567890_tw;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-preproc-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-preproc-neg.C new file mode 100644 index 0000000..64b6f82 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-preproc-neg.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-raw-length.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-raw-length.C new file mode 100644 index 0000000..8969c96 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-raw-length.C @@ -0,0 +1,27 @@ +// { dg-do compile { target c++11 } } +// 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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-raw-op-string-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-raw-op-string-neg.C new file mode 100644 index 0000000..be68333 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-raw-op-string-neg.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } + +// 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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-raw-op.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-raw-op.C new file mode 100644 index 0000000..c3259ed --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-raw-op.C @@ -0,0 +1,20 @@ +// { dg-do run { target c++11 } } + +#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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-raw-str.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-raw-str.C new file mode 100644 index 0000000..7ca37b2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-raw-str.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } + +#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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-resolve.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-resolve.C new file mode 100644 index 0000000..4241d0a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-resolve.C @@ -0,0 +1,39 @@ +// { dg-do run { target c++11 } } + +#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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-shadow-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-shadow-neg.C new file mode 100644 index 0000000..c635590 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-shadow-neg.C @@ -0,0 +1,49 @@ +// { dg-do compile { target c++11 } } + +// 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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-string-length.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-string-length.C new file mode 100644 index 0000000..acfda45 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-string-length.C @@ -0,0 +1,46 @@ +// { dg-do compile { target c++11 } } +// 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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.C new file mode 100644 index 0000000..734a0f3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.C @@ -0,0 +1,13 @@ +// { dg-do compile { target c++11 } } +// { dg-require-effective-target stdint_types } +// PR c++/55582 + +#include "udlit-string-literal.h" + +using namespace my_string_literals; + +decltype("Hello, World!"s) s; +decltype(u8"Hello, World!"s) s8; +decltype(L"Hello, World!"s) ws; +decltype(u"Hello, World!"s) s16; +decltype(U"Hello, World!"s) s32; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.h b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.h new file mode 100644 index 0000000..e61034e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.h @@ -0,0 +1,22 @@ +#pragma GCC system_header + +#include <string> + +inline namespace my_string_literals +{ + std::string + operator"" s(const char* str, std::size_t len) + { return std::string{str, len}; } + + std::wstring + operator"" s(const wchar_t* str, std::size_t len) + { return std::wstring{str, len}; } + + std::u16string + operator"" s(const char16_t* str, std::size_t len) + { return std::u16string{str, len}; } + + std::u32string + operator"" s(const char32_t* str, std::size_t len) + { return std::u32string{str, len}; } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-suffix-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-suffix-neg.C new file mode 100644 index 0000000..7283fed --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-suffix-neg.C @@ -0,0 +1,5 @@ +// { dg-do compile { target c++11 } } + +#include <string> + +std::string operator"" 5X(const char*, std::size_t); // { dg-error "expected suffix identifier" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-systemheader.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-systemheader.C new file mode 100644 index 0000000..189e445 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-systemheader.C @@ -0,0 +1,3 @@ +// { dg-do compile { target c++11 } } + +#include "udlit_system_header" diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-template.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-template.C new file mode 100644 index 0000000..de21b66 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-template.C @@ -0,0 +1,50 @@ +// { dg-do run { target c++11 } } + +// 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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg-neg.C new file mode 100644 index 0000000..678a53e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg-neg.C @@ -0,0 +1,4 @@ +// { dg-do compile { target c++11 } } + +template<char...> + int operator"" _xyz(unsigned long long); // { dg-error "has invalid argument list" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg.C new file mode 100644 index 0000000..cec79a5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg.C @@ -0,0 +1,4 @@ +// { dg-do compile { target c++11 } } + +template<char...> + int operator"" _abc(); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms-neg.C new file mode 100644 index 0000000..f681ecf --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms-neg.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms.C new file mode 100644 index 0000000..bc7eaf6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms.C @@ -0,0 +1,6 @@ +// { dg-do compile { target c++11 } } + +class Foo { }; + +template<char...> + Foo operator"" _Foo(); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit_system_header b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/udlit_system_header new file mode 100644 index 0000000..d541f24 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/union1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union1.C new file mode 100644 index 0000000..ff415fc --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union1.C @@ -0,0 +1,34 @@ +// Negative test for C++11 unrestricted unions +// { dg-do compile { target c++11 } } +// { dg-prune-output "implicitly deleted because" } + +struct A +{ + A(); + A(const A&); + ~A(); +}; + +union B +{ + A a; // { dg-error "union member" } +}; + +B b; // { dg-error "B::B\\(\\)" "B::B" } +B b2(b); // { dg-error "B::B\\(const B&\\)" "B::B" } + +struct C +{ + union + { + A a; // { dg-error "union member" } + }; +}; + +C c; // { dg-error "C::C\\(\\)" "C::C" } +C c2(c); // { dg-error "C::C\\(const C&\\)" "C::C" } + +// { 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-4.9/gcc/testsuite/g++.dg/cpp0x/union2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union2.C new file mode 100644 index 0000000..5144094 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union2.C @@ -0,0 +1,34 @@ +// Positive test for C++11 unrestricted unions +// { dg-do compile { target c++11 } } + +struct A +{ + A(); + A(const A&); + ~A(); +}; + +union B +{ + A a; + B(); + B(const B&); + ~B(); +}; + +B b; +B b2(b); + +struct C +{ + union + { + A a; + }; + C(); + C(const C&); + ~C(); +}; + +C c; +C c2(c); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union3.C new file mode 100644 index 0000000..d95d30c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union3.C @@ -0,0 +1,68 @@ +// Runtime test for C++11 unrestricted unions +// { dg-do run { target c++11 } } + +int c, d; +struct A +{ + int i; + A(): i(1) { ++c; } + A(const A&): i(2) { ++c; } + ~A() { ++d; } +}; + +union B +{ + A a; + B() { } + B(const B& b) { } + ~B() { } +}; + +struct C +{ + union { A a; }; + C() { } + C(const C&) { } + ~C() { } +}; + +union D +{ + A a; + D(): a() { } + D(const D& d): a(d.a) { } + ~D() { a.~A(); } +}; + +struct E +{ + union { A a; }; + E(): a() { } + E(const E& e): a (e.a) { } + ~E() { a.~A(); } +}; + +int main() +{ + { + B b1; + B b2(b1); + + C c1; + C c2(c1); + } + + if (c != 0 || d != 0) + return c+d*10; + + { + D d1; + D d2(d1); + + E e1; + E e2(e1); + } + + if (c != 4 || d != 4) + return c*100+d*1000; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union4.C new file mode 100644 index 0000000..cf9916d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union4.C @@ -0,0 +1,17 @@ +// PR c++/48537 +// { dg-do compile { target c++11 } } + +struct SFoo +{ + SFoo() =delete; // { dg-message "declared" } +}; + +union UFoo // { dg-error "deleted" } +{ + SFoo foo; +}; + +int main() +{ + UFoo(); // { dg-error "deleted" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union5.C new file mode 100644 index 0000000..8d2bc98 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/union5.C @@ -0,0 +1,24 @@ +// PR c++/49803 +// { dg-do compile { target c++11 } } +// { dg-options "" } + +struct X +{ + X() = delete; +}; + +union Y +{ + // N3291=11-0061 12.6.2/8 says no initialization of + // of other variant members (i.e. m_x) should + // be performed. + Y() : m_char1{ } + { } + + struct + { + char m_char1; + }; + + X m_x; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/unnamed_refs.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/unnamed_refs.C new file mode 100644 index 0000000..c1b94bb --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/unnamed_refs.C @@ -0,0 +1,34 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test: Unamed rvalue references are treated as lvalues. + +// { dg-do compile { target c++11 } } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {long x[1];}; +struct two {long x[2];}; + +struct A {}; + +one foo(const A&) {return one();} +two foo(A&&) {return two();} + +template<typename _Tp> +inline _Tp&& +movel(_Tp& __t) +{ return static_cast<_Tp&&>(__t); } + +A&& source() {static A a; return movel(a);} + +int test1() +{ + sa<sizeof(foo(source())) == 2 * sizeof(long)> t1; + return 0; +} + +int main() +{ + return test1(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-104.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-104.C new file mode 100644 index 0000000..50956d2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-104.C @@ -0,0 +1,16 @@ +// PR c++/45236 +// { dg-do compile { target c++11 } } + +template <class T, class S> class foo; + +template<template<int...> class C, int... II, class S> +struct foo<C<II...>,S> +{ + template <class U> + struct bar { typedef int type; }; +}; + +template <int... I> +struct A {}; + +foo<A<3>, float>::bar<int> x; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-bind.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-bind.C new file mode 100644 index 0000000..74e01ec --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-bind.C @@ -0,0 +1,475 @@ +// { dg-do run { target c++11 } } +// A basic implementation of TR1's bind using variadic teplates +// Contributed by Douglas Gregor <doug.gregor@gmail.com> +#include <cassert> + +// Trivial reference_wrapper +template<typename T> +struct reference_wrapper +{ + reference_wrapper(T& x) : ptr(&x) { } + + operator T&() const { return *ptr; } + + T& get() const { return *ptr; } + + T* ptr; +}; + +template<typename T> reference_wrapper<T> ref(T& x) { return x; } +template<typename T> reference_wrapper<const T> cref(const T& x) { return x; } + +// Simple type-traits we'll need +template<typename T> +struct add_reference +{ + typedef T& type; +}; + +template<typename T> +struct add_reference<T&> +{ + typedef T& type; +}; + +template<typename T, typename U> +struct is_same +{ + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> +{ + static const bool value = true; +}; + +// For creating the constructor parameters of tuple<> +template<typename T> +struct add_const_reference +{ + typedef const T& type; +}; + +template<typename T> +struct add_const_reference<T&> +{ + typedef T& type; +}; + +// 6.1.3 Class template tuple: Needed for bind() implementation +template<typename... Values> +class tuple; + +template<> class tuple<> { }; + +template<typename Head, typename... Tail> +class tuple<Head, Tail...> + : private tuple<Tail...> +{ + typedef tuple<Tail...> inherited; + + public: + tuple() { } + + // implicit copy-constructor is okay + + tuple(typename add_const_reference<Head>::type v, + typename add_const_reference<Tail>::type... vtail) + : m_head(v), inherited(vtail...) { } + + template<typename... VValues> + tuple(const tuple<VValues...>& other) + : m_head(other.head()), inherited(other.tail()) { } + + template<typename... VValues> + tuple& operator=(const tuple<VValues...>& other) + { + m_head = other.head(); + tail() = other.tail(); + return *this; + } + + typename add_reference<Head>::type head() { return m_head; } + typename add_reference<const Head>::type head() const { return m_head; } + inherited& tail() { return *this; } + const inherited& tail() const { return *this; } + + protected: + Head m_head; +}; + +template<typename T> +struct make_tuple_result +{ + typedef T type; +}; + +template<typename T> +struct make_tuple_result<reference_wrapper<T> > +{ + typedef T& type; +}; + +// 6.1.3.2 Tuple creation functions +struct ignore_t { + template<typename T> ignore_t& operator=(const T&) { return *this; } +} ignore; + +template<typename... Values> +tuple<typename make_tuple_result<Values>::type...> +make_tuple(const Values&... values) +{ + return tuple<typename make_tuple_result<Values>::type...>(values...); +} + +template<typename... Values> +tuple<Values&...> tie(Values&... values) +{ + return tuple<Values&...>(values...); +} + +// 6.1.3.3 Tuple helper classes +template<typename Tuple> +struct tuple_size; + +template<> +struct tuple_size<tuple<> > +{ + static const __SIZE_TYPE__ value = 0; +}; + +template<typename Head, typename... Tail> +struct tuple_size<tuple<Head, Tail...> > +{ + static const __SIZE_TYPE__ value = 1 + tuple_size<tuple<Tail...> >::value; +}; + +template<int I, typename Tuple> +struct tuple_element; + +template<int I, typename Head, typename... Tail> +struct tuple_element<I, tuple<Head, Tail...> > +{ + typedef typename tuple_element<I-1, tuple<Tail...> >::type type; +}; + +template<typename Head, typename... Tail> +struct tuple_element<0, tuple<Head, Tail...> > +{ + typedef Head type; +}; + +// 6.1.3.4 Element access +template<int I, typename Tuple> +class get_impl; + +template<int I, typename Head, typename... Values> +class get_impl<I, tuple<Head, Values...> > +{ + typedef typename tuple_element<I-1, tuple<Values...> >::type Element; + typedef typename add_reference<Element>::type RJ; + typedef typename add_const_reference<Element>::type PJ; + typedef get_impl<I-1, tuple<Values...> > Next; + + public: + static RJ get(tuple<Head, Values...>& t) + { return Next::get(t.tail()); } + + static PJ get(const tuple<Head, Values...>& t) + { return Next::get(t.tail()); } +}; + +template<typename Head, typename... Values> +class get_impl<0, tuple<Head, Values...> > +{ + typedef typename add_reference<Head>::type RJ; + typedef typename add_const_reference<Head>::type PJ; + + public: + static RJ get(tuple<Head, Values...>& t) { return t.head(); } + static PJ get(const tuple<Head, Values...>& t) { return t.head(); } +}; + +template<int I, typename... Values> +typename add_reference< + typename tuple_element<I, tuple<Values...> >::type + >::type +get(tuple<Values...>& t) +{ + return get_impl<I, tuple<Values...> >::get(t); +} + +template<int I, typename... Values> +typename add_const_reference< + typename tuple_element<I, tuple<Values...> >::type + >::type +get(const tuple<Values...>& t) +{ + return get_impl<I, tuple<Values...> >::get(t); +} + +// 6.1.3.5 Relational operators +inline bool operator==(const tuple<>&, const tuple<>&) { return true; } + +template<typename T, typename... TTail, typename U, typename... UTail> +bool operator==(const tuple<T, TTail...>& t, const tuple<U, UTail...>& u) +{ + return t.head() == u.head() && t.tail() == u.tail(); +} + +template<typename... TValues, typename... UValues> +bool operator!=(const tuple<TValues...>& t, const tuple<UValues...>& u) +{ + return !(t == u); +} + +inline bool operator<(const tuple<>&, const tuple<>&) { return false; } + +template<typename T, typename... TTail, typename U, typename... UTail> +bool operator<(const tuple<T, TTail...>& t, const tuple<U, UTail...>& u) +{ + return (t.head() < u.head() || + (!(t.head() < u.head()) && t.tail() < u.tail())); +} + +template<typename... TValues, typename... UValues> +bool operator>(const tuple<TValues...>& t, const tuple<UValues...>& u) +{ + return u < t; +} + +template<typename... TValues, typename... UValues> +bool operator<=(const tuple<TValues...>& t, const tuple<UValues...>& u) +{ + return !(u < t); +} + +template<typename... TValues, typename... UValues> +bool operator>=(const tuple<TValues...>& t, const tuple<UValues...>& u) +{ + return !(t < u); +} + +// enable_if, the breakfast of champions +template<bool Cond, typename Type = void> +struct enable_if { + typedef Type type; +}; + +template<typename Type> +struct enable_if<false, Type> { }; + +// 3.6 Function object binders + +// 3.6.1 Class template is_bind_expression +template<typename T> +struct is_bind_expression { + static const bool value = false; +}; + +// 3.6.2 Class template is_placeholder +template<typename T> +struct is_placeholder { + static const int value = 0; +}; + +// 3.6.3 Function template bind +template<int I> struct placeholder {} ; + +template<int N> struct int_c { }; + +// A tuple of integer values +template<int...> struct int_tuple {}; + +// make_indexes_impl is a helper for make_indexes +template<int I, typename IntTuple, typename... Types> +struct make_indexes_impl; + + +template<int I, int... Indexes, typename T, typename... Types> +struct make_indexes_impl<I, int_tuple<Indexes...>, T, Types...> +{ + typedef typename make_indexes_impl<I+1, + int_tuple<Indexes..., I>, + Types...>::type type; +}; + +template<int I, int... Indexes> +struct make_indexes_impl<I, int_tuple<Indexes...> > { + typedef int_tuple<Indexes...> type; +}; + +// make_indexes takes a variable-length number of N types and +// generates an int_tuple that contains <0, 1, 2, ..., N-1>. These can +// be used as indexes for tuple's get or tuple_element operation. +template<typename... Types> +struct make_indexes : make_indexes_impl<0, int_tuple<>, Types...> { }; + +// Get the Ith tuple element, but only if I is in bounds. +template<int I, typename Tuple, typename = void> +struct safe_tuple_element{ }; + +template<int I, typename... Values> +struct safe_tuple_element<I, tuple<Values...>, + typename enable_if<(I >= 0 && + I < tuple_size<tuple<Values...> >::value) + >::type> +{ + typedef typename tuple_element<I, tuple<Values...> >::type type; +}; + +// mu maps a bound argument to an actual argument, given a tuple of +// the arguments passed to the function object returned by bind(). + +// Return the stored reference from reference_wrapper +template<typename T, typename... Args> +inline T& mu(reference_wrapper<T>& bound_arg, const tuple<Args&...>&) +{ + return bound_arg.get(); +} + +// Unwrap a tuple into separate arguments and forward to the function +// object f. +template<typename F, int... Indexes, typename... Args> +inline typename F::result_type +unwrap_and_forward(F& f, int_tuple<Indexes...>, const tuple<Args&...>& args) +{ + return f(get<Indexes>(args)...); +} + +// Evaluate the inner bind expression +template<typename Bound, typename... Args> +inline typename enable_if<is_bind_expression<Bound>::value, + typename Bound::result_type>::type +mu(Bound& bound_arg, const tuple<Args&...>& args) +{ + typedef typename make_indexes<Args...>::type Indexes; + return unwrap_and_forward(bound_arg, Indexes(), args); +} + +// Retrieve the Ith argument from args +template<typename Bound, typename... Args> +inline typename safe_tuple_element<is_placeholder<Bound>::value - 1, + tuple<Args...> >::type +mu(Bound& bound_arg, const tuple<Args&...>& args) +{ + return get<is_placeholder<Bound>::value-1>(args); +} + +// Return the stored value. +template<typename T> +struct is_reference_wrapper { + static const bool value = false; +}; + +template<typename T> +struct is_reference_wrapper<reference_wrapper<T> > { + static const bool value = true; +}; + +template<typename Bound, typename... Args> +inline typename enable_if<(!is_bind_expression<Bound>::value + && !is_placeholder<Bound>::value + && !is_reference_wrapper<Bound>::value), + Bound&>::type +mu(Bound& bound_arg, const tuple<Args&...>&) +{ + return bound_arg; +} + +// +template<typename F, typename... BoundArgs, int... Indexes, typename... Args> +typename F::result_type +apply_functor(F& f, tuple<BoundArgs...>& bound_args, int_tuple<Indexes...>, + const tuple<Args&...>& args) +{ + return f(mu(get<Indexes>(bound_args), args)...); +} + +template<typename F, typename... BoundArgs> +class bound_functor +{ + typedef typename make_indexes<BoundArgs...>::type indexes; + + public: + typedef typename F::result_type result_type; + + explicit bound_functor(const F& f, const BoundArgs&... bound_args) + : f(f), bound_args(bound_args...) { } + + template<typename... Args> + typename F::result_type operator()(Args&... args) { + return apply_functor(f, bound_args, indexes(), tie(args...)); + } + + private: + F f; + tuple<BoundArgs...> bound_args; +}; + +template<typename F, typename... BoundArgs> +struct is_bind_expression<bound_functor<F, BoundArgs...> > { + static const bool value = true; +}; + +template<typename F, typename... BoundArgs> +inline bound_functor<F, BoundArgs...> +bind(const F& f, const BoundArgs&... bound_args) +{ + return bound_functor<F, BoundArgs...>(f, bound_args...); +} + + +// 3.6.4 Placeholders +template<int I> +struct is_placeholder<placeholder<I> > { + static const int value = I; +}; + +placeholder<1> _1; +placeholder<2> _2; +placeholder<3> _3; +placeholder<4> _4; +placeholder<5> _5; +placeholder<6> _6; +placeholder<7> _7; +placeholder<8> _8; +placeholder<9> _9; + +// Test code +template<typename T> +struct plus { + typedef T result_type; + + T operator()(T x, T y) { return x + y; } +}; + +template<typename T> +struct multiplies { + typedef T result_type; + + T operator()(T x, T y) { return x * y; } +}; + +template<typename T> +struct negate { + typedef T result_type; + + T operator()(T x) { return -x; } +}; + +int main() +{ + int seventeen = 17; + int forty_two = 42; + + assert(bind(plus<int>(), _1, _2)(seventeen, forty_two) == 59); + assert(bind(plus<int>(), _1, _1)(seventeen, forty_two) == 34); + assert(bind(plus<int>(), _2, _1)(seventeen, forty_two) == 59); + assert(bind(plus<int>(), 5, _1)(seventeen, forty_two) == 22); + assert(bind(plus<int>(), ref(seventeen), _2)(seventeen, forty_two) == 59); + assert(bind(plus<int>(), bind(multiplies<int>(), 3, _1), _2)(seventeen, forty_two) + == 93); + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-crash1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-crash1.C new file mode 100644 index 0000000..211ede6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-crash1.C @@ -0,0 +1,72 @@ +// { dg-do compile { target c++11 } } + +#define ONE +#define TWO +#define THREE + +struct Something {}; +Something ___; + +template <class F> +struct Trial +{ + F f; +public: + Trial() : f() {} + Trial( const F& ff ) : f(ff) { } + template <typename... Args> + struct Sig { typedef int ResultType; }; + + template <typename... Args> + struct Sig<Something,Args...> { typedef int ResultType; }; + +#ifdef ONE + +template <typename... Args> +typename Sig<Something,Args...>::ResultType operator()(const Something& s, const Args&... args) const +{ + return f(args...); +} +#endif +#ifdef TWO +template <typename... Args> +typename Sig<Args...>::ResultType operator()(const Args&... args) const +{ + return f(args...); +} +#endif +}; + +struct Internal +{ + +template <typename... Args> +struct Sig { typedef int ResultType; }; + +template <typename... Args> +struct Sig<Something,Args...> { typedef int ResultType; }; + +template <typename... Args> +int operator()(const Args&... args) const +{ + int n = sizeof...(Args); + return n; +} + + static Trial<Internal>& full() { static Trial<Internal> f; return f; } +}; + +static Trial<Internal>& internal = Internal::full(); + +int main() +{ + int n = 0; +#ifdef ONE + n = internal(___,1,2); +#endif +#ifdef THREE + n = internal(___,1,2,3); + n = internal(___,1,2,3,4); +#endif + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-crash2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-crash2.C new file mode 100644 index 0000000..8b5ee0d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-crash2.C @@ -0,0 +1,17 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/39637 +// { dg-do compile { target c++11 } } + +template<class... Types> +void +f(Types...) +{ + enum {e = sizeof(Types)}; // { dg-error "parameter packs not expanded with '...'" } + enum {e1 = sizeof...(Types)}; +} + +int +main() +{ + f(0); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-default.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-default.C new file mode 100644 index 0000000..33b27a5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-default.C @@ -0,0 +1,12 @@ +// PR c++/49205 +// { dg-do compile { target c++11 } } + +#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-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-diag1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-diag1.C new file mode 100644 index 0000000..53182d3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-diag1.C @@ -0,0 +1,22 @@ +// PR c++/55232 +// { dg-do compile { target c++11 } } + +struct vector +{ + typedef int value_type; +}; + +template< class U, class... T > +struct X +{ + void push_back( typename T::value_type ... vals ) + { + U::asoeuth; // { dg-error "" } + } +}; + +int main() +{ + X< int, vector > x; + x.push_back( 0 ); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex1.C new file mode 100644 index 0000000..b301604 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex1.C @@ -0,0 +1,4 @@ +// { dg-do compile { target c++11 } } +template<typename ... Elements> class Tuple; +Tuple<>* t; // OK: Elements is empty +Tuple* u; // { dg-error "template-name" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex10.C new file mode 100644 index 0000000..3df356a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex10.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } +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" "mismatch" } +// { dg-error "expected a type" "expected a type" { target *-*-* } 7 } +// { dg-error "in declaration" "in declaration" { target *-*-* } 7 } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex11.C new file mode 100644 index 0000000..9991fa2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex11.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } +template<typename... Types> + void f(Types... args); + +void g() { + f(); // okay: args contains no arguments + f(1); // okay: args contains one int argument + (2, 1.0); // okay: args contains two arguments, an int and a double +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex12.C new file mode 100644 index 0000000..bc55b2d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex12.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } +template<typename... Types> + void f(Types... rest); + +template<typename... Types> + void g(Types... rest) { + f(&rest...); // ``&rest...'' is a pack expansion, ``&rest'' is its pattern + } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex13.C new file mode 100644 index 0000000..fe29e71 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex13.C @@ -0,0 +1,39 @@ +// { dg-do compile { target c++11 } } + +template<typename T, typename U> struct is_same { + static const bool value = false; +}; + +template<typename T> struct is_same<T, T> { + static const bool value = true; +}; + +template<typename...> struct Tuple {}; +template<typename T1, typename T2> struct Pair {}; + +template<typename... Args1> + struct zip { + template<typename... Args2> + struct with { + typedef Tuple<Pair<Args1, Args2>...> type; // { dg-error "mismatched argument pack" } + }; + }; + +static_assert + (is_same<zip<short, int>::with<unsigned short, unsigned>::type, + Tuple<Pair<short, unsigned short>, Pair<int, unsigned> > >::value, + "zip"); + +typedef zip<short>::with<unsigned short, unsigned>::type T2; // error: different number of arguments specified + // for Args1 and Args2 + +template<typename... Args> void f(Args...); + +template<typename... Args> void g(Args... args) +{ + f(const_cast<const Args*>(&args)...); // okay: ``Args'' and ``args'' are expanded + f(5 ...); // { dg-error "contains no argument packs" } + f(args); // { dg-error "parameter packs not expanded" } + // { dg-message "args" "note" { target *-*-* } 36 } + f(h(args...) + args...); // okay: first ``args'' expanded within h, second ``args'' expanded within f. +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex14.C new file mode 100644 index 0000000..600b798 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex14.C @@ -0,0 +1,19 @@ +// { dg-do compile { target c++11 } } + +template<class T> class A { /* ... */ }; +template<class T, class U = T> class B { /* ... */ }; +template<class... Types> class C { /* ... */ }; + +template<template<class> class P> class X { /* ... */ }; +template<template<class...> class Q> class Y { /* ... */ }; + +X<A> xA; // okay +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-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex2.C new file mode 100644 index 0000000..015d9d8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex2.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } +template<class... Types> struct B { // { dg-error "declaration of" } + void f3(); + void f4(); +}; + +template<class... Types> void B<Types...>::f3() { } // OK +template<class... Types> void B<Types>::f4() { } // { dg-error "invalid" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex3.C new file mode 100644 index 0000000..8a723ab --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex3.C @@ -0,0 +1,11 @@ +// { dg-do compile { target c++11 } } +template<class X, class Y, class... Z> X f(Y); // { dg-message "note" } +void g() +{ + int i = f<int>(5.6); + int j = f(5.6); // { dg-error "no matching" } + // { 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|deduce template parameter)" "candidate note" { target *-*-* } 9 } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex4.C new file mode 100644 index 0000000..26651f7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex4.C @@ -0,0 +1,13 @@ +// { dg-do compile { target c++11 } } +template<class X, class Y, class Z> X f(Y,Z); // { dg-message "note" } +template<class... Args> void f2(); +void g() +{ + f<int,const char*,double>("aa",3.0); + f<int,const char*>("aa",3.0); // Z is deduced to be double + 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|deduce template parameter)" "candidate note" { target *-*-* } 10 } + f2<char, short, int, long>(); // okay +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex5.C new file mode 100644 index 0000000..841562f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex5.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } +template<typename... Types> void f(Types... values); + +void g() +{ + f<int*, float*>(0, 0, 0); // Types is deduced to the sequence int*, float*, int +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex6.C new file mode 100644 index 0000000..185a963 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex6.C @@ -0,0 +1,13 @@ +// { dg-do compile { target c++11 } } +template<class...> struct Tuple { }; + +template<class... Types> void f(Types&...); +template<class... Types1, class... Types2> void g(Tuple<Types1...>, Tuple<Types2...>); + +void h(int x, float& y) +{ + const int z = x; + f(x, y, z); // Types is deduced to int, const int, float + g(Tuple<short, int, long>(), Tuple<float, double>()); // Types1 is deduced to short, int long + // Types2 is deduced to float, double +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex7.C new file mode 100644 index 0000000..c1bf837 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex7.C @@ -0,0 +1,13 @@ +// { dg-do compile { target c++11 } } +template<typename...> struct Tuple { }; +template<typename... Types> char& g(Tuple<Types...>); // #1 +template<typename T1, typename... Types> short& g(Tuple<T1, Types...>); // #2 +template<typename T1, typename... Types> int& g(Tuple<T1, Types&...>); // #3 + +void f() { + // char& x1 = g(Tuple<>()); // calls #1 + short& y1 = g(Tuple<int, float>()); // calls #2 + // int& z1 = g(Tuple<int, float&>()); // calls #3 + // int& z2 = g(Tuple<int>()); // calls #3 + // int& z3 = g(Tuple<int>()); // calls #3 +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex8.C new file mode 100644 index 0000000..581e4db --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex8.C @@ -0,0 +1,18 @@ +// { dg-do compile { target c++11 } } +template<class> struct X { static const bool primary = true; }; +template<class R, class... ArgTypes> struct X<R(int, ArgTypes...)> { + static const bool primary = false; +}; +template<class... Types> struct Y { static const bool primary = true; }; +template<class T, class... Types> struct Y<T, Types&...> { + static const bool primary = false; +}; + +static_assert (X<int>::primary, "uses primary template"); +static_assert (!X<int(int, float, double)>::primary, + "uses partial specialization"); +static_assert (X<int(float, int)>::primary, "uses primary template"); +static_assert (Y<>::primary, "uses primary template"); +static_assert (!Y<int&, float&, double&>::primary, + "uses partial specialization"); +static_assert (Y<int, float, double>::primary, "uses primary template"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex9.C new file mode 100644 index 0000000..0617b1a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ex9.C @@ -0,0 +1,10 @@ +// { dg-do compile { target c++11 } } +template<typename... Args> char& f(Args... args); // #1 +template<typename T1, typename... Args> short& f(T1 a1, Args... args); // #2 +template<typename T1, typename T2> int& f(T1 a2, T2 a3); // #3 + +void g() { + char& x = f(); // calls #1 + short& y = f(1, 2, 3); // calls #2 + int& z = f(1, 2); // calls #3 +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-explicit1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-explicit1.C new file mode 100644 index 0000000..605c55b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-explicit1.C @@ -0,0 +1,11 @@ +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-explicit2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-explicit2.C new file mode 100644 index 0000000..4a80745 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-function.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-function.C new file mode 100644 index 0000000..bb98531 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-function.C @@ -0,0 +1,95 @@ +// { dg-do run { target c++11 } } +// A basic implementation of TR1's function using variadic teplates +// Contributed by Douglas Gregor <doug.gregor@gmail.com> +#include <cassert> + +template<typename Signature> +class function; + +template<typename R, typename... Args> +class invoker_base +{ + public: + virtual ~invoker_base() { } + virtual R invoke(Args...) = 0; + virtual invoker_base* clone() = 0; +}; + +template<typename F, typename R, typename... Args> +class functor_invoker : public invoker_base<R, Args...> +{ + public: + explicit functor_invoker(const F& f) : f(f) { } + R invoke(Args... args) { return f(args...); } + functor_invoker* clone() { return new functor_invoker(f); } + + private: + F f; +}; + +template<typename R, typename... Args> +class function<R (Args...)> { + public: + typedef R result_type; + + function() : invoker (0) { } + + function(const function& other) : invoker(0) { + if (other.invoker) + invoker = other.invoker->clone(); + } + + template<typename F> + function(const F& f) : invoker(0) { + invoker = new functor_invoker<F, R, Args...>(f); + } + + ~function() { + if (invoker) + delete invoker; + } + + function& operator=(const function& other) { + function(other).swap(*this); + return *this; + } + + template<typename F> + function& operator=(const F& f) { + function(f).swap(*this); + return *this; + } + + void swap(function& other) { + invoker_base<R, Args...>* tmp = invoker; + invoker = other.invoker; + other.invoker = tmp; + } + + result_type operator()(Args... args) const { + assert(invoker); + return invoker->invoke(args...); + } + + private: + invoker_base<R, Args...>* invoker; +}; + +struct plus { + template<typename T> T operator()(T x, T y) { return x + y; } +}; + +struct multiplies { + template<typename T> T operator()(T x, T y) { return x * y; } +}; + +int main() +{ + function<int(int, int)> f1 = plus(); + assert(f1(3, 5) == 8); + + f1 = multiplies(); + assert(f1(3, 5) == 15); + + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-init.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-init.C new file mode 100644 index 0000000..ac072c6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-init.C @@ -0,0 +1,55 @@ +// { dg-do run { target c++11 } } + +// PR c++/33510 +#define SIZE_FROM_CTOR +extern "C" void abort (); + +template<int M, int N> struct pair +{ + int i, j; + pair () : i (M), j (N) {} +}; + +template<int... M> struct S +{ + template<int... N> static int *foo () + { +#ifdef SIZE_FROM_CTOR + static int x[] = { (M + N)..., -1 }; +#else + static int x[1 + sizeof... N] = { (M + N)..., -1 }; +#endif + return x; + } +}; + +template<typename... M> struct R +{ + template<typename... N> static int *foo () + { +#ifdef SIZE_FROM_CTOR + static int x[] = { (sizeof(M) + sizeof(N))..., -1 }; +#else + static int x[1 + sizeof... N] = { (sizeof(M) + sizeof(N))..., -1 }; +#endif + return x; + } +}; + +int *bar () +{ + return S<0, 1, 2>::foo<0, 1, 2> (); +} + +int *baz () +{ + return R<char, short, int>::foo<float, double, long> (); +} + + +int main () +{ + int *p = bar (); + if (p[0] != 0 || p[1] != 2 || p[2] != 4 || p[3] != -1) + abort (); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-lambda.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-lambda.C new file mode 100644 index 0000000..f235c36 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-lambda.C @@ -0,0 +1,79 @@ +// { dg-do compile { target c++11 } } + +struct int_placeholder; + +template<typename T> +struct do_replace +{ + typedef T type; +}; + +template<> +struct do_replace<int_placeholder> +{ + typedef int type; +}; + +template<typename T> struct lambdalike +{ + typedef T type; +}; + +template<template<typename...> class TT, typename... Args> +struct lambdalike<TT<Args...> > { + typedef TT<typename do_replace<Args>::type...> type; +}; + + +template<typename T, typename U> +struct is_same +{ + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> +{ + static const bool value = true; +}; + +template<typename... Elements> struct tuple; +template<typename T1, typename T2> struct pair; + +static_assert(is_same<lambdalike<tuple<float, int_placeholder, double>>::type, + tuple<float, int, double>>::value, + "MPL lambda-like replacement on tuple"); +static_assert(is_same<lambdalike<pair<float, int_placeholder>>::type, + pair<float, int>>::value, + "MPL lambda-like replacement on pair"); + + +struct _1 {}; + +template<typename Arg0, typename Lambda> +struct eval +{ + typedef Lambda type; +}; + +template<typename Arg0> +struct eval<Arg0, _1> +{ + typedef Arg0 type; +}; + +template<typename Arg0, template<typename...> class T, typename... Pack> +struct eval<Arg0, T<Pack...> > +{ + typedef T< typename eval<Arg0, Pack>::type... > type; +}; + +static_assert(is_same<eval<int, tuple<float, _1, double>>::type, + tuple<float, int, double>>::value, "eval tuple"); +static_assert(is_same<eval<int, pair<_1, double>>::type, + pair<int, double>>::value, "eval pair"); +static_assert(is_same<eval<int, + tuple<pair<_1, _1>, pair<float, float>, + pair<double, _1>>>::type, + tuple<pair<int, int>, pair<float, float>, pair<double, int>>>::value, + "recursive eval"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-mem_fn.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-mem_fn.C new file mode 100644 index 0000000..aca58e3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-mem_fn.C @@ -0,0 +1,49 @@ +// { dg-do run { target c++11 } } +// A basic implementation of TR1's mem_fn using variadic teplates +// Contributed by Douglas Gregor <doug.gregor@gmail.com> +#include <cassert> + +template<typename R, typename Class, typename... Args> +class Mem_fn +{ + public: + explicit Mem_fn(R (Class::*pmf)(Args...)) : pmf(pmf) { } + + R operator()(Class& object, Args... args) + { + return (object.*pmf)(args...); + } + + R operator()(Class* object, Args... args) + { + return (object->*pmf)(args...); + } + + R (Class::*pmf)(Args...); +}; + +template<typename R, typename Class, typename... Args> +inline Mem_fn<R, Class, Args...> +mem_fn(R (Class::* pmf)(Args...)) +{ + return Mem_fn<R, Class, Args...>(pmf); +} + +class X { + public: + int negate(int x) { return -x; } + int plus(int x, int y) { return x + y; } +}; + +int main() +{ + X x; + X* xp = &x; + + assert(mem_fn(&X::negate)(x, 17) == -17); + assert(mem_fn(&X::negate)(xp, 17) == -17); + assert(mem_fn(&X::plus)(x, 17, 25) == 42); + assert(mem_fn(&X::plus)(xp, 17, 25) == 42); + + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-new.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-new.C new file mode 100644 index 0000000..af7c86f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-new.C @@ -0,0 +1,18 @@ +// { dg-do run { target c++11 } } +// Contributed by Peter Dimov +// PR c++/32597 +#include <assert.h> +#include <new> + +int k = 5; + +template< class... Args > void f( Args... args ) +{ + new( &k ) int( args... ); +} + +int main() +{ + f(); + assert( k == 0 ); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-new2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-new2.C new file mode 100644 index 0000000..413e070 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-new2.C @@ -0,0 +1,23 @@ +// { dg-do run { target c++11 } } +// PR c++/32597 +#include <assert.h> +#include <new> + +template< class... Args > void f( Args... args ) +{ + { + int x = 17; + (void)x; + } + + { + int y(args...); + assert(y == 0); + } + +} + +int main() +{ + f(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-nondeduce1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-nondeduce1.C new file mode 100644 index 0000000..4aa5dba --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-nondeduce1.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-nondeduce2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-nondeduce2.C new file mode 100644 index 0000000..a82a098 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-nondeduce2.C @@ -0,0 +1,25 @@ +// PR c++/55220 +// { dg-do compile { target c++11 } } + +template <typename ...> struct something_like_tuple +{ + +}; + +template <typename, typename> struct is_last +{ + static const bool value = false; +}; + +// Head is non-deducible, so this can't work as the user intended +template <typename T, template <typename ...> class Tuple, typename ... Head> +struct is_last<T, Tuple<Head ..., T>> +{ + static const bool value = true; +}; + +#define SA(X) static_assert (X, #X) + +typedef something_like_tuple<char, int, float> something_like_tuple_t; +SA ((is_last<float, something_like_tuple_t>::value == false)); +SA ((is_last<int, something_like_tuple_t>::value == false)); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-rref.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-rref.C new file mode 100644 index 0000000..ee90c9b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-rref.C @@ -0,0 +1,36 @@ +// { dg-do compile { target c++11 } } +// PR c++/33939 +template<typename T> +struct refs_only; + +template<typename T> +struct refs_only<T &> +{}; + +template<typename T> +refs_only<T> foo( T && t) +{ + return refs_only<T>(); +} + +template<typename... T> +struct va_refs_only; + +template<typename T> +struct va_refs_only<T> + : refs_only<T> +{}; + +template<typename... T> +va_refs_only<T...> bar( T &&... t) +{ + return va_refs_only<T...>(); +} + +int main() +{ + int j = 0; + foo(j); + bar(j); // error: invalid use of incomplete type 'struct refs_only<int>' +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-sizeof1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-sizeof1.C new file mode 100644 index 0000000..2837c85 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-sizeof1.C @@ -0,0 +1,11 @@ +// PR c++/56679 +// { dg-require-effective-target c++11 } + +template <template <typename> class... Args> +struct Foo { + static const int value = sizeof...(Args); +}; + +template <typename> struct Bar { }; + +const int test = Foo<Bar>::value; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-sizeof2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-sizeof2.C new file mode 100644 index 0000000..dfc245d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-sizeof2.C @@ -0,0 +1,14 @@ +// PR c++/57471 +// { dg-require-effective-target c++11 } + +struct A +{ + static constexpr bool value = true; +}; + +template<typename... Types> +struct B +{ + static_assert(A::value, ""); + static_assert(sizeof...(Types) == 0, ""); +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-sizeof3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-sizeof3.C new file mode 100644 index 0000000..7296500 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-sizeof3.C @@ -0,0 +1,15 @@ +// PR c++/59435 +// { dg-require-effective-target c++11 } + +template <typename... E> +struct T +{ + T(unsigned int i = sizeof...(E)){} // does not compile + + static constexpr unsigned int U = sizeof...(E); + T(unsigned int j, unsigned int i = U){} // compile +}; + +template <typename... T> +void test(int i = sizeof...(T)) // compile +{} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-throw.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-throw.C new file mode 100644 index 0000000..fc81e9d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-throw.C @@ -0,0 +1,26 @@ +// { dg-do compile { target c++11 } } +// { dg-prune-output "note" } +// PR c++/33509 +template<int M, int N> struct pair +{ + int i, j; + pair() : i(M), j(N) {} +}; + +template<int... M> struct S +{ + template<int... N> static int foo() throw (pair <M, N>...) // { dg-error "mismatched" } + { + return 1; + } +}; + +int bar () +{ + return S<0, 1, 2>::foo<0, 1, 3> (); +} + +int wibble() +{ + return S<0, 1, 2>::foo<0, 1> (); // { dg-error "no matching" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ttp.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ttp.C new file mode 100644 index 0000000..5d08d13 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-ttp.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } +// PR c++/34101 +template<typename> struct A {}; + +template<template<typename> class...> struct B {}; + +template<template<typename> class T> void foo(const B<T>&); + +void bar() +{ + foo(B<A>()); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-tuple.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-tuple.C new file mode 100644 index 0000000..b1c6b3d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-tuple.C @@ -0,0 +1,293 @@ +// { dg-do run { target c++11 } } +// An implementation of TR1's <tuple> using variadic teplates +// Contributed by Douglas Gregor <doug.gregor@gmail.com> + +#include <string> +#include <cassert> +#include <cstring> + +// Trivial reference_wrapper +template<typename T> +struct reference_wrapper +{ + reference_wrapper(T& x) : ptr(&x) { } + + operator T&() const { return *ptr; } + + T* ptr; +}; + +template<typename T> reference_wrapper<T> ref(T& x) { return x; } +template<typename T> reference_wrapper<const T> cref(const T& x) { return x; } + +// Simple type-traits we'll need +template<typename T> +struct add_reference +{ + typedef T& type; +}; + +template<typename T> +struct add_reference<T&> +{ + typedef T& type; +}; + +template<typename T, typename U> +struct is_same +{ + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> +{ + static const bool value = true; +}; + +// For creating the constructor parameters of tuple<> +template<typename T> +struct add_const_reference +{ + typedef const T& type; +}; + +template<typename T> +struct add_const_reference<T&> +{ + typedef T& type; +}; + +// 6.1.3 Class template tuple +template<typename... Values> +class tuple; + +template<> class tuple<> { }; + +template<typename Head, typename... Tail> +class tuple<Head, Tail...> + : private tuple<Tail...> +{ + typedef tuple<Tail...> inherited; + + public: + tuple() { } + + // implicit copy-constructor is okay + + tuple(typename add_const_reference<Head>::type v, + typename add_const_reference<Tail>::type... vtail) + : m_head(v), inherited(vtail...) { } + + template<typename... VValues> + tuple(const tuple<VValues...>& other) + : m_head(other.head()), inherited(other.tail()) { } + + template<typename... VValues> + tuple& operator=(const tuple<VValues...>& other) + { + m_head = other.head(); + tail() = other.tail(); + return *this; + } + + typename add_reference<Head>::type head() { return m_head; } + typename add_reference<const Head>::type head() const { return m_head; } + inherited& tail() { return *this; } + const inherited& tail() const { return *this; } + + protected: + Head m_head; +}; + +template<typename T> +struct make_tuple_result +{ + typedef T type; +}; + +template<typename T> +struct make_tuple_result<reference_wrapper<T> > +{ + typedef T& type; +}; + +// 6.1.3.2 Tuple creation functions +struct ignore_t { + template<typename T> ignore_t& operator=(const T&) { return *this; } +} ignore; + +template<typename... Values> +tuple<typename make_tuple_result<Values>::type...> +make_tuple(const Values&... values) +{ + return tuple<typename make_tuple_result<Values>::type...>(values...); +} + +template<typename... Values> +tuple<Values&...> tie(Values&... values) +{ + return tuple<Values&...>(values...); +} + +// 6.1.3.3 Tuple helper classes +template<typename Tuple> +struct tuple_size; + +template<> +struct tuple_size<tuple<> > +{ + static const std::size_t value = 0; +}; + +template<typename Head, typename... Tail> +struct tuple_size<tuple<Head, Tail...> > +{ + static const std::size_t value = 1 + tuple_size<tuple<Tail...> >::value; +}; + +template<int I, typename Tuple> +struct tuple_element; + +template<int I, typename Head, typename... Tail> +struct tuple_element<I, tuple<Head, Tail...> > +{ + typedef typename tuple_element<I-1, tuple<Tail...> >::type type; +}; + +template<typename Head, typename... Tail> +struct tuple_element<0, tuple<Head, Tail...> > +{ + typedef Head type; +}; + +// 6.1.3.4 Element access +template<int I, typename Tuple> +class get_impl; + +template<int I, typename Head, typename... Values> +class get_impl<I, tuple<Head, Values...> > +{ + typedef typename tuple_element<I-1, tuple<Values...> >::type Element; + typedef typename add_reference<Element>::type RJ; + typedef typename add_const_reference<Element>::type PJ; + typedef get_impl<I-1, tuple<Values...> > Next; + + public: + static RJ get(tuple<Head, Values...>& t) + { return Next::get(t.tail()); } + + static PJ get(const tuple<Head, Values...>& t) + { return Next::get(t.tail()); } +}; + +template<typename Head, typename... Values> +class get_impl<0, tuple<Head, Values...> > +{ + typedef typename add_reference<Head>::type RJ; + typedef typename add_const_reference<Head>::type PJ; + + public: + static RJ get(tuple<Head, Values...>& t) { return t.head(); } + static PJ get(const tuple<Head, Values...>& t) { return t.head(); } +}; + +template<int I, typename... Values> +typename add_reference< + typename tuple_element<I, tuple<Values...> >::type + >::type +get(tuple<Values...>& t) +{ + return get_impl<I, tuple<Values...> >::get(t); +} + +template<int I, typename... Values> +typename add_const_reference< + typename tuple_element<I, tuple<Values...> >::type + >::type +get(const tuple<Values...>& t) +{ + return get_impl<I, tuple<Values...> >::get(t); +} + +// 6.1.3.5 Relational operators +inline bool operator==(const tuple<>&, const tuple<>&) { return true; } + +template<typename T, typename... TTail, typename U, typename... UTail> +bool operator==(const tuple<T, TTail...>& t, const tuple<U, UTail...>& u) +{ + return t.head() == u.head() && t.tail() == u.tail(); +} + +template<typename... TValues, typename... UValues> +bool operator!=(const tuple<TValues...>& t, const tuple<UValues...>& u) +{ + return !(t == u); +} + +inline bool operator<(const tuple<>&, const tuple<>&) { return false; } + +template<typename T, typename... TTail, typename U, typename... UTail> +bool operator<(const tuple<T, TTail...>& t, const tuple<U, UTail...>& u) +{ + return (t.head() < u.head() || + (!(t.head() < u.head()) && t.tail() < u.tail())); +} + +template<typename... TValues, typename... UValues> +bool operator>(const tuple<TValues...>& t, const tuple<UValues...>& u) +{ + return u < t; +} + +template<typename... TValues, typename... UValues> +bool operator<=(const tuple<TValues...>& t, const tuple<UValues...>& u) +{ + return !(u < t); +} + +template<typename... TValues, typename... UValues> +bool operator>=(const tuple<TValues...>& t, const tuple<UValues...>& u) +{ + return !(t < u); +} + +int a0[tuple_size<tuple<> >::value == 0? 1 : -1]; +int a1[tuple_size<tuple<int, float, double> >::value == 3? 1 : -1]; +int a2a[is_same<tuple_element<0, tuple<int, float, double> >::type, int> + ::value? 1 : -1]; +int a2b[is_same<tuple_element<1, tuple<int, float, double> >::type, float> + ::value? 1 : -1]; +int a2c[is_same<tuple_element<2, tuple<int, float, double> >::type, double> + ::value? 1 : -1]; + +int main() +{ + tuple<> t0; + tuple<int> t1(1); + tuple<int, float> t2(1, 3.14159f); + tuple<int, float, const char*> t3a(1, 3.14159f, "Hello, world!"); + tuple<long, double, std::string> t3b(t3a); + t3b = t3a; + // t3a = t3b; DPG: triggers an error, as it should. + + tuple<int, float, std::string> t3c = + make_tuple(17, 2.718281828, std::string("Fun")); + + int seventeen = 17; + double pi = 3.14159; + tuple<int&, double&> seventeen_pi = make_tuple(ref(seventeen), ref(pi)); + tuple<int&, const double&> seventeen_pi2 = + make_tuple(ref(seventeen), cref(pi)); + tuple<int&, double&> seventeen_pi_tied = tie(seventeen, pi); + assert(get<0>(t3a) == 1); + assert(get<1>(t3a) == 3.14159f); + assert(std::strcmp(get<2>(t3a), "Hello, world!") == 0); + + assert(t3a == t3b); + assert(!(t3a != t3b)); + assert(!(t3a < t3b)); + assert(!(t3a > t3b)); + assert(t3a <= t3b && t3b <= t3a); + assert(t3a >= t3b && t3b >= t3a); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-unify-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-unify-2.C new file mode 100644 index 0000000..0a7acba --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-unify-2.C @@ -0,0 +1,13 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/40155 +// { dg-do compile { target c++11 } } + +template <typename T> struct identity +{ typedef T type; }; + +template <typename RT, typename... A> +int forward_call(RT (*) (A...), typename identity<A>::type...); + +int g (double); + +int i = forward_call(&g, 0); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-unify.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-unify.C new file mode 100644 index 0000000..29b528c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-unify.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } +template<typename...> struct tuple { }; + +template<typename... Args1, typename... Args2> +void foo(tuple<Args1..., Args2...>, tuple<Args1...>, tuple<Args2...>); + +struct X{ }; + +void bar() +{ + tuple<int, float> tif; + tuple<double, X> tdx; + tuple<int, float, double, X> tall; + foo(tall, tif, tdx); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-unresolved.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-unresolved.C new file mode 100644 index 0000000..263640d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-unresolved.C @@ -0,0 +1,12 @@ +// PR c++/50086 +// { dg-do compile { target c++11 } } + +template<typename T> void tfun(); +template<typename T> void fun1(T); +template<typename... Types> void fun2(Types... args); + +int main() +{ + fun1(tfun<int>); // ok + fun2(tfun<int>); // error: unresolved overloaded function type +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-value1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic-value1.C new file mode 100644 index 0000000..179919a --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/variadic1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic1.C new file mode 100644 index 0000000..ed80849 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic1.C @@ -0,0 +1,10 @@ +// { dg-do compile { target c++11 } } +template<typename...> +class tuple; + +template<typename... Args> +class tuple { }; + +template<typename T1, class... Args> +class tuple1p { }; + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic10.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic10.C new file mode 100644 index 0000000..03fa39c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic10.C @@ -0,0 +1,22 @@ +// { dg-do compile { target c++11 } } +template<typename T1, typename T2> +struct pair {}; + +template<typename... Args> +struct tuple { + static const int value = 0; +}; + +template<> +struct tuple<pair<int, float> > { }; + +template<typename... Outer> +struct X { + template<typename... Inner> + struct Y + { + typedef tuple<pair<Outer, Inner>...> type; // { dg-error "mismatched argument pack lengths" } + }; +}; + +X<int, double>::Y<short, char, double>::type honk; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic100.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic100.C new file mode 100644 index 0000000..502601f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic100.C @@ -0,0 +1,15 @@ +// PR c++/43143 +// { dg-do compile { target c++11 } } + +template<typename T> +T&& declval(); + +template<class T, class... Args> +void test() { + T t(declval<Args>()...); +} + +int main() { + test<const int>(); // OK + test<int[23]>(); // Error +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic101.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic101.C new file mode 100644 index 0000000..8bcedff --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic101.C @@ -0,0 +1,23 @@ +// PR c++/43382 +// { dg-do compile { target c++11 } } + +template<class T> +struct Container +{ T f() const; }; + +template<class T> +T deref(const T& t) +{ return t; } + + +template <class T, class... Args> +auto +deref(const T& u, int r, Args... args) +-> decltype(deref(u.f(), args...)) +{ return deref(u.f(), args...); } + +int main(void) +{ + Container<Container<int>> v; + deref(v,1,2); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic102.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic102.C new file mode 100644 index 0000000..9214b01 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic102.C @@ -0,0 +1,19 @@ +// { dg-do compile { target c++11 } } + +struct nAny { + template<class... T> + nAny(T&&...); +}; + +template<class T> +T&& create(); + +template<class T, class... Args> +void test() { + T t(create<Args>()...); + (void) t; +} + +int main() { + test<nAny>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic103.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic103.C new file mode 100644 index 0000000..69510e6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic103.C @@ -0,0 +1,14 @@ +// { dg-do compile { target c++11 } } + +template<class T> +T&& create(); + +template<class T, class... Args> +void test() { + T t(create<Args>()...); // { dg-error "incomplete" } + (void) t; +} + +int main() { + test<int[]>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic105.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic105.C new file mode 100644 index 0000000..4ba384c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic105.C @@ -0,0 +1,25 @@ +// PR c++/47289 +// { dg-do compile { target c++11 } } +// { dg-prune-output "note" } + +template <template <typename... __ARGS> class _F, typename... _ARGS> +auto reverse (_ARGS... args) -> decltype(_F<_ARGS...>::call_function(args...)) { + return _F<_ARGS...>::call_function(args...); +} + +template <typename _T> +_T sum(_T x) { return x; } + +template <typename _T, typename... _ARGS> +_T sum(_T x, _ARGS... args) { return x + sum(args...); } + +template <typename _T, typename... _ARGS> +struct call_sum { + static _T call_function(_T x1, _ARGS... args) { return sum(x1, args...); } +}; + +int main() { + // This shouldn't be an error; this is bug 35722. + reverse<call_sum>(1,2); // { dg-bogus "no match" "" } + // { dg-bogus "sorry, unimplemented" "candidate explanation" { target *-*-* } 6 } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic106.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic106.C new file mode 100644 index 0000000..efa4c34 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic106.C @@ -0,0 +1,21 @@ +// Origin: PR c++/47326 +// { dg-do compile { target c++11 } } + +template <int _N> +struct A +{ + typedef int value_type; +}; + +template <typename... _ARGS> +auto +f (_ARGS... args) -> typename A<sizeof...(args)>::value_type +{ + return 12; +} + +int +main() +{ + f(1,2); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic107.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic107.C new file mode 100644 index 0000000..d22f87c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic107.C @@ -0,0 +1,15 @@ +// PR c++/48451 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/variadic108.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic108.C new file mode 100644 index 0000000..2e396c6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic108.C @@ -0,0 +1,10 @@ +// PR c++/48736 +// { dg-do compile { target c++11 } } + +template<class T> +T&& create(); + +template<class T, class... Args, + class = decltype(T{create<Args>()...}) // Line X +> +char f(int); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic109.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic109.C new file mode 100644 index 0000000..3ecfb73 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic109.C @@ -0,0 +1,17 @@ +// PR c++/48292 +// { dg-do compile { target c++11 } } + +template <typename... Args> int g(Args...); + +template <int N = 0> +struct A +{ + template <typename... Args> + static auto f(Args... args) -> decltype(g(args...)); +}; + +int main() +{ + A<>::f(); + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic11.C new file mode 100644 index 0000000..2bdeb32 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic11.C @@ -0,0 +1,18 @@ +// { dg-do compile { target c++11 } } +template<typename...> struct count; + +template<> +struct count<> { + static const int value = 0; +}; + +template<typename T, typename... Args> +struct count<T, Args...> { + static const int value = 1 + count<Args...>::value; +}; + +int a0[count<>::value == 0? 1 : -1]; +int a1[count<char>::value == 1? 1 : -1]; +int a2[count<char, short>::value == 2? 1 : -1]; +int a3[count<char, short, int>::value == 3? 1 : -1]; +int a4[count<char, short, int, long>::value == 4? 1 : -1]; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic110.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic110.C new file mode 100644 index 0000000..47a9ed9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic110.C @@ -0,0 +1,15 @@ +// PR c++/45698 +// { dg-do compile { target c++11 } } + +template <class... Ts> struct tuple { }; + +template<class... Ts> +struct A { + template<typename T> struct N { }; + tuple<N<Ts>...> tup; +}; + +int main() +{ + A<int, double> a; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic111.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic111.C new file mode 100644 index 0000000..09bac28 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic111.C @@ -0,0 +1,20 @@ +// PR c++/48424 +// { dg-do compile { target c++11 } } +// { dg-options "-fabi-version=0" } + +template<typename... Args1> +struct S +{ + template<typename... Args2> + void f(Args1... args1, Args2&&... args2) + { + } +}; + +int main() +{ + S<int, double> s; + s.f(1,2.0,false,'a'); +} + +// { dg-final { scan-assembler "_ZN1SIJidEE1fIJbcEEEvidDpOT_" } } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic112.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic112.C new file mode 100644 index 0000000..50d7e94 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic112.C @@ -0,0 +1,19 @@ +// PR c++/49420 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/variadic113.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic113.C new file mode 100644 index 0000000..8f02fed --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic113.C @@ -0,0 +1,21 @@ +// PR c++/49251 +// { dg-do compile { target c++11 } } +// { dg-options "-Wunused-parameter" } + +struct A {}; +template <int> int f(A); + +template< int... Indices > +struct indices {}; + +template< class... Args > +void sink( Args&&... ) {} + +template< class T, int... Indices > +void unpack_test( T && t, indices<Indices...> ) { + sink( f<Indices>(t)... ); +} + +int main() { + unpack_test( A(), indices<>() ); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic114.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic114.C new file mode 100644 index 0000000..82ffe83 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic114.C @@ -0,0 +1,27 @@ +// PR c++/49785 +// { dg-do compile { target c++11 } } + +template <typename, typename ...> struct B { }; +template <typename> class A; + +template <typename R, typename ... S> +struct A <R (S ...)> : public B <R, S ...> +{ + struct C {}; + template <typename D> A (D, C = C ()) { } + R operator () (...); +}; + +template <typename R, typename ... S, typename T> +auto operator >> (A <R (S ...)>, T)->A <R (S ...)> +{ + []() {}; +} + +int +main () +{ + A <int (int, int)> a = [](int, int) {}; + auto b = []{}; + (a >> b) (3, 5); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic115.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic115.C new file mode 100644 index 0000000..bb78185 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic115.C @@ -0,0 +1,19 @@ +// PR c++/49593 +// { dg-do compile { target c++11 } } + +template<typename... T> void f(T...) { } + +template<typename... Args> +static void +g(Args&&... args) +{ + f( static_cast<Args>(args)... ); + f( (Args)args... ); + f( Args(args)... ); + f( Args{args}... ); +} + +int main() +{ + g(1, '2', 3.0); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic116.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic116.C new file mode 100644 index 0000000..05a9a79 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic116.C @@ -0,0 +1,32 @@ +// Origin: PR c++/48320 +// { dg-do compile { target c++11 } } + +template<class... T> +struct tuple +{ + typedef int type; +}; + +template<int... Indices> +struct indices +{ +}; + +template<unsigned i, class Tuple> +struct tuple_element +{ + typedef Tuple type; +}; + +template<class Tuple, + int... Indices, + class Result = tuple<typename tuple_element<Indices, Tuple>::type...> > +Result +f(Tuple&&, indices<Indices...>); + + +void +foo() +{ + f(tuple<int, char, unsigned> (), indices<2, 1, 0> ()); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic117.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic117.C new file mode 100644 index 0000000..04663d2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic117.C @@ -0,0 +1,11 @@ +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/variadic118.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic118.C new file mode 100644 index 0000000..ee742eb --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic118.C @@ -0,0 +1,11 @@ +// This should fail deduction, before it produces a candidate. +// { dg-do compile { target c++11 } } + +template <class... T> +void f(T... ts); // { dg-message "deduction" } + +struct B { }; +int main() +{ + f<int>(B(), 1); // { dg-error "" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic119.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic119.C new file mode 100644 index 0000000..78cd23e --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/variadic12.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic12.C new file mode 100644 index 0000000..661ed3d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic12.C @@ -0,0 +1,42 @@ +// { dg-do compile { target c++11 } } +// A tuple type +template<typename... Args> struct tuple { }; + +// Determine if two types are the same +template<typename T, typename U> +struct is_same { + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> { + static const bool value = true; +}; + +// Append 'T' to the end of Tuple +template<typename T, typename Tuple> +struct append_to_tuple; + +template<typename T, typename... Args> +struct append_to_tuple<T, tuple<Args...> > { + typedef tuple<Args..., T> type; +}; + +// Reverse a sequence of arguments (and return the result as a tuple) +template<typename... Args> struct reverse; + +template<typename T, typename... Args> +struct reverse<T, Args...> { + typedef typename append_to_tuple<T, typename reverse<Args...>::type>::type + type; +}; + +template<> +struct reverse<> { + typedef tuple<> type; +}; + +int a0[is_same<reverse<>::type, tuple<> >::value? 1 : -1]; +int a1[is_same<reverse<int>::type, tuple<int> >::value? 1 : -1]; +int a2[is_same<reverse<char, int>::type, tuple<int, char> >::value? 1 : -1]; +int a3[is_same<reverse<char, int, long>::type, tuple<long, int, char> >::value? 1 : -1]; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic120.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic120.C new file mode 100644 index 0000000..e26ee4e --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/variadic121.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic121.C new file mode 100644 index 0000000..2112196 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic121.C @@ -0,0 +1,12 @@ +// PR c++/51507 +// { dg-do compile { target c++11 } } + +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-4.9/gcc/testsuite/g++.dg/cpp0x/variadic122.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic122.C new file mode 100644 index 0000000..aa21ddd --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic122.C @@ -0,0 +1,23 @@ +// PR c++/52043 +// { dg-do compile { target c++11 } } +// { dg-options "-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-4.9/gcc/testsuite/g++.dg/cpp0x/variadic123.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic123.C new file mode 100644 index 0000000..f0ab9fc --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/variadic124.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic124.C new file mode 100644 index 0000000..d69c6f9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic124.C @@ -0,0 +1,29 @@ +// PR c++/52292 +// { dg-do compile { target 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-4.9/gcc/testsuite/g++.dg/cpp0x/variadic125.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic125.C new file mode 100644 index 0000000..89fd6b0 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/variadic126.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic126.C new file mode 100644 index 0000000..513c7e5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic126.C @@ -0,0 +1,8 @@ +// PR c++/47220 +// { dg-do compile { target c++11 } } + +template < typename ... > struct A; + +struct B : A < // { dg-error "invalid" } +{ +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic127.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic127.C new file mode 100644 index 0000000..2e0d593 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic127.C @@ -0,0 +1,15 @@ +// PR c++/51148 +// { dg-do compile { target c++11 } } + +template<typename... Types> +struct S +{}; + +template<typename... Types> +struct T +{ + friend class S<Types>; // { dg-error "parameter packs not expanded" } +}; + +int main() +{} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic128.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic128.C new file mode 100644 index 0000000..8c2d3b2 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/variadic129.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic129.C new file mode 100644 index 0000000..7118301 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/variadic13.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic13.C new file mode 100644 index 0000000..8a59c98 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic13.C @@ -0,0 +1,19 @@ +// { dg-do compile { target c++11 } } +template<typename... Args> struct tuple1 { }; +template<typename... Args> struct tuple2 { }; + +template<typename T, typename U> +struct same_tuple_args { + static const bool value = false; +}; + +template<typename... Args> +struct same_tuple_args<tuple1<Args...>, tuple2<Args...> > { + static const bool value = true; +}; + +int same0[same_tuple_args<tuple1<>, tuple2<> >::value? 1 : -1]; +int same1[same_tuple_args<tuple1<int>, tuple2<int> >::value? 1 : -1]; +int same2[same_tuple_args<tuple1<float, int>, tuple2<float, int> >::value? 1 : -1]; +int diff0[!same_tuple_args<tuple1<>, tuple2<int> >::value? 1 : -1]; +int diff1[!same_tuple_args<tuple1<int, float>, tuple2<float, int> >::value? 1 : -1]; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic130.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic130.C new file mode 100644 index 0000000..f73c8b5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic130.C @@ -0,0 +1,8 @@ +// PR c++/52008 +// { dg-do compile { target c++11 } } + +template <int I, typename T, typename... Ts> +struct A; + +template<typename... Ts> +struct A<0, Ts...>; // { dg-error "not more specialized" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic131.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic131.C new file mode 100644 index 0000000..3006f87 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/variadic132.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic132.C new file mode 100644 index 0000000..1b9c286 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/variadic133.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic133.C new file mode 100644 index 0000000..0265f09 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/variadic134.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic134.C new file mode 100644 index 0000000..d4181b0 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/cpp0x/variadic135.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic135.C new file mode 100644 index 0000000..fcdd2a7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic135.C @@ -0,0 +1,5 @@ +// { dg-do compile { target c++11 } } + +template <typename ...> struct S; + +int i = S<int,>::undefined; // { dg-error "template argument 2 is invalid" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic139.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic139.C new file mode 100644 index 0000000..a1c64f3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic139.C @@ -0,0 +1,14 @@ +// Origin: PR c++/53609 +// { dg-do compile { target c++11 } } + +template<class...I> struct List {}; +template<int T> struct Z {static const int value = T;}; +template<int...T> using LZ = List<Z<T>...>; + +template<class...U> +struct F +{ + using N = LZ<U::value...>; +}; + +F<Z<1>, Z<2> >::N A; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic14.C new file mode 100644 index 0000000..addbd74 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic14.C @@ -0,0 +1,21 @@ +// { dg-do compile { target c++11 } } +template<typename R, typename... ArgTypes> +struct make_function_type +{ + typedef R type(ArgTypes...); +}; + +template<typename T, typename U> +struct is_same { + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> { + static const bool value = true; +}; + +int a0[is_same<make_function_type<int>::type, int()>::value? 1 : -1]; +int a1[is_same<make_function_type<int, float>::type, int(float)>::value? 1 : -1]; +int a2[is_same<make_function_type<int, float>::type, int(float)>::value? 1 : -1]; +int a3[is_same<make_function_type<int, float, double>::type, int(float, double)>::value? 1 : -1]; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic140.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic140.C new file mode 100644 index 0000000..17ca9e5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic140.C @@ -0,0 +1,22 @@ +// Origin: PR c++/53609 +// { dg-do compile { target c++11 } } + +template<class...I> struct List{ static const bool is_ok = false;}; +template<int T> struct Z +{ + static const int value = T; + static const int value_square = T * T; +}; + +template<template<int> class U> +struct List<U<2>, U<3>, U<4>, U<9>> { static const bool is_ok = true;}; + +template<int...T> using LZ = List<Z<T>...>; + +template<class...T> +struct F +{ + using N = LZ<T::value..., T::value_square...>; +}; + +static_assert (F<Z<2>, Z<3>>::N::is_ok, ""); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic141.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic141.C new file mode 100644 index 0000000..6b893a7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic141.C @@ -0,0 +1,22 @@ +// Origin: PR c++/53609 +// { dg-do compile { target c++11 } } + +template<class...I> struct List{ static const bool is_ok = false;}; +template<int T> struct Z +{ + static const int value = T; + static const int value_square = T * T; +}; + +template<template<int> class U> +struct List<U<2>, U<3>, U<4>, U<9>> { static const bool is_ok = true;}; + +template<int...T> using LZ = List<Z<T>...>; + +template<class...T> +struct F +{ + using N = LZ<T::value..., Z<4>::value, Z<9>::value>; +}; + +static_assert (F<Z<2>, Z<3>>::N::is_ok, ""); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic142.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic142.C new file mode 100644 index 0000000..83b2429 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic142.C @@ -0,0 +1,9 @@ +// Core 1609 +// { dg-require-effective-target c++11 } + +template<typename... T> +void f2(int a = 0, T... b, int c = 1); + +int main(){ + f2<>(); // parameter a has the value 0 and parameter c has the value 1 +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic143.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic143.C new file mode 100644 index 0000000..db0b268 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic143.C @@ -0,0 +1,63 @@ +// PR c++/56782 +// { dg-do compile { target c++11 } } + +template<class T> +T&& declval(); + +struct is_convertible_impl { + template<class T> + static void sink(T); + + template<class T, class U, class = decltype(sink<U>(declval<T>()))> + static auto test(int) -> char; + + template<class, class> + static auto test(...) -> char(&)[2]; +}; + +template<class T, class U> +struct is_convertible : is_convertible_impl +{ + static const bool value = sizeof(test<T, U>(0)) == 1; +}; + +template<bool, class> +struct enable_if {}; + +template<class T> +struct enable_if<true, T> { typedef T type; }; + +template<bool, class If, class Else> +struct conditional { typedef If type; }; + +template<class If, class Else> +struct conditional<false, If, Else> { typedef Else type; }; + +template<class...> +struct and_; + +template<> +struct and_<> +{ + static const bool value = true; +}; + +template<class P> +struct and_<P> : P +{ +}; + +template<class P1, class P2> +struct and_<P1, P2> : conditional<P1::value, P2, P1>::type +{ +}; + +template<class... T> +struct Tuple { + template<class... U, + class = typename enable_if<and_<is_convertible<U, T>... >::value, int>::type + > + Tuple(U&&...){} +}; + +static_assert(is_convertible<Tuple<>, Tuple<>>::value, "Ouch"); //#1 diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic144.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic144.C new file mode 100644 index 0000000..5d05d3d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic144.C @@ -0,0 +1,15 @@ +// PR c++/56060 +// { dg-do compile { target c++11 } } + +template<typename T> struct baz { }; +template<typename T> T bar(); + +template<typename T, typename ... U> +baz<decltype(bar<T>()(bar<U> ...))> // { dg-error "cannot be used" } +foo(); + +int main() +{ + foo<int>(); // { dg-error "no matching" } + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic145.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic145.C new file mode 100644 index 0000000..65edda5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic145.C @@ -0,0 +1,13 @@ +// PR c++/59730 +// { dg-do compile { target c++11 } } + +template <typename> void declval(); +template <typename> void forward(); +template <typename> class D; +template <typename _Functor, typename... _Bound_args> +class D <_Functor(_Bound_args...)> { + template <typename... _Args, decltype(declval<_Functor>)> + void operator()(...) { + 0(forward<_Args>...); + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic146.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic146.C new file mode 100644 index 0000000..0c91db5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic146.C @@ -0,0 +1,9 @@ +// PR c++/58606 +// { dg-require-effective-target c++11 } + +template<int&...I> struct A +{ + template<typename> struct B; + + template<typename T> struct B<T*> {}; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic147.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic147.C new file mode 100644 index 0000000..7f606d8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic147.C @@ -0,0 +1,10 @@ +// PR c++/58466 +// { dg-require-effective-target c++11 } + +template<char, char...> struct A; + +template<typename> struct B; + +template<char... C> struct B<A<C...>> {}; + +B<A<'X'>> b; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic148.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic148.C new file mode 100644 index 0000000..a4ee635 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic148.C @@ -0,0 +1,6 @@ +// PR c++/59989 +// { dg-require-effective-target c++11 } + +template<typename T> struct X {}; +template<template<typename...> class D, typename ...U> int test(D<U...>*); +int n = test<X, int>(0); // { dg-error "no match" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic149.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic149.C new file mode 100644 index 0000000..8207d98 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic149.C @@ -0,0 +1,12 @@ +// PR c++/60248 +// { dg-do compile { target c++11 } } +// { dg-options "-g -fabi-version=2" } + +template<int...> struct A {}; + +template<> struct A<0> +{ + typedef enum { e } B; +}; + +A<0> a; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic15.C new file mode 100644 index 0000000..895a548 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic15.C @@ -0,0 +1,21 @@ +// { dg-do compile { target c++11 } } +template<typename R, typename... ArgTypes> +struct make_function_type +{ + typedef R type(const ArgTypes&...); +}; + +template<typename T, typename U> +struct is_same { + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> { + static const bool value = true; +}; + +int a0[is_same<make_function_type<int>::type, int()>::value? 1 : -1]; +int a1[is_same<make_function_type<int, float>::type, int(const float&)>::value? 1 : -1]; +int a2[is_same<make_function_type<int, float>::type, int(const float&)>::value? 1 : -1]; +int a3[is_same<make_function_type<int, float, double>::type, int(const float&, double const&)>::value? 1 : -1]; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic150.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic150.C new file mode 100644 index 0000000..6a30efe --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic150.C @@ -0,0 +1,9 @@ +// PR c++/60219 +// { dg-require-effective-target c++11 } + +template<typename..., int> void foo(); + +void bar() +{ + foo<0>; // { dg-error "" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic151.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic151.C new file mode 100644 index 0000000..a65351d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic151.C @@ -0,0 +1,9 @@ +// PR c++/54440 +// { dg-do compile { target c++11 } } + +template <class...T> struct A +{ + template <T... t, class U> struct B { }; +}; + +A<int,char>::B<42,'a',float> b; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic152.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic152.C new file mode 100644 index 0000000..d7dccc5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic152.C @@ -0,0 +1,12 @@ +// PR c++/54440 +// { dg-do compile { target c++11 } } + +template <class...T> struct A +{ + template <template <T> class... TP, class U> struct B { }; +}; + +template <int I> struct C { }; +template <char C> struct D { }; + +A<int,char>::B<C,D,float> b; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic153.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic153.C new file mode 100644 index 0000000..42a92f6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic153.C @@ -0,0 +1,6 @@ +// PR c++/58648 +// { dg-require-effective-target c++11 } + +template<int, typename...T, T...> int foo(); + +int i = foo<0>(); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic16.C new file mode 100644 index 0000000..d377d36 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic16.C @@ -0,0 +1,21 @@ +// { dg-do compile { target c++11 } } +template<typename R, typename... ArgTypes> +struct make_function_type +{ + typedef R type(const ArgTypes&... args); +}; + +template<typename T, typename U> +struct is_same { + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> { + static const bool value = true; +}; + +int a0[is_same<make_function_type<int>::type, int()>::value? 1 : -1]; +int a1[is_same<make_function_type<int, float>::type, int(const float&)>::value? 1 : -1]; +int a2[is_same<make_function_type<int, float>::type, int(const float&)>::value? 1 : -1]; +int a3[is_same<make_function_type<int, float, double>::type, int(const float&, double const&)>::value? 1 : -1]; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic17.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic17.C new file mode 100644 index 0000000..d54022a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic17.C @@ -0,0 +1,21 @@ +// { dg-do compile { target c++11 } } +template<typename R, typename... ArgTypes> +struct make_function_type +{ + typedef R type(const ArgTypes&......); +}; + +template<typename T, typename U> +struct is_same { + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> { + static const bool value = true; +}; + +int a0[is_same<make_function_type<int>::type, int(...)>::value? 1 : -1]; +int a1[is_same<make_function_type<int, float>::type, int(const float&...)>::value? 1 : -1]; +int a2[is_same<make_function_type<int, float>::type, int(const float&,...)>::value? 1 : -1]; +int a3[is_same<make_function_type<int, float, double>::type, int(const float&, double const&...)>::value? 1 : -1]; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic18.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic18.C new file mode 100644 index 0000000..fc0e2dd --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic18.C @@ -0,0 +1,47 @@ +// { dg-do compile { target c++11 } } +template<typename...> class tuple { }; + +template<typename T, template<typename T> class... Metafunctions> +struct apply_all +{ + typedef tuple<typename Metafunctions<T>::type...> type; +}; + +template<typename T, typename U> +struct is_same { + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> { + static const bool value = true; +}; + +template<typename T> +struct add_pointer { + typedef T* type; +}; + +template<typename T> +struct add_pointer<T&> +{ + typedef T& type; +}; + +template<typename T> +struct add_reference { + typedef T& type; +}; + +template<typename T> +struct add_reference<T&> +{ + typedef T& type; +}; + +int a0[is_same<apply_all<int>::type,tuple<> >::value? 1 : -1]; +int a1[is_same<apply_all<int, add_pointer>::type,tuple<int*> >::value? 1 : -1]; +int a2[is_same<apply_all<int, add_pointer, add_reference>::type,tuple<int*, int&> >::value? 1 : -1]; +int a3[is_same<apply_all<int&, add_pointer, add_reference>::type,tuple<int&, int&> >::value? 1 : -1]; + + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic19.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic19.C new file mode 100644 index 0000000..0ae2672 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic19.C @@ -0,0 +1,19 @@ +// { dg-do compile { target c++11 } } +template<typename... Args> +struct tuple { + static const int value = 0; +}; + +template<typename T, template<class T> class... Metafunctions> +struct tuple<Metafunctions<T>...> { + static const int value = 1; +}; + +template<typename T> struct add_pointer; +template<typename T> struct add_reference; + +int a0[tuple<int, float>::value == 0? 1 : -1]; +int a1[tuple<add_pointer<int>, add_pointer<float> >::value == 0? 1 : -1]; +int a2[tuple<>::value == 0? 1 : -1]; +int a3[tuple<add_pointer<int> >::value == 1? 1 : -1]; +int a4[tuple<add_pointer<int>, add_reference<int> >::value == 1? 1 : -1]; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic2.C new file mode 100644 index 0000000..3d127ea --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic2.C @@ -0,0 +1,17 @@ +// { dg-do compile { target c++11 } } +template<typename... Args = int> // { dg-error "default argument" } +class tuple2; + +template<typename... = int> // { dg-error "default argument" } +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" "2 or more" } +// { dg-error "invalid type" "invalid type" { target *-*-* } 11 } + +void f() +{ + two_or_more<int, float> z = 5; // { dg-error "two_or_more<int, float>" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic20.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic20.C new file mode 100644 index 0000000..5b5a234 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic20.C @@ -0,0 +1,47 @@ +// { dg-do compile { target c++11 } } +template<typename T> struct add_pointer; +template<typename T> struct add_reference; + +template<template<class T> class... Metafunctions> +struct metatuple { + static const int value = 0; +}; + +template<> +struct metatuple<add_pointer> { + static const int value = 1; +}; + +template<template<class T> class Meta> +struct metatuple<Meta, Meta> { // { dg-error "candidates" } + static const int value = 2; +}; + +template<template<class T> class... Metafunctions> +struct metatuple<add_pointer, Metafunctions...> { // { dg-error "" } + static const int value = 3; +}; + +template<template<class T> class First, + template<class T> class... Metafunctions> +struct metatuple<First, Metafunctions...> { // { dg-error "struct" } + static const int value = 4; +}; + +template<template<class T> class First, + template<class T> class Second, + template<class T> class... Metafunctions> +struct metatuple<First, Second, Metafunctions...> { // { dg-error "struct" } + static const int value = 5; +}; + +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" "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" "bound" } +int a4[metatuple<add_reference>::value == 4? 1 : -1]; +int a5[metatuple<add_reference, add_pointer>::value == 5? 1 : -1]; + +// { dg-error "incomplete" "incomplete" { target *-*-* } 40 } +// { dg-error "incomplete" "incomplete" { target *-*-* } 42 } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic21.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic21.C new file mode 100644 index 0000000..a379bd1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic21.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } +template<typename T, int... Dims> +struct array { }; + +array<int> a0; +array<int, 1> a1; +array<int, 1, 2, 3, 4> a1234; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic22.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic22.C new file mode 100644 index 0000000..932d25b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic22.C @@ -0,0 +1,21 @@ +// { dg-do compile { target c++11 } } +template<typename R, typename... ArgTypes> +struct make_function_type +{ + typedef R type(ArgTypes... args); +}; + +template<typename T, typename U> +struct is_same { + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> { + static const bool value = true; +}; + +int a0[is_same<make_function_type<int>::type, int()>::value? 1 : -1]; +int a1[is_same<make_function_type<int, float>::type, int(float)>::value? 1 : -1]; +int a2[is_same<make_function_type<int, float>::type, int(float)>::value? 1 : -1]; +int a3[is_same<make_function_type<int, float, double>::type, int(float, double const)>::value? 1 : -1]; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic23.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic23.C new file mode 100644 index 0000000..15825f3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic23.C @@ -0,0 +1,25 @@ +// { dg-do compile { target c++11 } } +template<typename T, int... Dims> +struct array { + static const int value = 0; +}; + +template<> +struct array<int, 17> { + static const int value = 1; +}; + +template<int... Dims> +struct array<float, 1, Dims...> { + static const int value = 2; +}; + +template<typename T, int... Dims> +struct array<T, 1, Dims...> { + static const int value = 3; +}; + +int a0[array<int>::value == 0? 1 : -1]; +int a1[array<int, 17>::value == 1? 1 : -1]; +int a2[array<float, 1, 2, 3>::value == 2? 1 : -1]; +int a3[array<double, 1, 2, 3>::value == 3? 1 : -1]; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic24.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic24.C new file mode 100644 index 0000000..4f172cd --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic24.C @@ -0,0 +1,6 @@ +// { dg-do compile { target c++11 } } +template<typename T, T... Values> +struct vector_c { }; + +vector_c<int, 17, 42> intvec; +vector_c<char, 'a', 'b', 'c'> charvec; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic25.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic25.C new file mode 100644 index 0000000..5963760 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic25.C @@ -0,0 +1,16 @@ +// { dg-do compile { target c++11 } } +template<int... Values> +struct sum; + +template<> +struct sum<> { + static const int value = 0; +}; + +template<int Value, int... Values> +struct sum<Value, Values...> { + static const int value = Value + sum<Values...>::value; +}; + +int a0[sum<>::value == 0? 1 : -1]; +int a1[sum<1, 2, 3, 4, 5>::value == 15? 1 : -1]; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic26.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic26.C new file mode 100644 index 0000000..2dbf092 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic26.C @@ -0,0 +1,24 @@ +// { dg-do compile { target c++11 } } +template<template<int, int> class Meta, int Initial, int... Values> +struct accumulate { + static const int value = Initial; +}; + +template<template<int, int> class Meta, int Initial, int Value, int... Rest> +struct accumulate<Meta, Initial, Value, Rest...> { + static const int value = + Meta<Value, accumulate<Meta, Initial, Rest...>::value>::value; +}; + +template<int X, int Y> +struct sum { + static const int value = X + Y; +}; + +template<int X, int Y> +struct prod { + static const int value = X * Y; +}; + +int a0[accumulate<sum,0,1,2,3,4,5>::value == 15? 1 : -1]; +int a1[accumulate<prod,1,1,2,3,4,5>::value == 120? 1 : -1]; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic27.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic27.C new file mode 100644 index 0000000..d690bb9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic27.C @@ -0,0 +1,22 @@ +// { dg-do compile { target c++11 } } +template<typename Signature> +struct function_traits; + +template<typename R, typename... ArgTypes> +struct function_traits<R(ArgTypes...)> { + typedef R result_type; +}; + +template<typename T, typename U> +struct same_type { + static const bool value = false; +}; + +template<typename T> +struct same_type<T, T> { + static const bool value = true; +}; + +int a0[same_type<function_traits<int()>::result_type, int>::value? 1 : -1]; +int a1[same_type<function_traits<int(float)>::result_type, int>::value? 1 : -1]; +int a2[same_type<function_traits<int(double, char)>::result_type, int>::value? 1 : -1]; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic28.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic28.C new file mode 100644 index 0000000..b027861 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic28.C @@ -0,0 +1,25 @@ +// { dg-do compile { target c++11 } } +template<typename Signature> +struct function_traits; + +template<typename R, typename... ArgTypes> +struct function_traits<R(ArgTypes......)> { + typedef R result_type; +}; + +template<typename T, typename U> +struct same_type { + static const bool value = false; +}; + +template<typename T> +struct same_type<T, T> { + static const bool value = true; +}; + +int a0[same_type<function_traits<int(double, char...)>::result_type, int>::value? 1 : -1]; +int a1[same_type<function_traits<int(double, char,...)>::result_type, int>::value? 1 : -1]; +int a2[same_type<function_traits<int(char,...)>::result_type, int>::value? 1 : -1]; +int a3[same_type<function_traits<int(...)>::result_type, int>::value? 1 : -1]; +int a4[same_type<function_traits<int(double x, char...)>::result_type, int>::value? 1 : -1]; +int a5[same_type<function_traits<int(double, char y...)>::result_type, int>::value? 1 : -1]; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic29.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic29.C new file mode 100644 index 0000000..8931e0f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic29.C @@ -0,0 +1,35 @@ +// { dg-do compile { target c++11 } } +template<typename Signature> +struct function_traits; + +template<typename R, typename... ArgTypes> +struct function_traits<R(ArgTypes...)> { + typedef R result_type; +}; + +template<typename R, typename Class, typename... ArgTypes> +struct function_traits<R (Class::*)(ArgTypes...)> { + typedef R result_type; +}; + +template<typename R, typename Class, typename... ArgTypes> +struct function_traits<R (Class::*)(ArgTypes...) const> { + typedef R result_type; +}; + +template<typename T, typename U> +struct same_type { + static const bool value = false; +}; + +template<typename T> +struct same_type<T, T> { + static const bool value = true; +}; + +struct X {}; + +int a0[same_type<function_traits<int (X::*)()>::result_type, int>::value? 1 : -1]; +int a1[same_type<function_traits<int (X::*)(float)>::result_type, int>::value? 1 : -1]; +int a2[same_type<function_traits<int (X::*)(double, char)>::result_type, int>::value? 1 : -1]; +int a3[same_type<function_traits<int (X::*)(double, char) const>::result_type, int>::value? 1 : -1]; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic3.C new file mode 100644 index 0000000..c4a5b55 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic3.C @@ -0,0 +1,10 @@ +// { dg-do compile { target c++11 } } +template<typename... Args> +class tuple {}; + +void f() +{ + tuple<> x; + tuple<int> y; + tuple<int, float> z; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic30.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic30.C new file mode 100644 index 0000000..0d8c0c9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic30.C @@ -0,0 +1,11 @@ +// { dg-do compile { target c++11 } } +template<typename... T> +void eat(T...); + +void f() +{ + eat(); + eat(1); + eat(1, 2); + eat(17, 3.14159, "Hello, World!"); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic31.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic31.C new file mode 100644 index 0000000..cffd703 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic31.C @@ -0,0 +1,12 @@ +// { dg-options "-g" } +// { dg-do compile { target c++11 } } +template<typename... T> +void eat(T...) { } + +void f() +{ + eat(); + eat(1); + eat(1, 2); + eat(17, 3.14159, "Hello, World!"); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic32.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic32.C new file mode 100644 index 0000000..0c5f6ee --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic32.C @@ -0,0 +1,11 @@ +// { dg-do compile { target c++11 } } +template<typename... T> +void eat(const T&...) { } + +void f() +{ + eat(); + eat(1); + eat(1, 2); + eat(17, 3.14159, "Hello, World!"); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic33.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic33.C new file mode 100644 index 0000000..bd25b84 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic33.C @@ -0,0 +1,16 @@ +// { dg-do compile { target c++11 } } +void print_all() {} + +template<typename T, typename... Rest> +void print_all(const T& t, const Rest&... rest) +{ + print_all(rest...); +} + +void f() +{ + print_all(); + print_all(1); + print_all(1, 3.14159); + print_all("Hello, World!", 17, 3.14159); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic34.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic34.C new file mode 100644 index 0000000..ae92bac --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic34.C @@ -0,0 +1,11 @@ +// { dg-do compile { target c++11 } } +template<int I, typename... Args> +void get_ith(const Args&... args); + +void f() +{ + get_ith<1>(1, 2, 3); + get_ith<1, int>(1, 2.0, 'x'); + get_ith<1, int, double>(1, 2.0, 'x'); + get_ith<1, int, double, char>(1, 2.0, 'x'); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic35.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic35.C new file mode 100644 index 0000000..8365c9b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic35.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } +template<int I, typename... Args> +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 "too few arguments" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic36.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic36.C new file mode 100644 index 0000000..c60e6d0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic36.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } +template<typename T, typename... Args> +void f(const T&, const Args&... args) +{ + f(args); // { dg-error "packs not expanded" } +} + +template<typename... Values> +struct tuple_base { }; + +template<typename... Values> +struct tuple : tuple_base<Values> { }; // { dg-error "packs not expanded" } + +// { dg-message "args" "note" { target *-*-* } 5 } +// { dg-message "Values" "note" { target *-*-* } 12 } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic37.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic37.C new file mode 100644 index 0000000..db488ef --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic37.C @@ -0,0 +1,10 @@ +// { dg-do compile { target c++11 } } +template<typename... Values> +struct tuple +{ + static const __SIZE_TYPE__ length = sizeof...(Values); +}; + +int a0[tuple<>::length == 0? 1 : -1]; +int a1[tuple<int>::length == 1? 1 : -1]; +int a2[tuple<int, float>::length == 2? 1 : -1]; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic38.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic38.C new file mode 100644 index 0000000..62031a3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic38.C @@ -0,0 +1,6 @@ +// { dg-do compile { target c++11 } } +template<int... Values> +struct int_vec {}; + +template<int... Values> +struct int_vec<0, (Values+1)...> {}; // { dg-error "involves template parameter" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic39.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic39.C new file mode 100644 index 0000000..b603478 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic39.C @@ -0,0 +1,13 @@ +// { dg-do compile { target c++11 } } +template<typename... Args> +struct tuple {}; + +template<typename T, typename... Args> +struct tuple<Args..., T> { }; // { dg-error "end" } + + +template<int... Values> +struct int_vec { }; + +template<int I, int... Values> +struct int_vec<Values..., I> { }; // { dg-error "end" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic4.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic4.C new file mode 100644 index 0000000..8e8f814 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic4.C @@ -0,0 +1,15 @@ +// { dg-options "-fabi-version=0" } +// { dg-do compile { target c++11 } } +template<typename... Args> +class tuple {}; + +void f_none(tuple<>) {} +void f_one(tuple<int>) {} +void f_two(tuple<int, float>) {} +void f_nested(tuple<int, tuple<double, char>, float>) { } + + +// { 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-4.9/gcc/testsuite/g++.dg/cpp0x/variadic40.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic40.C new file mode 100644 index 0000000..e4df9b8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic40.C @@ -0,0 +1,3 @@ +// { dg-do compile { target c++11 } } +template<typename... Values, typename T> +struct backward_tuple {}; // { dg-error "end" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic41.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic41.C new file mode 100644 index 0000000..df11367 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic41.C @@ -0,0 +1,14 @@ +// A function parameter pack is only deduced if it's at the end +// { dg-do compile { target c++11 } } +template<typename... Args> +void f(const Args&... args, int oops); + +int main() +{ + f<>(1); + f(1); + f<int>(1,2); + f(1,2); // { dg-error "no match" } +} + +// { dg-prune-output "note" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic42.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic42.C new file mode 100644 index 0000000..b1aa141 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic42.C @@ -0,0 +1,12 @@ +// { dg-options "-fabi-version=5" } +// { dg-do compile { target c++11 } } +template<typename... Args> +void f(Args...) { } + +void g() +{ + f<int*, float*, double*>(0, 0, 0); + f<int*>(0,0,0); +} +// { dg-final { scan-assembler "_Z1fIIPiPfPdEEvDpT_" } } +// { dg-final { scan-assembler "_Z1fIIPiiiEEvDpT_" } } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic43.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic43.C new file mode 100644 index 0000000..b2f1f8d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic43.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } +template<typename... Args> +int f(const Args&...); + +void g() +{ + int (*fp)(const int&, const float&) = &f; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic44.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic44.C new file mode 100644 index 0000000..01df2e0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic44.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } +template<typename... Args> +int f(const Args&...); + +template<typename T> void g(T) { } + +void h() +{ + g(&f<int, float>); +} + +// { dg-final { scan-assembler "_Z1gIPFiRKiRKfEEvT_"} } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic45.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic45.C new file mode 100644 index 0000000..2a79bc8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic45.C @@ -0,0 +1,10 @@ +// { dg-do compile { target c++11 } } +template<typename... Args> +int& f(Args...); + +template<typename T1, typename T2> +float& f(T1, T2); + +float& g() { + return f(17, 3.14159); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic46.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic46.C new file mode 100644 index 0000000..0ea4ba6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic46.C @@ -0,0 +1,11 @@ +// { dg-do compile { target c++11 } } +template<typename... Args> +int& f(Args&...); + +template<typename... Args> +float& f(const Args&...); + +int& g(int x, float y) +{ + return f(x, y); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic47.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic47.C new file mode 100644 index 0000000..53916a9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic47.C @@ -0,0 +1,18 @@ +// { dg-do compile { target c++11 } } +template<typename T> struct wrap { }; + +template<typename... Args> +int& f(const Args&...); + +template<typename... Args> +float& f(const wrap<Args>&...); + +int& g(int x, float y, double z) +{ + return f(x, y, z); +} + +float& h(wrap<int> x, wrap<float> y, wrap<double> z) +{ + return f(x, y, z); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic48.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic48.C new file mode 100644 index 0000000..e672e76 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic48.C @@ -0,0 +1,10 @@ +// { dg-do compile { target c++11 } } +template<typename T, typename... Args> +int& f(const T&, Args...); + +template<typename T> +float& f(const T&); + +float& g() { + return f(17); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic49.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic49.C new file mode 100644 index 0000000..49c2675 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic49.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } +int& f(...); + +template<typename... Args> +float& f(Args...); + +float& g() { + return f(17, 3.14159); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic5.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic5.C new file mode 100644 index 0000000..6595b7f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic5.C @@ -0,0 +1,38 @@ +// { dg-do compile { target c++11 } } +template<typename... Args> +struct tuple { + static const int value = 0; +}; + +template<> +struct tuple<> { + static const int value = 1; +}; + +template<> +struct tuple<int> { + static const int value = 2; +}; + + +template<> +struct tuple<int, float> { + static const int value = 3; +}; + +template<typename T> +struct tuple<T, T> { + static const int value = 4; +}; + +template<> +struct tuple<float, float> { + static const int value = 5; +}; + +int a0[tuple<float>::value == 0? 1 : -1]; +int a1[tuple<>::value == 1? 1 : -1]; +int a2[tuple<int>::value == 2? 1 : -1]; +int a3[tuple<int, float>::value == 3? 1 : -1]; +int a4[tuple<int, int>::value == 4? 1 : -1]; +int a5[tuple<float, float>::value == 5? 1 : -1]; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic50.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic50.C new file mode 100644 index 0000000..99e1699 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic50.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } +int& f(int, double, ...); + +template<typename... Args> +float& f(Args...); + +float& g() { + return f(17, 3.14159, 3); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic51.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic51.C new file mode 100644 index 0000000..e072caa --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic51.C @@ -0,0 +1,10 @@ +// { dg-do compile { target c++11 } } +template<typename T1, typename T2> +float& f(T1, T2); + +template<typename... Args> +int& f(Args...); + +float& g() { + return f(17, 3.14159); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic52.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic52.C new file mode 100644 index 0000000..28ef857 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic52.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } +template<typename T, T... Values> +struct vector_c { }; + +vector_c<int, 1, 2, 3> v1; +vector_c<char, 'a', 'b', 'c'> v2; +vector_c<long, 1u, 2, 3l> v3; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic53.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic53.C new file mode 100644 index 0000000..ef3d150 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic53.C @@ -0,0 +1,17 @@ +// { dg-do compile { target c++11 } } +template<typename F, typename... BoundArgs> +class bound_functor +{ + public: + typedef typename F::result_type result_type; + + template<typename... Args> + typename F::result_type operator()(Args&... args); +}; + +template<typename F, typename... BoundArgs> +template<typename... Args> +typename F::result_type +bound_functor<F, BoundArgs...>::operator()(Args&... args) +{ +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic54.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic54.C new file mode 100644 index 0000000..3fbeefd --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic54.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } +template<typename F, typename... BoundArgs> +class bound_functor +{ + public: + bound_functor(); +}; + +template<typename F, typename... BoundArgs> +bound_functor<F, BoundArgs...>::bound_functor() +{ +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic55.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic55.C new file mode 100644 index 0000000..bdf25cf --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic55.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } +template<typename F, typename... BoundArgs> +class bound_functor +{ + public: + bound_functor(const BoundArgs&... bound_args); +}; + +template<typename F, typename... BoundArgs> +bound_functor<F, BoundArgs...>::bound_functor(const BoundArgs&...) +{ +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic56.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic56.C new file mode 100644 index 0000000..50b2445 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic56.C @@ -0,0 +1,19 @@ +// { dg-do compile { target c++11 } } +template<typename... Elements> +struct tuple { }; + +template<typename T, typename... Elements> +struct tuple<T, Elements...> { + int foo(); +}; + +template<typename T, typename... Elements> +struct tuple<T*, Elements...> { + int bar(); +}; + +template<typename T, typename... Elements> +int tuple<T, Elements...>::foo() { return 0; } + +template<typename T, typename... Elements> +int tuple<T*, Elements...>::bar() { return 0; } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic57.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic57.C new file mode 100644 index 0000000..a3d2bf1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic57.C @@ -0,0 +1,16 @@ +// { dg-do compile { target c++11 } } +template<typename T, int... Dims> +struct array { + int foo(); +}; + +template<typename T> +struct array<T, 0> { + int bar(); +}; + +template<typename T, int... Dims> +int array<T, Dims...>::foo() { } + +template<typename T> +int array<T, 0>::bar() { } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic58.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic58.C new file mode 100644 index 0000000..1423322 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic58.C @@ -0,0 +1,16 @@ +// { dg-do compile { target c++11 } } +#include <typeinfo> + +template<typename... Args> +void foo(Args...) { } + +template<typename... Args> +void bar(Args... args) { + foo(Args()...); + foo(args = args...); + foo(reinterpret_cast<void*>(&args)...); + foo(const_cast<const Args>(args)...); + foo(static_cast<void*>(&args)...); + foo(dynamic_cast<void*>(&args)...); + foo(typeid(Args)...); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic59.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic59.C new file mode 100644 index 0000000..817883c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic59.C @@ -0,0 +1,4 @@ +// { dg-do compile { target c++11 } } +template<class T, typename... VarArgs> +void print(T t, VarArgs args); // { dg-error "packs not expanded" } +// { dg-message "VarArgs" "note" { target *-*-* } 3 } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic6.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic6.C new file mode 100644 index 0000000..3dc74cc --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic6.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } +template<typename ... Args> +struct tuple_base {}; + +template<typename ... Args> +struct tuple : public tuple_base<Args...> +{ +}; + +tuple<> zero; +tuple<int> one; +tuple<float, int> two; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic60.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic60.C new file mode 100644 index 0000000..57bbcfe --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic60.C @@ -0,0 +1 @@ +template<typename... Args> class tuple; // { dg-error "variadic templates" "" { target { ! c++11 } } } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic61.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic61.C new file mode 100644 index 0000000..d06c5f6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic61.C @@ -0,0 +1,2 @@ +// { dg-options "-std=gnu++98 -pedantic" } +template<typename... Args> class tuple; // { dg-warning "variadic templates" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic62.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic62.C new file mode 100644 index 0000000..010b3a5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic62.C @@ -0,0 +1,2 @@ +// { dg-options "-std=gnu++98 -pedantic-errors" } +template<typename... Args> class tuple; // { dg-error "variadic templates" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic63.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic63.C new file mode 100644 index 0000000..945b95c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic63.C @@ -0,0 +1,3 @@ +// { dg-options "-pedantic" } +// { dg-do compile { target c++11 } } +template<typename... Args> class tuple; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic64.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic64.C new file mode 100644 index 0000000..d7c313d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic64.C @@ -0,0 +1,19 @@ +// { dg-do compile { target c++11 } } +template<int... Indexes> + struct _Index_tuple { }; + +template<int _Num, typename _Tuple = _Index_tuple<> > +struct _Build_index_tuple; + +template<int _Num, int... _Indexes> +struct _Build_index_tuple<_Num, _Index_tuple<_Indexes...> > + : _Build_index_tuple<_Num - 1, + _Index_tuple<_Indexes..., sizeof...(_Indexes)> > +{ +}; + +template<int... _Indexes> +struct _Build_index_tuple<0, _Index_tuple<_Indexes...> > +{ + typedef _Index_tuple<_Indexes...> __type; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic65.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic65.C new file mode 100644 index 0000000..e2ef931 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic65.C @@ -0,0 +1,13 @@ +// { dg-do compile { target c++11 } } +struct unused; +template<typename T1 = unused, typename T2 = unused, typename T3 = unused, + typename T4 = unused, typename T5 = unused, typename T6 = unused> +struct tuple {}; + +template<typename... Args> +tuple<Args...> foo() { } // { dg-bogus "cannot expand" "" } + +int main() +{ + foo<int,int,int,int,int,int>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic66.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic66.C new file mode 100644 index 0000000..ac92221 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic66.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +template<typename Result, typename Functor, typename... ArgTypes> +Result bind(Functor, ArgTypes...) { } + +void f() +{ + bind<int>(17, 20, 22); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic67.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic67.C new file mode 100644 index 0000000..6e328cf --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic67.C @@ -0,0 +1,24 @@ +// { dg-do compile { target c++11 } } +template<typename... Elements> struct tuple {}; + +template<typename... Args> +struct nested +{ + typedef tuple<tuple<Args, Args...>...> type; +}; + +template<typename T, typename U> +struct is_same +{ + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> +{ + static const bool value = true; +}; + +int a0[is_same<nested<int, float>::type, + tuple<tuple<int, int, float>, + tuple<float, int, float> > >::value? 1 : -1]; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic68.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic68.C new file mode 100644 index 0000000..edcdfa8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic68.C @@ -0,0 +1,22 @@ +// { dg-do run { target c++11 } } +extern "C" void abort(); + +template<typename T, T... Values> +void f(T* expected_values, int n) +{ + if (sizeof...(Values) != n) + abort (); + + T values[] = { Values... }; + for (int i = 0; i < n; ++i) + if (values[i] != expected_values[i]) + abort(); +} + +int main() +{ + int test_arr1[3] = { 1, 2, 3 }; + f<int, 1, 2, 3>(test_arr1, 3); + + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic69.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic69.C new file mode 100644 index 0000000..660e09a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic69.C @@ -0,0 +1,34 @@ +// { dg-do compile { target c++11 } } +template<typename T> +struct stored_value +{ + explicit stored_value() : value() { } + + explicit stored_value(const T& value) : value(value) { } + + stored_value(int, const T& value) : value(value) { } + + T value; +}; + +template<typename... Values> +struct myclass : public stored_value<Values>... +{ + myclass() { } + + explicit myclass(const Values&... values) + : stored_value<Values>(values)... { } + + explicit myclass(int x, const Values&... values) + : stored_value<Values>(x, values)... { } + +}; + +void f() +{ + int i; + float f; + myclass<int*, float*> ifp1; + myclass<int*, float*> ifp2(&i, &f); + myclass<int*, float*> ifp3(1, &i, &f); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic7.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic7.C new file mode 100644 index 0000000..8b04996 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic7.C @@ -0,0 +1,33 @@ +// { dg-do compile { target c++11 } } +template<typename... Args> +struct tuple_base { + static const int value = 0; +}; + +template<> +struct tuple_base<int> { + static const int value = 1; +}; + +template<> +struct tuple_base<int, float> { + static const int value = 2; +}; + +template<> +struct tuple_base<float, int> { + static const int value = 3; +}; + +template<typename... Args> +struct int_tuple : tuple_base<int, Args...> { }; + +template<typename... Args> +struct tuple_int : tuple_base<Args..., int> { }; + +int a0a[int_tuple<int>::value == 0? 1 : -1]; +int a0b[int_tuple<int>::value == 0? 1 : -1]; +int a1a[int_tuple<>::value == 1? 1 : -1]; +int a1b[tuple_int<>::value == 1? 1 : -1]; +int a2[int_tuple<float>::value == 2? 1 : -1]; +int a3[tuple_int<float>::value == 3? 1 : -1]; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic70.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic70.C new file mode 100644 index 0000000..df26c6a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic70.C @@ -0,0 +1,21 @@ +// { dg-do run { target c++11 } } +template <typename T, T... Args> struct bomb; + +template <typename T> +struct bomb<T> { + static const T value = 0; +}; + +template <typename T, T v, T... Args> +struct bomb<T, v, Args...> { + static const T value = v + bomb<T, Args...>::value; +}; + +extern "C" void abort(); + +int main() { + bomb<int, 1, 2, 3, 4> b; + if (b.value != 10) + abort(); + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic71.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic71.C new file mode 100644 index 0000000..101d220 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic71.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } +template<typename...> struct list {}; + +template<typename Sequence, typename Head> +struct push_front; + +template<typename... Elements, typename Head> +struct push_front<list<Elements...>, Head> { + typedef list<Head, Elements> type; // { dg-error "parameter packs not expanded" } +}; + +// { dg-message "Elements" "note" { target *-*-* } 9 } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic72.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic72.C new file mode 100644 index 0000000..41f83c3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic72.C @@ -0,0 +1,21 @@ +// { dg-do compile { target c++11 } } +struct A {}; +struct B {}; +struct C {}; + +template<typename... Mixins> +struct mixed_up : public Mixins... +{ +}; + +void fA(A); +void fB(B); +void fC(C); + +void g() +{ + mixed_up<A, B, C> m; + fA(m); + fB(m); + fC(m); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic73.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic73.C new file mode 100644 index 0000000..533ed46 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic73.C @@ -0,0 +1,32 @@ +// { dg-do run { target c++11 } } +struct A {}; +struct B {}; +struct C {}; + +template<typename... Exceptions> void f(int idx) throw(Exceptions...) { + if (idx == 0) throw A(); + else if (idx == 1) throw B(); + else if (idx == 2) throw C(); +} + +extern "C" void abort(); + +int main() +{ + try { + f<A, B, C>(0); + abort(); + } catch (A) { + } + try { + f<A, B, C>(1); + abort(); + } catch (B) { + } + try { + f<A, B, C>(2); + abort(); + } catch (C) { + } + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic74.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic74.C new file mode 100644 index 0000000..1af6531 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic74.C @@ -0,0 +1,28 @@ +// { 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 non-type parameter" } +}; + +template<class... Types> class B +{ +public: + template <Types*... Values> class X { + typename A<Types*...>::template X<Values...> foo; + }; +}; + +int i; +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" "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; + +// { dg-prune-output "provided for" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic75.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic75.C new file mode 100644 index 0000000..a3aa070 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic75.C @@ -0,0 +1,33 @@ +// { dg-do compile { target c++11 } } + +template<typename...> struct tuple { }; + +template<template<typename T> class Meta, typename... Values> +struct apply_all +{ + typedef tuple<typename Meta<Values>::type...> type; +}; + +template<typename T, typename U> +struct is_same { + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> { + static const bool value = true; +}; + +template<typename T> +struct add_reference { + typedef T& type; +}; + +template<typename T> +struct add_reference<T&> { + typedef T& type; +}; + +static_assert(is_same<apply_all<add_reference, int, int&, float>::type, + tuple<int&, int&, float&> >::value, + "check apply"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic76.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic76.C new file mode 100644 index 0000000..d8d1ef9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic76.C @@ -0,0 +1,13 @@ +// PR c++/33496 +// { dg-do compile { target c++11 } } + +template<int... N> int foo () +{ + return sizeof... (N ()); // { dg-error "" } + return sizeof... (N) (); // { dg-error "" } +} + +int bar () +{ + return foo<0> (); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic77.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic77.C new file mode 100644 index 0000000..79badaa --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic77.C @@ -0,0 +1,21 @@ +// PR c++/33496 +// { dg-do compile { target c++11 } } + +template<int M, int N> struct pair +{ + int i, j; + pair () : i (M), j (N) {} +}; + +template<int... M> struct S +{ + template<int... N> static int foo () + { + return sizeof... (pair<M, N>); // { dg-error "" } + } +}; + +int bar () +{ + return S<0, 1, 2>::foo<0, 1> (); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic78.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic78.C new file mode 100644 index 0000000..0a42435 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic78.C @@ -0,0 +1,22 @@ +// PR c++/33496 +// { dg-do compile { target c++11 } } + +template<int M, int N> struct pair +{ + int i, j; + pair () : i (M), j (N) {} +}; + +template<int... M> struct S +{ + template<int... N> static int *foo () + { + static int x[] = { (M + N)... }; // { dg-error "mismatched argument pack lengths" } + return x; + } +}; + +int *bar () +{ + return S<0, 1, 2>::foo<0, 1> (); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic79.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic79.C new file mode 100644 index 0000000..389199c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic79.C @@ -0,0 +1,6 @@ +// PR c++/33213 +// { dg-do compile { target c++11 } } + +template<template<typename> class...> struct A; + +template<template<typename...> class... B> struct A<B...> {}; // { dg-error "mismatch|'template<class ...> class ... B ...'" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic8.C new file mode 100644 index 0000000..e2d7fa7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic8.C @@ -0,0 +1,23 @@ +// { dg-do compile { target c++11 } } +template<typename... Args> +struct tuple_base { + static const int value = 0; +}; + +template<> +struct tuple_base<int*> +{ + static const int value = 1; +}; + +template<typename T> +struct tuple_base<T*> +{ + static const int value = 2; +}; + +template<typename... Args> +struct tuple_of_pointers : tuple_base<Args*...> { }; + +int a1[tuple_of_pointers<int>::value == 1? 1 : -1]; +int a2[tuple_of_pointers<float>::value == 2? 1 : -1]; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic80.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic80.C new file mode 100644 index 0000000..0612e73 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic80.C @@ -0,0 +1,27 @@ +// PR c++/31434 +// { dg-do run { target c++11 } } + +extern "C" void abort (); + +template<typename... T> inline int foo (const T...) { return 1; } +template<typename... T> inline int foo (const T *...) { return 2; } + +void +bar (int *a) +{ + a[0] = foo (0); + a[1] = foo (*a); + a[2] = foo<int> (a); + a[3] = foo<int> (2, 3, 4, 5); + a[4] = foo<int> (a, a + 1, a + 2); +} + +int +main () +{ + int a[5]; + bar (a); + if (a[0] != 1 || a[1] != 1 || a[2] != 2 || a[3] != 1 || a[4] != 2) + abort (); + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic81.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic81.C new file mode 100644 index 0000000..0877255 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic81.C @@ -0,0 +1,11 @@ +// PR c++/33461 +// { dg-do compile { target c++11 } } + +template<typename> struct A; + +template<typename... T> struct A<T*> // { dg-error "not expanded|T|not used|T" } +{ + struct B; +}; + +A<void*> a; // { dg-error "incomplete" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic82.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic82.C new file mode 100644 index 0000000..f9bbc35 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic82.C @@ -0,0 +1,11 @@ +// PR c++/33461 +// { dg-do compile { target c++11 } } + +template<typename> struct A; + +template<typename... T> struct A<T*...> // { dg-bogus "cannot expand" "" } +{ + struct B; +}; + +A<void*> a; // { dg-bogus "incomplete type" "" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic83.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic83.C new file mode 100644 index 0000000..507fc7e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic83.C @@ -0,0 +1,8 @@ +// PR c++/31441 +// { dg-do compile { target c++11 } } + +template<typename> struct A; + +template<typename... T> struct A<T...> { }; // { dg-bogus "cannot expand" "" } + +A<int> a; // { dg-bogus "incomplete type" "" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic84.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic84.C new file mode 100644 index 0000000..debe75c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic84.C @@ -0,0 +1,25 @@ +// PR c++/32565 +// { dg-do compile { target c++11 } } + +template<typename...> struct A1; +template<template<int...> class T> struct A1<T<0> > {}; +template<typename...> struct A2; +template<template<int...> class T> struct A2<T<0, 1> > {}; +template<typename...> struct A3; +template<template<int, int...> class T> struct A3<T<0, 1> > {}; +template<typename...> struct A4; +template<template<typename...> class T> struct A4<T<int> > {}; +template<typename...> struct A5; +template<template<typename...> class T> struct A5<T<int, long> > {}; +template<typename...> struct A6; +template<template<typename, typename...> class T> struct A6<T<int, long> > {}; +template<int> struct B1 {}; +template<int, int> struct B2 {}; +template<typename> struct B3 {}; +template<typename, typename> struct B4 {}; +A1<B1<0> > a1; +A2<B2<0, 1> > a2; +A3<B2<0, 1> > a3; +A4<B3<int> > a4; +A5<B4<int, long> > a5; +A6<B4<int, long> > a6; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic85.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic85.C new file mode 100644 index 0000000..708104a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic85.C @@ -0,0 +1,9 @@ +// PR c++/32565 +// { dg-do compile { target c++11 } } + +template<typename...> struct A1; +template<template<int, int...> class T> struct A1<T<0, 1> > {}; +template<int, int, int...> struct B1 {}; +A1<B1<0, 1> > a1; +template<int...> struct B2 {}; +A1<B2<0, 1> > a2; // { dg-error "incomplete type" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic86.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic86.C new file mode 100644 index 0000000..2213ef7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic86.C @@ -0,0 +1,18 @@ +// PR c++/33943 +// { dg-do compile { target c++11 } } + +template<typename... A> struct foo {}; + +template<typename A0, typename... A1> struct bar {}; + +template<typename U> struct baz; + +template<template<typename...> class T, typename... U> struct baz< T<U...> > +{}; + +template<template<typename, typename...> class T, typename U, typename... V> +struct baz< T<U, V...> > +{}; + +baz< foo<int, short> > b1; +baz< bar<int, short> > b2; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic87.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic87.C new file mode 100644 index 0000000..f3c0092 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic87.C @@ -0,0 +1,23 @@ +// PR c++/33965 +// { dg-do compile { target c++11 } } +template<typename T> +struct foo +{ + static bool const value = false; +}; + +template<template<typename...> class T, typename... Args> +struct foo<T<Args...> > +{ + static bool const value = true; +}; + +template<int I> +struct int_ +{}; + +int main() +{ + static_assert(foo<int_<0> >::value == false, + "picked up partial specialization, but should not have"); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic88.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic88.C new file mode 100644 index 0000000..b96c719 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic88.C @@ -0,0 +1,23 @@ +// { dg-do compile { target c++11 } } + +template<template<typename...> class TT> +TT<int, float, double> foo(TT<int, float>) +{ + return TT<int, float, double>(); +} + +template<typename T> +int& foo(T) +{ + static int i = 0; return i; +} + +template<typename T, typename U> +struct pair {}; + +void bar() +{ + pair<int, float> p; + int& i = foo(p); +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic89.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic89.C new file mode 100644 index 0000000..1e59c1a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic89.C @@ -0,0 +1,14 @@ +// { dg-do compile { target c++11 } } +// Contributed by Eric Niebler +template<typename T, typename U> +struct pair +{}; + +template<typename T> +struct test; + +template<template<typename...> class T, typename... Args> +struct test<T<Args...> > +{}; + +test<pair<int, double> > t; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic9.C new file mode 100644 index 0000000..795da57 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic9.C @@ -0,0 +1,38 @@ +// { dg-do compile { target c++11 } } +template<typename T1, typename T2> +struct pair {}; + +template<typename... Args> +struct tuple { + static const int value = 0; +}; + +template<> +struct tuple<pair<int, float> > { + static const int value = 1; +}; + +template<typename U> +struct tuple<pair<int, U> > { + static const int value = 2; +}; + +template<typename T, typename U> +struct tuple<pair<T, U>, pair<T, U> > { + static const int value = 3; +}; + + +template<typename... Outer> +struct X { + template<typename... Inner> + struct Y + { + typedef tuple<pair<Outer, Inner>...> type; + }; +}; + +int a0[X<int, double>::Y<short, char>::type::value == 0? 1 : -1]; +int a1[X<int>::Y<float>::type::value == 1? 1 : -1]; +int a2[X<int>::Y<double>::type::value == 2? 1 : -1]; +int a3[X<int, int>::Y<double, double>::type::value == 3? 1 : -1]; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic90.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic90.C new file mode 100644 index 0000000..587a0e8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic90.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } + +template<template<typename...> class TT> +struct X { }; + +template<typename T, typename U> struct pair { }; + +X<pair> x; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic91.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic91.C new file mode 100644 index 0000000..71f341c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic91.C @@ -0,0 +1,17 @@ +// { dg-do compile { target c++11 } } +template<int N> struct Int2Type { }; + +template<typename... T> +struct Outer { + template<typename... U> + void foo(Int2Type<sizeof...(T)>, Int2Type<sizeof...(U)>); +}; + + +Outer<short, int, long> outer; + +void g4() { + outer.foo<float, double>(Int2Type<3>(), Int2Type<2>()); +} + +template<typename... T, template<T...> class X> void f1(); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic92.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic92.C new file mode 100644 index 0000000..99159a2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic92.C @@ -0,0 +1,70 @@ +// Various tests for variadic templates and partial specialization. +// { dg-do compile { target c++11 } } + +// PR c++/36846 +template<typename A, typename B> +struct pair; + +template<typename... T> +struct pairs; + +template<typename... AS, typename... BS> +struct pairs<pair<AS, BS>...> { + struct mismatched_packs {}; +}; + +template class pairs< + pair<int, int>, + pair<int, int> +>; + +template<int A, int B> +struct point; + +template<typename... T> +struct points; + +template<int... AS, int... BS> +struct points<point<AS, BS>...> { + struct mismatched_packs {}; +}; + +template class points< + point<0, 1>, + point<0, 1> +>; + +// PR c++/35477 +template <class...ARGS> struct tuple {}; +template <class A, class B> struct test {}; +template <class... ARGS, class B> struct test<B, tuple<ARGS...>> +{ + template <class T> struct inside {}; +}; + +// PR c++/38276 +template<typename...> struct A; + +template<typename, typename> struct B; + +template<typename... T, typename... U> struct B<A<T...>, A<U...> > +{ + static int i; +}; + +B<A<>, A<int> > b1; + +B<A<int>, A<> > b2; + +// PR c++/35784 +template <typename...> struct p; + +template <typename, typename> struct d; + +template <typename... A, typename... B> +struct d<p<A...>, p<B...> > { typedef int t; }; + +typedef d<p<>, p<int, float> >::t q; +typedef d<q, d<p<int>, p<float> >::t> r; // * + +typedef d<d<p<>, p<int, float> >::t, d<p<>, p<> >::t> s; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic93.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic93.C new file mode 100644 index 0000000..63a1103 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic93.C @@ -0,0 +1,11 @@ +// PR c++/35297 +// { dg-do compile { target c++11 } } + +template <class T=int, class... ARGS> +struct test2 {}; + +int main() +{ + test2<> a; + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic94.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic94.C new file mode 100644 index 0000000..f5f3228 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic94.C @@ -0,0 +1,33 @@ +// PR c++/40595 +// { dg-do compile { target c++11 } } + +template<int N> +struct S +{ + typedef int type; +}; + +template<typename T> +struct Get +{ + static T get(); +}; + +template<typename F> +struct B +{ + template<typename ... Args> + typename S<sizeof( Get<F>::get() (Get<Args>::get() ...) )>::type + f(Args&& ... a); +}; + +struct X +{ + bool operator()(int) const; +}; + +int main() +{ + B<X> b; + b.f(1); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic95.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic95.C new file mode 100644 index 0000000..e383938 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic95.C @@ -0,0 +1,17 @@ +// PR c++/39863 +// { dg-do compile { target c++11 } } + +template <typename... T> +struct A {}; + +template <typename T, typename U> +struct S {}; + +template <typename... T, typename... U> +A< S<T, U>... > f(U... u) +{ return A< S<T, U>... >(); } + +int main() +{ + f<int>(0.0); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic96.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic96.C new file mode 100644 index 0000000..189c4eb --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic96.C @@ -0,0 +1,26 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/41785 +// { dg-do compile { target c++11 } } + +struct a {}; + +template < typename T, typename ENCLOSING > +struct base; + +template < typename... T > +struct derived + : public base< T, derived< T... > >... +{}; + +template < typename... T> +struct base< a, derived< T... > > +{ + typedef derived< T... > + Derived; +}; + +int main() +{ + derived< a > instance; +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic97.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic97.C new file mode 100644 index 0000000..b251cc3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic97.C @@ -0,0 +1,35 @@ +// PR c++/42266 +// { dg-do compile { target c++11 } } + +template<typename... _Elements> + class tuple; + +template<typename _Arg> + class _Mu; + +template<typename _Signature> + struct _Bind; + +template<typename _Functor, typename... _Bound_args> + class _Bind<_Functor(_Bound_args...)> + { + template<typename... _Args, typename + = decltype(_Functor()(_Mu<_Bound_args>()(_Bound_args(), + tuple<_Args...>())...) )> + void __call() { } + }; + +template<typename _Functor, typename _Arg> + _Bind<_Functor(_Arg)> + bind(_Functor, _Arg) { } + +struct State +{ + bool ready() { return true; } + + void f() + { + bind(&State::ready, this); + } +}; + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic98.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic98.C new file mode 100644 index 0000000..c463cac --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic98.C @@ -0,0 +1,410 @@ +// PR c++/42358 +// { dg-do assemble { target c++11 } } + +typedef __PTRDIFF_TYPE__ ptrdiff_t; +typedef __SIZE_TYPE__ size_t; +namespace std __attribute__ ((__visibility__ ("default"))) { + using ::size_t; +} +namespace std __attribute__ ((__visibility__ ("default"))) { + struct __sfinae_types { + typedef char __one; + typedef struct { + } __two; + }; + template<typename _Tp, _Tp __v> struct integral_constant { + static const _Tp value = __v; + typedef _Tp value_type; + typedef integral_constant<_Tp, __v> type; + }; + typedef integral_constant<bool, false> false_type; + template<typename> struct remove_cv; + template<typename> struct __is_void_helper : public false_type { + }; + template<typename _Tp> struct is_void : public integral_constant<bool, (__is_void_helper<typename remove_cv<_Tp>::type>::value)> { + }; + template<typename> struct is_array : public false_type { + }; + template<typename> struct is_function : public false_type { + }; + template<typename, unsigned _Uint = 0> struct extent : public integral_constant<std::size_t, 0> { + }; + template<typename _Tp> struct remove_const { + typedef _Tp type; + }; + template<typename _Tp> struct remove_volatile { + typedef _Tp type; + }; + template<typename _Tp> struct remove_cv { + typedef typename remove_const<typename remove_volatile<_Tp>::type>::type type; + }; + template<typename> struct is_lvalue_reference : public false_type { + }; + template<typename> struct is_rvalue_reference : public false_type { + }; + template<typename _Tp> struct is_reference : public integral_constant<bool, (is_lvalue_reference<_Tp>::value || is_rvalue_reference<_Tp>::value)> { + }; + template<typename _Tp> struct remove_reference { + typedef _Tp type; + }; + template<typename _Tp, bool = !is_reference<_Tp>::value && !is_void<_Tp>::value> struct __add_rvalue_reference_helper { + typedef _Tp type; + }; + template<typename _Tp> struct add_rvalue_reference : public __add_rvalue_reference_helper<_Tp> { + }; + template<typename _Tp> typename add_rvalue_reference<_Tp>::type declval(); + template<typename _From, typename _To, bool = (is_void<_From>::value || is_void<_To>::value || is_function<_To>::value || is_array<_To>::value)> struct __is_convertible_helper { + }; + template<typename _From, typename _To> struct __is_convertible_helper<_From, _To, false> : public __sfinae_types { + static __one __test(_To); + static __two __test(...); + static const bool __value = sizeof(__test(declval<_From>())) == 1; + }; + template<typename _From, typename _To> struct is_convertible : public integral_constant<bool, __is_convertible_helper<_From, _To>::__value> { + }; + template<bool, typename _Tp = void> struct enable_if { + }; + template<typename _Tp> struct enable_if<true, _Tp> { + typedef _Tp type; + }; + template<typename _Tp> struct identity { + typedef _Tp type; + }; + template<typename _Tp> inline typename enable_if<!is_lvalue_reference<_Tp>::value, _Tp&&>::type forward(typename std::identity<_Tp>::type& __t) { + } + template<typename _Tp> inline typename enable_if<is_lvalue_reference<_Tp>::value, _Tp>::type forward(typename std::identity<_Tp>::type __t) { + } + template<typename _Tp> inline typename std::remove_reference<_Tp>::type&& move(_Tp&& __t) { + } + template<class _T1, class _T2> struct pair { + typedef _T1 first_type; + typedef _T2 second_type; + _T1 first; + _T2 second; + template<class _U1, class = typename std::enable_if<std::is_convertible<_U1, _T1>::value>::type> pair(_U1&& __x, const _T2& __y) : first(std::forward<_U1>(__x)), second(__y) { + } + template<class _U2, class = typename std::enable_if<std::is_convertible<_U2, _T2>::value>::type> pair(const _T1& __x, _U2&& __y) : first(__x), second(std::forward<_U2>(__y)) { + } + template<class _U1, class _U2, class = typename std::enable_if<std::is_convertible<_U1, _T1>::value && std::is_convertible<_U2, _T2>::value>::type> pair(_U1&& __x, _U2&& __y) : first(std::forward<_U1>(__x)), second(std::forward<_U2>(__y)) { + } + template<class _U1, class _U2> pair(pair<_U1, _U2>&& __p) : first(std::move(__p.first)), second(std::move(__p.second)) { + } + template<class _U1, class _U2> pair& operator=(pair<_U1, _U2>&& __p) { + } + }; + struct input_iterator_tag { + }; + struct output_iterator_tag { + }; + struct forward_iterator_tag : public input_iterator_tag { + }; + struct bidirectional_iterator_tag : public forward_iterator_tag { + }; + template<typename _Category, typename _Tp, typename _Distance = ptrdiff_t, typename _Pointer = _Tp*, typename _Reference = _Tp&> struct iterator { + typedef _Category iterator_category; + typedef _Tp value_type; + typedef _Distance difference_type; + typedef _Pointer pointer; + typedef _Reference reference; + }; + template<typename _Iterator> struct iterator_traits { + typedef typename _Iterator::iterator_category iterator_category; + typedef typename _Iterator::value_type value_type; + typedef typename _Iterator::difference_type difference_type; + typedef typename _Iterator::pointer pointer; + typedef typename _Iterator::reference reference; + }; + template<typename _Iter> inline typename iterator_traits<_Iter>::iterator_category __iterator_category(const _Iter&) { + } + template<typename _InputIterator> inline typename iterator_traits<_InputIterator>::difference_type __distance(_InputIterator __first, _InputIterator __last, input_iterator_tag) { + } + template<typename _InputIterator> inline typename iterator_traits<_InputIterator>::difference_type distance(_InputIterator __first, _InputIterator __last) { + return std::__distance(__first, __last, std::__iterator_category(__first)); + } + template<typename _Iterator> class reverse_iterator : public iterator<typename iterator_traits<_Iterator>::iterator_category, typename iterator_traits<_Iterator>::value_type, typename iterator_traits<_Iterator>::difference_type, typename iterator_traits<_Iterator>::pointer, typename iterator_traits<_Iterator>::reference> { + }; + template<typename _Container> class back_insert_iterator : public iterator<output_iterator_tag, void, void, void, void> { + }; +} +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) { + template<typename _Tp> class new_allocator { + public: + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef _Tp* pointer; + typedef const _Tp* const_pointer; + typedef _Tp& reference; + typedef const _Tp& const_reference; + typedef _Tp value_type; + new_allocator() throw() { + } + new_allocator(const new_allocator&) throw() { + } + template<typename _Tp1> new_allocator(const new_allocator<_Tp1>&) throw() { + } + template<typename... _Args> void construct(pointer __p, _Args&&... __args) { + } + }; +} +namespace std __attribute__ ((__visibility__ ("default"))) { + template<typename _Tp> class allocator: public __gnu_cxx::new_allocator<_Tp> { + public: + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef _Tp* pointer; + typedef const _Tp* const_pointer; + typedef _Tp& reference; + typedef const _Tp& const_reference; + typedef _Tp value_type; + template<typename _Tp1> struct rebind { + typedef allocator<_Tp1> other; + }; + allocator() throw() { + } + template<typename _Tp1> allocator(const allocator<_Tp1>&) throw() { + } + }; + extern template class allocator<char>; + extern template class allocator<wchar_t>; + template<typename _Arg, typename _Result> struct unary_function { + typedef _Arg argument_type; + typedef _Result result_type; + }; + template<typename _Arg1, typename _Arg2, typename _Result> struct binary_function { + typedef _Arg1 first_argument_type; + typedef _Arg2 second_argument_type; + typedef _Result result_type; + }; + template<typename _Tp> struct less : public binary_function<_Tp, _Tp, bool> { + bool operator()(const _Tp& __x, const _Tp& __y) const { + } + }; + template<typename _Pair> struct _Select1st : public unary_function<_Pair, typename _Pair::first_type> { + const typename _Pair::first_type& operator()(const _Pair& __x) const { + } + }; + struct _Rb_tree_node_base { + typedef _Rb_tree_node_base* _Base_ptr; + typedef const _Rb_tree_node_base* _Const_Base_ptr; + }; + template<typename _Val> struct _Rb_tree_node : public _Rb_tree_node_base { + typedef _Rb_tree_node<_Val>* _Link_type; + _Val _M_value_field; + template<typename... _Args> _Rb_tree_node(_Args&&... __args) : _Rb_tree_node_base(), _M_value_field(std::forward<_Args>(__args)...) { + } + }; + template<typename _Tp> struct _Rb_tree_iterator { + typedef _Tp value_type; + typedef _Tp& reference; + typedef _Tp* pointer; + typedef bidirectional_iterator_tag iterator_category; + typedef ptrdiff_t difference_type; + typedef _Rb_tree_iterator<_Tp> _Self; + typedef _Rb_tree_node_base::_Base_ptr _Base_ptr; + typedef _Rb_tree_node<_Tp>* _Link_type; + _Base_ptr _M_node; + }; + template<typename _Tp> struct _Rb_tree_const_iterator { + typedef _Tp value_type; + typedef const _Tp& reference; + typedef const _Tp* pointer; + typedef _Rb_tree_iterator<_Tp> iterator; + typedef bidirectional_iterator_tag iterator_category; + typedef ptrdiff_t difference_type; + typedef _Rb_tree_const_iterator<_Tp> _Self; + typedef _Rb_tree_node_base::_Const_Base_ptr _Base_ptr; + typedef const _Rb_tree_node<_Tp>* _Link_type; + explicit _Rb_tree_const_iterator(_Link_type __x) : _M_node(__x) { + } + _Rb_tree_const_iterator(const iterator& __it) : _M_node(__it._M_node) { + } + _Base_ptr _M_node; + }; + template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc = allocator<_Val> > class _Rb_tree { + typedef typename _Alloc::template rebind<_Rb_tree_node<_Val> >::other _Node_allocator; + typedef _Rb_tree_node_base* _Base_ptr; + typedef const _Rb_tree_node_base* _Const_Base_ptr; + public: + typedef _Key key_type; + typedef _Val value_type; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef _Rb_tree_node<_Val>* _Link_type; + typedef const _Rb_tree_node<_Val>* _Const_Link_type; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef _Alloc allocator_type; + _Node_allocator& _M_get_Node_allocator() { + } + _Link_type _M_get_node() { + } + template<typename... _Args> _Link_type _M_create_node(_Args&&... __args) { + _Link_type __tmp = _M_get_node(); + try { + _M_get_Node_allocator().construct(__tmp, std::forward<_Args>(__args)...); + } + catch(...) { + } + } + template<typename _Key_compare, bool _Is_pod_comparator = __is_pod(_Key_compare)> struct _Rb_tree_impl : public _Node_allocator { + _Key_compare _M_key_compare; + _Rb_tree_node_base _M_header; + size_type _M_node_count; + _Rb_tree_impl(const _Key_compare& __comp, const _Node_allocator& __a) : _Node_allocator(__a), _M_key_compare(__comp), _M_header(), _M_node_count(0) { + } + void _M_initialize() { + } + }; + _Rb_tree_impl<_Compare> _M_impl; + _Base_ptr& _M_rightmost() { + } + _Link_type _M_begin() { + } + _Link_type _M_end() { + } + _Const_Link_type _M_end() const { + } + static _Link_type _S_right(_Base_ptr __x) { + } + static const_reference _S_value(_Const_Base_ptr __x) { + } + static const _Key& _S_key(_Const_Base_ptr __x) { + return _KeyOfValue()(_S_value(__x)); + } + typedef _Rb_tree_iterator<value_type> iterator; + typedef _Rb_tree_const_iterator<value_type> const_iterator; + typedef std::reverse_iterator<iterator> reverse_iterator; + typedef std::reverse_iterator<const_iterator> const_reverse_iterator; + iterator _M_insert_(_Const_Base_ptr __x, _Const_Base_ptr __y, const value_type& __v); + iterator _M_insert_lower(_Base_ptr __x, _Base_ptr __y, const value_type& __v); + iterator _M_insert_equal_lower(const value_type& __x); + iterator _M_lower_bound(_Link_type __x, _Link_type __y, const _Key& __k); + iterator _M_upper_bound(_Link_type __x, _Link_type __y, const _Key& __k); + _Rb_tree(const _Compare& __comp, const allocator_type& __a = allocator_type()) : _M_impl(__comp, __a) { + } + iterator end() { + } + iterator _M_insert_equal_(const_iterator __position, const value_type& __x); + template<typename _InputIterator> void _M_insert_unique(_InputIterator __first, _InputIterator __last); + template<typename _InputIterator> void _M_insert_equal(_InputIterator __first, _InputIterator __last); + size_type count(const key_type& __k) const; + pair<iterator, iterator> equal_range(const key_type& __k); + pair<const_iterator, const_iterator> equal_range(const key_type& __k) const; + }; + template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: _M_insert_(_Const_Base_ptr __x, _Const_Base_ptr __p, const _Val& __v) { + _Link_type __z = _M_create_node(__v); + } + template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: _M_insert_lower(_Base_ptr __x, _Base_ptr __p, const _Val& __v) { + _Link_type __z = _M_create_node(__v); + } + template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: _M_insert_equal_lower(const _Val& __v) { + _Link_type __x = _M_begin(); + _Link_type __y = _M_end(); + return _M_insert_lower(__x, __y, __v); + } + template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> pair<typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator, typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator> _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: equal_range(const _Key& __k) { + _Link_type __x = _M_begin(); + _Link_type __y = _M_end(); + while (__x != 0) { + if (_M_impl._M_key_compare(_S_key(__x), __k)) __x = _S_right(__x); + else { + _Link_type __xu(__x), __yu(__y); + return pair<iterator, iterator>(_M_lower_bound(__x, __y, __k), _M_upper_bound(__xu, __yu, __k)); + } + } + } + template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> pair<typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::const_iterator, typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::const_iterator> _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: equal_range(const _Key& __k) const { + _Const_Link_type __y = _M_end(); + return pair<const_iterator, const_iterator>(const_iterator(__y), const_iterator(__y)); + } + template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: _M_insert_equal_(const_iterator __position, const _Val& __v) { + if (__position._M_node == _M_end()) { + if (__position._M_node == _M_rightmost()) return _M_insert_(0, _M_rightmost(), __v); + else return _M_insert_equal_lower(__v); + } + } + template<typename _Key, typename _Val, typename _KoV, typename _Cmp, typename _Alloc> template<class _II> void _Rb_tree<_Key, _Val, _KoV, _Cmp, _Alloc>:: _M_insert_equal(_II __first, _II __last) { + for (; + __first != __last; + ++__first) _M_insert_equal_(end(), *__first); + } + template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::size_type _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: count(const _Key& __k) const { + pair<const_iterator, const_iterator> __p = equal_range(__k); + const size_type __n = std::distance(__p.first, __p.second); + } + template<class _E> class initializer_list { + public: + typedef _E value_type; + typedef const _E& reference; + typedef const _E& const_reference; + typedef size_t size_type; + typedef const _E* iterator; + typedef const _E* const_iterator; + iterator _M_array; + size_type _M_len; + initializer_list(const_iterator __a, size_type __l) : _M_array(__a), _M_len(__l) { + } + const_iterator begin() const { + } + const_iterator end() const { + } + }; + template <typename _Key, typename _Tp, typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<std::pair<const _Key, _Tp> > > class multimap { + typedef _Key key_type; + typedef _Tp mapped_type; + typedef std::pair<const _Key, _Tp> value_type; + typedef _Compare key_compare; + typedef _Alloc allocator_type; + typedef typename _Alloc::value_type _Alloc_value_type; + typedef typename _Alloc::template rebind<value_type>::other _Pair_alloc_type; + typedef _Rb_tree<key_type, value_type, _Select1st<value_type>, key_compare, _Pair_alloc_type> _Rep_type; + _Rep_type _M_t; + public: + typedef typename _Pair_alloc_type::pointer pointer; + typedef typename _Pair_alloc_type::const_pointer const_pointer; + typedef typename _Pair_alloc_type::reference reference; + typedef typename _Pair_alloc_type::const_reference const_reference; + typedef typename _Rep_type::iterator iterator; + typedef typename _Rep_type::const_iterator const_iterator; + typedef typename _Rep_type::size_type size_type; + typedef typename _Rep_type::difference_type difference_type; + typedef typename _Rep_type::reverse_iterator reverse_iterator; + typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator; + multimap(initializer_list<value_type> __l, const _Compare& __comp = _Compare(), const allocator_type& __a = allocator_type()) : _M_t(__comp, __a) { + _M_t._M_insert_equal(__l.begin(), __l.end()); + } + template<typename _InputIterator> multimap(_InputIterator __first, _InputIterator __last) : _M_t() { + } + template<typename _InputIterator> multimap(_InputIterator __first, _InputIterator __last, const _Compare& __comp, const allocator_type& __a = allocator_type()) : _M_t(__comp, __a) { + } + template<typename _InputIterator> void insert(_InputIterator __first, _InputIterator __last) { + } + size_type count(const key_type& __x) const { + return _M_t.count(__x); + } + std::pair<iterator, iterator> equal_range(const key_type& __x) { + return _M_t.equal_range(__x); + } + template<typename _K1, typename _T1, typename _C1, typename _A1> friend bool operator==(const multimap<_K1, _T1, _C1, _A1>&, const multimap<_K1, _T1, _C1, _A1>&); + template<typename _K1, typename _T1, typename _C1, typename _A1> friend bool operator<(const multimap<_K1, _T1, _C1, _A1>&, const multimap<_K1, _T1, _C1, _A1>&); + }; +} +extern "C" { + extern void __assert_fail (__const char *__assertion, __const char *__file, unsigned int __line, __const char *__function) throw () __attribute__ ((__noreturn__)); +} +using namespace std; +int test01() { + typedef multimap<int,double> Container; + typedef Container::iterator iterator; + typedef pair<iterator,iterator> itpair; + Container m({ + { + 1, 1.0 } + } + ); + itpair ip = m.equal_range(1); + ((distance(ip.first, ip.second) == 3) ? static_cast<void> (0) : __assert_fail ("distance(ip.first, ip.second) == 3", "/home/richard/src/trunk/libstdc++-v3/testsuite/23_containers/multimap/init-list.cc", 36, __PRETTY_FUNCTION__)); + ((m.count(7) == 2) ? static_cast<void> (0) : __assert_fail ("m.count(7) == 2", "/home/richard/src/trunk/libstdc++-v3/testsuite/23_containers/multimap/init-list.cc", 54, __PRETTY_FUNCTION__)); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic99.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic99.C new file mode 100644 index 0000000..8398b2a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic99.C @@ -0,0 +1,22 @@ +// PR c++/43054 +// { dg-do compile { target c++11 } } + +template<typename R> struct future { }; + +template<typename Fn, typename... Args> + auto + async(Fn&& fn, Args&&... args) + -> future<decltype(fn(args...))>; + +template<typename Fn, typename... Args> + auto + async(Fn&& fn, Args&&... args) + -> future<decltype(fn(args...))>; + +int work2(int value); + +void work(int value) +{ + async(work2, value); +} + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-33964.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-33964.C new file mode 100644 index 0000000..9e40737 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-33964.C @@ -0,0 +1,20 @@ +// { dg-do compile { target c++11 } } +template<typename ... Args> +struct foo +{ + static bool const value = true; +}; + +template<typename ... Args> +struct foo< typename Args::is_applied... > // { dg-error "not used|Args" } +{ + static bool const value = false; +}; + +struct not_applied { typedef void is_applied; }; +struct applied { typedef applied is_applied; }; + +int main() +{ + foo<applied, applied> i; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34050.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34050.C new file mode 100644 index 0000000..6dec6df --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34050.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } +struct A {}; + +template<typename... T> struct B : T... +{ + B() : T()... {} +}; + +B<A> b; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34051-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34051-2.C new file mode 100644 index 0000000..ace905a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34051-2.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } +template<typename... T> struct A +{ + int i __attribute__((aligned(__alignof(T)))); // { dg-error "parameter packs|T" } +}; + +A<int> a; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34051.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34051.C new file mode 100644 index 0000000..d0a8b95 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34051.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } +struct A +{ + operator int(); +}; + +template <typename... T> struct B : A +{ + using A::operator T; // { dg-error "parameter packs|T" } +}; + +B<int> b; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34052.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34052.C new file mode 100644 index 0000000..1036537 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34052.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } +template<typename... T, typename = T> struct A {}; // { dg-error "must be at the end" } + + +template<template<typename... T, typename = T> class U> struct B // { dg-error "must be at the end" } +{ + template<int> U<int> foo(); // { dg-error "mismatch|constant|invalid|invalid" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34055.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34055.C new file mode 100644 index 0000000..3ee7bad --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34055.C @@ -0,0 +1,31 @@ +// { dg-do compile { target c++11 } } +// PR c++/34055 +template<typename...> struct A; + +template<typename...T> struct A<T*> // { dg-error "parameter packs|T" } +{ + void foo(); +}; + +template<typename...T> void A<T*>::foo() {} // { dg-error "invalid declarator" } + + + +template<typename...> struct B; + +template<typename...T> struct B<T&> // { dg-error "parameter packs|T" } +{ + void foo(); +}; + +template<typename...T> void B<T&>::foo() {} // { dg-error "invalid declarator" } + + +template<typename...> struct C; + +template<typename...T> struct C<T()> // { dg-error "parameter packs|T" } +{ + void foo(); +}; + +template<typename...T> void C<T()>::foo() {} // { dg-error "invalid declarator" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34102.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34102.C new file mode 100644 index 0000000..c2a6ae5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34102.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } +// PR c++/34102 +struct A {}; + +template<typename> struct B : virtual A {}; + +template<typename...T> struct C : B<T> {}; // { dg-error "parameter packs|T" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34103.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34103.C new file mode 100644 index 0000000..bb2f829 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34103.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } +// PR c++/34103 +template<typename> struct A {}; + +template<typename...T> void foo(A<T>, A<T>); // { dg-error "parameter packs|T" } + +template<typename...T> void foo(A<T>, A<T>) {} // { dg-error "parameter packs|T" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34219-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34219-2.C new file mode 100644 index 0000000..5bb2a21 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34219-2.C @@ -0,0 +1,22 @@ +// { dg-do compile { target c++11 } } +template<template<typename... T> class Comp, typename... T> void f( T... Value) +{ + static_assert( Comp<T>::value > 0, "" ); // { dg-error "parameter packs|T" } +} + +template<template<typename... T> class Comp, typename... T> void g( T... Value) +{ + static_assert( Comp<T...>::value > 0, "" ); +} + +template <typename... T> +struct Foo +{ + static const int value=1; +}; + +int main() +{ + f<Foo>( 2 ); + g<Foo>( 2 ); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34219.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34219.C new file mode 100644 index 0000000..91ee609 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34219.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } +template<typename T, T a, T... Params> +struct max +{ + static const T value = a > max<T, Params>::value ? a : max<T, Params>::value; // { dg-error "not expanded|Params" } +}; + +template<typename T, T a, T b> +struct max<T, a, b> +{ + static const T value = a > b ? a : b; +}; + +static const int value1 = max< int, 1, 2>::value; +static const int value2 = max< int, 1, 3, 5>::value; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34314.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34314.C new file mode 100644 index 0000000..ee0ed01 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34314.C @@ -0,0 +1,50 @@ +// { dg-do compile { target c++11 } } + +template<typename Fun, typename... Args> // { dg-error "template parameter" } +struct call; + +template<typename Fun, typename Arg0> +struct call // { dg-error "redeclared here" } +{ + template<typename Sig> + struct result; + + template<typename X, typename Y> + struct result<X(Y)> + { + typedef X type; + }; +}; + + +template<typename Fun, int... N> // { dg-error "template parameter" } +struct call2; + +template<typename Fun, int N> +struct call2 // { dg-error "redeclared here" } +{ + template<typename Sig> + struct result; + + template<typename X, typename Y> + struct result<X(Y)> + { + typedef X type; + }; +}; + +template<typename Fun, template<typename> class... TT> // { dg-error "template parameter" } +struct call3; + +template<typename Fun, template<typename> class TT> +struct call3 // { dg-error "redeclared here" } +{ + template<typename Sig> + struct result; + + template<typename X, typename Y> + struct result<X(Y)> + { + typedef X type; + }; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34399.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34399.C new file mode 100644 index 0000000..74f35f7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34399.C @@ -0,0 +1,10 @@ +// { dg-do compile { target c++11 } } +template<int...> struct A +{ + void foo(); +}; + +struct B +{ + template<int N> friend void A<N>::A::foo(); // { dg-error "declared as friend" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34606.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34606.C new file mode 100644 index 0000000..a032bfc --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34606.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } +template<typename...> struct A; + +template<typename T, typename... U> struct A<T, U> // { dg-error "parameter packs|U" } +{ + template<typename> struct B; + + template<typename X> struct B<X*> {}; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34751.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34751.C new file mode 100644 index 0000000..1b1e669 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34751.C @@ -0,0 +1,19 @@ +// { dg-do compile { target c++11 } } +// PR c++/34751 +struct A {}; + +template<typename... Args = int> // { dg-error "cannot have a default" } +void f(Args... args = 0); // { dg-error "cannot have a default argument" } + +template<typename... Args> +void g(Args... = 0); // { dg-error "cannot have a default argument" } + + +template<int, typename T = A, int T::*...p = 0 > struct B {}; // { dg-error "cannot have a default argument|no default argument" } + +B<0> b; + +template<int, typename T = A, int T::*... = 0 > struct C {}; // { dg-error "cannot have a default argument|no default argument" } + +C<0> c; + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34753.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34753.C new file mode 100644 index 0000000..496acae --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34753.C @@ -0,0 +1,14 @@ +// { dg-do compile { target c++11 } } +template<typename... T> struct A +{ + template<T> struct B {}; // { dg-error "not expanded|T" } +}; + +A<int>::B<0> b; + +template<typename... T> struct B +{ + template<T> B(); // { dg-error "not expanded|T" } +}; + +B<int> c; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34754.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34754.C new file mode 100644 index 0000000..c42fe49 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34754.C @@ -0,0 +1,6 @@ +// { dg-do compile { target c++11 } } +template<template<int> class... T> struct A +{ + void foo(T<0>); // { dg-error "not expanded|T" } + void bar(T<0>); // { dg-error "not expanded|T" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34755.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34755.C new file mode 100644 index 0000000..3ef089d --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34755.C @@ -0,0 +1,6 @@ +// { dg-do compile { target c++11 } } +template<typename> struct A {}; + +template<template<typename> class... T> void foo(T<int>) {} // { dg-error "not expanded|T" } + +template void foo<A>(A<int>); // { dg-error "does not match" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34919.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34919.C new file mode 100644 index 0000000..5b106e1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34919.C @@ -0,0 +1,13 @@ +// { dg-do compile { target c++11 } } +template<int... N> struct A +{ + static void foo() + { + int i = N; // { dg-error "not expanded|N" } + } +}; + +void bar() +{ + A<0>::foo(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34961.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34961.C new file mode 100644 index 0000000..11315ca --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-34961.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } +template<typename... T> struct A +{ + static const int i __attribute__((aligned(__alignof(T)))) = 0; // { dg-error "not expanded|T" } +}; + +A<int> a; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35023.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35023.C new file mode 100644 index 0000000..bc59023 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35023.C @@ -0,0 +1,11 @@ +// { dg-do compile { target c++11 } } +template<typename... T> int foo() +{ + T t; // { dg-error "parameter packs|T" } + return t; +} + +void bar() +{ + foo<int>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35024.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35024.C new file mode 100644 index 0000000..c20501f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35024.C @@ -0,0 +1,11 @@ +// { dg-do compile { target c++11 } } +template<typename... T> int foo() +{ + typename T::X x; // { dg-error "parameter packs|T" } + return x; +} + +void bar() +{ + foo<int>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35026.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35026.C new file mode 100644 index 0000000..2590f35 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35026.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } +template<typename... T> struct A +{ + T* x[1]; // { dg-error "parameter packs|T" } +}; + +A<int> a; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35147.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35147.C new file mode 100644 index 0000000..0827bee --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35147.C @@ -0,0 +1,18 @@ +// { dg-do compile { target c++11 } } + +template<typename _Tp> + _Tp&& forward(_Tp&& __t) { return __t; } // { dg-message "note" } + +void f(...); + +template<typename... Args> +void g(Args&&... args) +{ + f(forward<Args...>(args...)); // { dg-error "no matching" } + // { dg-message "candidate" "candidate note" { target *-*-* } 11 } +} + +void h() +{ + g(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35242.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35242.C new file mode 100644 index 0000000..9af855e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35242.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } +struct A +{ + template<typename... T> struct B; +}; + +template<typename... T> struct A::B<T*> {}; // { dg-error "parameter packs|T" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35243.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35243.C new file mode 100644 index 0000000..e38d339 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35243.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } +struct A {}; + +template<typename... T> struct B : T... +{ + B() : T(x)... {} // { dg-error "not declared" } +}; + +B<A> b; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35331.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35331.C new file mode 100644 index 0000000..0128b61 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-35331.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } +template<typename...> struct A; + +template<typename...T> struct A<T*> // { dg-error "not expanded|T" } +{ + friend void foo(); +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-37737-1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-37737-1.C new file mode 100644 index 0000000..c047a19 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-37737-1.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } +// { dg-prune-output "note" } + +void f() { } + +template<class U, class... T> +void f(){ f<T...>(); } // { dg-error "no matching" } + +int main() +{ + f<char>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-37737-2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-37737-2.C new file mode 100644 index 0000000..21891f1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-37737-2.C @@ -0,0 +1,16 @@ +// { dg-do compile { target c++11 } } + +template<class U, class... T> +void f() // { dg-message "note" } +{ + f<T...>(); // { dg-error "no matching" } + // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 6 } +} + +template<> +void f() { } // { dg-error "template-id" } + +int main() +{ + f<char>(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-40092.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-40092.C new file mode 100644 index 0000000..cad2643 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-40092.C @@ -0,0 +1,20 @@ +// { dg-do compile { target c++11 } } + +template <typename... Types> struct package {}; + +template <int ArgGen> struct wrapper_gen {}; + +template <int ArgNest> struct wrapper_nest +{ + typedef wrapper_gen<ArgNest> type_nest; +}; + +template <int... ArgPack> +struct wrapper_pack +{ + typedef package<wrapper_gen <ArgPack>...> type_pack; + // incorrect error: expansion pattern 'wrapper_gen<ArgNest>' + // contains no argument packs +}; + + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-51314.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-51314.C new file mode 100644 index 0000000..8a5a66a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-51314.C @@ -0,0 +1,14 @@ +// { dg-do compile { target c++11 } } +// { dg-prune-output "invalid" } + +template<int>struct A{}; +template<class...U>void f(U...){ + A<sizeof...U> x; // { dg-error "surrounded by parentheses" } +} + + +template<int...> struct Indices; +template<class> struct Next_increasing_indices; +template<int...I> struct Next_increasing_indices<Indices<I...> > { + typedef Indices<I...,sizeof...I> type; // { dg-error "surrounded by parentheses" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-55323.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-55323.C new file mode 100644 index 0000000..e360a99 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-55323.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++11 } } + +struct foo { + foo(int a, float b); +}; + +struct bar : foo { + template<typename... Args> + bar(Args&&... args) : foo(2, args){} // { dg-error "parameter packs" } +}; + +bar b(2,1.); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-55542.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-55542.C new file mode 100644 index 0000000..72d58b9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-55542.C @@ -0,0 +1,22 @@ +// PR c++/55542 +// { dg-do compile { target 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-4.9/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x.C new file mode 100644 index 0000000..e07d33b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x.C @@ -0,0 +1,10 @@ +// { dg-do compile { target c++11 } } +// { 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() +{ + static_assert = 5; + nullptr = 5; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x2.C new file mode 100644 index 0000000..324b009 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x2.C @@ -0,0 +1,5 @@ +// PR c++/50810 +// { dg-do compile { target c++11 } } +// { dg-options "-std=gnu++98 -Wc++11-compat" } + +signed char data[] = { 0xff }; // { dg-warning "narrowing" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x3.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x3.C new file mode 100644 index 0000000..204b4ae --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x3.C @@ -0,0 +1,5 @@ +// PR c++/50810 +// { dg-do compile { target c++11 } } +// { dg-options "-std=gnu++98 -Wc++11-compat -Wno-narrowing" } + +signed char data[] = { 0xff }; |