diff options
author | Marek Polacek <polacek@redhat.com> | 2018-12-01 21:53:07 +0000 |
---|---|---|
committer | Marek Polacek <mpolacek@gcc.gnu.org> | 2018-12-01 21:53:07 +0000 |
commit | 70cdce4f3070899e0844fa8ed44afbea70561aac (patch) | |
tree | 072e9e70a28a2e111ad8ecb5610f9600e9059e31 | |
parent | 5a5129a0dfde266e7a1736c61045f656459d0cf8 (diff) | |
download | gcc-70cdce4f3070899e0844fa8ed44afbea70561aac.zip gcc-70cdce4f3070899e0844fa8ed44afbea70561aac.tar.gz gcc-70cdce4f3070899e0844fa8ed44afbea70561aac.tar.bz2 |
re PR c++/87523 (ICE: Closures apparently fail to capture constexpr)
PR c++/87523
* g++.dg/cpp1y/lambda-generic-87523.C: New test.
From-SVN: r266714
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/lambda-generic-87523.C | 32 |
2 files changed, 35 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9dfc58d..2cdbba4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -40,6 +40,9 @@ PR c++/79629 * g++.dg/other/error35.C: New test. + PR c++/87523 + * g++.dg/cpp1y/lambda-generic-87523.C: New test. + 2018-12-01 Jeff Law <law@redhat.com> * gcc.dg/predict-22.c: Update expected output. diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-87523.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-87523.C new file mode 100644 index 0000000..ecba1cf --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-87523.C @@ -0,0 +1,32 @@ +// PR c++/87523 +// { dg-do compile { target c++14 } } + +template <typename T, T v> +struct my_integer_constant { + constexpr my_integer_constant() {} + constexpr operator T() const { return v; } + constexpr T operator()() const { return v; } +}; + +template <typename T, T... u> +struct constant_call { + template <typename Callback> + static void call(T v, Callback f) { + char dummy[sizeof...(u)] = { ( (v == u) ? (f(my_integer_constant<T, u>{}), static_cast<char>(0)) : static_cast<char>(0))... }; + (void)dummy; + } +}; + +void f(bool reverse_in, bool other_bool_in) { + auto helper = [&] (auto reverse_t) { + bool constexpr reverse_v = reverse_t; + (void)reverse_v; + constant_call<bool, true, false>::call(other_bool_in, + [&] (auto newb) { + bool reverse_v_dyn = reverse_v; + }); + }; + constant_call<bool, true, false>::call(reverse_in, [&] (auto reverse_t) { + helper(reverse_t); + }); +} |