aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg')
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle.C3
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle4.C4
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/constexpr-lambda1.C6
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/constexpr-lambda10.C10
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/constexpr-lambda11.C11
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/constexpr-lambda12.C10
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/constexpr-lambda13.C5
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/constexpr-lambda14.C4
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/constexpr-lambda2.C7
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/constexpr-lambda3.C8
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/constexpr-lambda4.C4
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/constexpr-lambda5.C7
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/constexpr-lambda6.C30
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/constexpr-lambda7.C12
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/constexpr-lambda8.C15
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/constexpr-lambda9.C4
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/feat-cxx1z.C4
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