aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2017-10-04 20:58:52 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2017-10-04 20:58:52 +0000
commit25139006e58a7ca7b708a742af8170f399d7db63 (patch)
tree00c891e9b0f79b7660f277448b1aff51e08ef298
parent968e56bf7f0a064fdc234a6b13246b02724a6d4a (diff)
downloadgcc-25139006e58a7ca7b708a742af8170f399d7db63.zip
gcc-25139006e58a7ca7b708a742af8170f399d7db63.tar.gz
gcc-25139006e58a7ca7b708a742af8170f399d7db63.tar.bz2
re PR c++/78131 (Inconsistent evaluation for `constexpr` lambdas in templates between `static_assert`, `if constexpr(…)` and `constexpr` variables)
2017-10-04 Paolo Carlini <paolo.carlini@oracle.com> PR c++/78131 * g++.dg/cpp1z/constexpr-lambda17.C: New. From-SVN: r253431
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/constexpr-lambda17.C30
2 files changed, 35 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6e8680b..b1e3edc 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2017-10-04 Paolo Carlini <paolo.carlini@oracle.com>
+ PR c++/78131
+ * g++.dg/cpp1z/constexpr-lambda17.C: New.
+
+2017-10-04 Paolo Carlini <paolo.carlini@oracle.com>
+
PR c++/78018
* g++.dg/cpp1y/lambda-generic-78018.C: New.
diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda17.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda17.C
new file mode 100644
index 0000000..44bd2b8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda17.C
@@ -0,0 +1,30 @@
+// PR c++/78131
+// { dg-options -std=c++17 }
+
+template <typename TF>
+constexpr auto f(TF)
+{
+ return [](auto...) constexpr { return true; };
+}
+
+// Compiles and works as intended.
+template <typename T0>
+void ok_0(T0)
+{
+ static_assert(f([](auto x) -> decltype(x){})(T0{}));
+}
+
+// Compiles and works as intended.
+template <typename T0>
+void ok_1(T0)
+{
+ constexpr auto a = f([](auto x) -> decltype(x){})(T0{});
+ if constexpr(a) { }
+}
+
+// Compile-time error!
+template <typename T0>
+void fail_0(T0)
+{
+ if constexpr(f([](auto x) -> decltype(x){})(T0{})) { }
+}