Tested x86_64-linux, applying to trunk. 2018-12-01 Marek Polacek <pola...@redhat.com>
PR c++/87523 * g++.dg/cpp1y/lambda-generic-87523.C: New test. diff --git gcc/testsuite/g++.dg/cpp1y/lambda-generic-87523.C gcc/testsuite/g++.dg/cpp1y/lambda-generic-87523.C new file mode 100644 index 00000000000..ecba1cfc322 --- /dev/null +++ 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); + }); +}