diff options
Diffstat (limited to 'gcc/testsuite/g++.dg')
18 files changed, 140 insertions, 6 deletions
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv.C index 08d8bbf..417c185 100644 --- a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv.C +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv.C @@ -1,6 +1,6 @@ // Test for conversion from stateless lambda to function pointer. -// { dg-do compile { target c++11 } } +// { dg-do compile { target c++11_only } } // { dg-final { scan-assembler "weak\[^\n\r\]*_?_ZZ1fvENKUlvE_cvPFvvEEv" { target { ! { *-*-darwin* *-*-mingw* *-*-cygwin *-*-hpux10* } } } } } inline void f() diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle.C index 220817a..20ef282 100644 --- a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle.C +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle.C @@ -50,7 +50,8 @@ struct S { template<typename T> struct R { static int x; }; -template<typename T> int R<T>::x = []{return 1;}(); +// "int i;" makes the op() non-constexpr in C++17. +template<typename T> int R<T>::x = []{int i; return 1;}(); template int R<int>::x; // Type of lambda in intializer of R<int>::x: N1RIiE1xMUlvE_E // Corresponding operator(): _ZNK1RIiE1xMUlvE_clEv diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle4.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle4.C index 0d37637..b63c277 100644 --- a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle4.C +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle4.C @@ -4,8 +4,8 @@ template <class T> struct A { - // { dg-final { scan-assembler "_ZNK1AIcE1pMUlvE_cvPFvvEEv" } } - // { dg-final { scan-assembler "_ZNK1AIiE1pMUlvE_cvPFvvEEv" } } + // { dg-final { scan-assembler "_ZNK1AIcE1pMUlvE_clEv" } } + // { dg-final { scan-assembler "_ZNK1AIiE1pMUlvE_clEv" } } void (*p)() = []{}; }; diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda1.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda1.C new file mode 100644 index 0000000..a768cfb --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda1.C @@ -0,0 +1,6 @@ +// { dg-options -std=c++1z } + +constexpr auto Add5 = [](int i) { return i+5; }; + +constexpr int x = Add5(4); +static_assert(x==9); diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda10.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda10.C new file mode 100644 index 0000000..ff65d6c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda10.C @@ -0,0 +1,10 @@ +// Testcase from P0170R1 +// { dg-options -std=c++1z } + +void g() { + const int n = 0; + [=] { + constexpr int i = n; // OK, 'n' is not odr-used and not captured here. + constexpr int j = *&n; // { dg-error "" } '&n' would be an odr-use of 'n'. + }; +} diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda11.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda11.C new file mode 100644 index 0000000..f9e662d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda11.C @@ -0,0 +1,11 @@ +// Testcase from P0170R1 +// { dg-options -std=c++1z } + +// 'v' & 'm' are odr-used but do not occur in a constant-expression within the nested +// lambda, so are well-formed. +auto monad = [](auto v) { return [=] { return v; }; }; +auto bind = [](auto m) { + return [=](auto fvm) { return fvm(m()); }; +}; +// OK to have captures to automatic objects created during constant expression evaluation. +static_assert(bind(monad(2))(monad)() == monad(2)()); diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda12.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda12.C new file mode 100644 index 0000000..f5f3f38 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda12.C @@ -0,0 +1,10 @@ +// { dg-options -std=c++1z } + +void f(int i) +{ + [i]() constexpr { + int j; // { dg-error "uninitialized" } + j = i; + return j; + }(); +} diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda13.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda13.C new file mode 100644 index 0000000..077f823 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda13.C @@ -0,0 +1,5 @@ +// { dg-options -std=c++1z } + +auto l1 = []() constexpr constexpr { }; // { dg-error "duplicate" } +auto l2 = []() mutable mutable { }; // { dg-error "duplicate" } +auto l3 = []() static { }; // { dg-error "static" } diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda14.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda14.C new file mode 100644 index 0000000..26d078b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda14.C @@ -0,0 +1,4 @@ +// { dg-options -std=c++14 } + +auto l = []() constexpr { return 42; }; // { dg-error "constexpr" } + diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda2.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda2.C new file mode 100644 index 0000000..1d3ff82 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda2.C @@ -0,0 +1,7 @@ +// Testcase from P0170R1 +// { dg-options -std=c++1z } + +constexpr int AddEleven(int n){ + return[n]{return n+11;}(); +} +static_assert(AddEleven(5)==16,""); diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda3.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda3.C new file mode 100644 index 0000000..46ee846 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda3.C @@ -0,0 +1,8 @@ +// { dg-options -std=c++1z } + +constexpr auto add = [] (int n, int m) { + auto L = [=] { return n; }; + auto R = [=] { return m; }; + return [=] { return L() + R(); }; +}; +static_assert(add(3, 4)() == 7, ""); diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda4.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda4.C new file mode 100644 index 0000000..b3fd3d0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda4.C @@ -0,0 +1,4 @@ +// { dg-options -std=c++1z } + +auto ID = [] (int n) constexpr { return n; }; +constexpr int I = ID(3); diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda5.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda5.C new file mode 100644 index 0000000..71f1852 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda5.C @@ -0,0 +1,7 @@ +// { dg-options -std=c++1z } + +auto addOne = [] (int n) { + return n + 1; +}; +constexpr int (*addOneFp)(int) = addOne; +static_assert(addOneFp(3) == addOne(3), ""); diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda6.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda6.C new file mode 100644 index 0000000..bb20bad --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda6.C @@ -0,0 +1,30 @@ +// Testcase from P0170R1 +// { dg-do run } +// { dg-options -std=c++1z } + +auto monoid = [](auto v) { return [=] { return v; }; }; +auto add = [](auto m1) constexpr { + auto ret = m1(); + return [=](auto m2) mutable { + auto m1val = m1(); + auto plus = [=] (auto m2val) mutable constexpr + { return m1val += m2val; }; + ret = plus(m2()); + return monoid(ret); + }; +}; + +int main() +{ + constexpr auto zero = monoid(0); + constexpr auto one = monoid(1); + static_assert(add(one)(zero)() == one()); // OK + // Since 'two' below is not declared constexpr, an evaluation of its constexpr + // member function call operator can not perform an lvalue-to-rvalue conversion + // on one of its subobjects (that represents its capture) in a constant + // expression. + auto two = monoid(2); + if (!(two() == 2)) __builtin_abort(); // OK, not a constant expression. + static_assert(add(one)(one)() == two()); // { dg-error "" } two() is not a constant expression + static_assert(add(one)(one)() == monoid(2)()); // OK +} diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda7.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda7.C new file mode 100644 index 0000000..26f136b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda7.C @@ -0,0 +1,12 @@ +// Testcase from P0170R1 +// { dg-options -std=c++1z } + +auto ID = [](auto a) { return a; }; +static_assert( ID (3) == 3); // OK +struct NonLiteral { + NonLiteral(int n) : n(n) { } + int n; +}; + +static_assert( ID (NonLiteral{3}).n == 3); // { dg-error "non-literal" } +// { dg-prune-output "static assertion" } diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda8.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda8.C new file mode 100644 index 0000000..ac41306 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda8.C @@ -0,0 +1,15 @@ +// Testcase from P0170R1 +// { dg-options -std=c++1z } + +auto Fwd = [](int (*fp)(int), auto a) { return fp(a); }; +auto C = [](auto a) { return a; }; +static_assert( Fwd(C ,3) == 3); // OK +// No specialization of the function call operator template can be constexpr +// (because of the local static). +auto NC = [](auto a) { static int s; return a; }; // { dg-error "static" } +// { dg-message "operator int" "" { target *-*-* } 11 } +static_assert( Fwd(NC ,3) == 3); // { dg-error "" } + +// We look for the string "operator int" to check that we aren't trying to do +// template pretty-printing in an expression; that gets incredibly unwieldy +// with the decltype magic we do for lambdas. diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda9.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda9.C new file mode 100644 index 0000000..a5bc524 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda9.C @@ -0,0 +1,4 @@ +// Testcase from P0170R1 +// { dg-options -std=c++1z } + +static_assert([](int n) { return [&n] { return ++n; }(); }(3) == 4); diff --git a/gcc/testsuite/g++.dg/cpp1z/feat-cxx1z.C b/gcc/testsuite/g++.dg/cpp1z/feat-cxx1z.C index c7becc1..f5ed6ab 100644 --- a/gcc/testsuite/g++.dg/cpp1z/feat-cxx1z.C +++ b/gcc/testsuite/g++.dg/cpp1z/feat-cxx1z.C @@ -128,8 +128,8 @@ #ifndef __cpp_constexpr # error "__cpp_constexpr" -#elif __cpp_constexpr != 201304 -# error "__cpp_constexpr != 201304" +#elif __cpp_constexpr != 201603 +# error "__cpp_constexpr != 201603" #endif #ifndef __cpp_decltype_auto |