From 4d5038dd20f2f57b520035242dbb0fcad598c4c6 Mon Sep 17 00:00:00 2001 From: jason Date: Thu, 24 May 2018 20:03:18 +0000 Subject: [PATCH] PR c++/85842 - -Wreturn-type, constexpr if and generic lambda. * pt.c (tsubst_lambda_expr): Copy current_function_returns_* to generic lambda. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@260685 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/pt.c | 11 +++++++++++ gcc/testsuite/g++.dg/cpp1z/constexpr-if23.C | 13 +++++++++++++ 3 files changed, 30 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp1z/constexpr-if23.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index fdf73d182eb..371c8b76fef 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2018-05-24 Jason Merrill + + PR c++/85842 - -Wreturn-type, constexpr if and generic lambda. + * pt.c (tsubst_lambda_expr): Copy current_function_returns_* to + generic lambda. + 2018-05-24 Ville Voutilainen Pedwarn on a non-standard position of a C++ attribute. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index cfce9a9db62..d0fc9ee51a5 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -17636,6 +17636,17 @@ tsubst_lambda_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl) register_parameter_specializations (oldfn, fn); + if (oldtmpl) + { + /* We might not partially instantiate some parts of the function, so + copy these flags from the original template. */ + language_function *ol = DECL_STRUCT_FUNCTION (oldfn)->language; + current_function_returns_value = ol->returns_value; + current_function_returns_null = ol->returns_null; + current_function_returns_abnormally = ol->returns_abnormally; + current_function_infinite_loop = ol->infinite_loop; + } + tsubst_expr (DECL_SAVED_TREE (oldfn), args, complain, r, /*constexpr*/false); diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-if23.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-if23.C new file mode 100644 index 00000000000..8e31db3e863 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-if23.C @@ -0,0 +1,13 @@ +// PR c++/85842 +// { dg-additional-options -std=c++17 } + +template +auto f = [](auto&& arg) -> T* { + if constexpr (sizeof(arg) == 1) { + return nullptr; + } else { + return static_cast(&arg); + } +}; + +auto p = f(0); -- 2.11.4.GIT