From: Jason Merrill Date: Thu, 24 May 2018 20:03:18 +0000 (-0400) Subject: PR c++/85842 - -Wreturn-type, constexpr if and generic lambda. X-Git-Tag: upstream/12.2.0~31544 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=520fe2e324da4b1aa2c1fbac29741bd45afa98c1;p=platform%2Fupstream%2Fgcc.git PR c++/85842 - -Wreturn-type, constexpr if and generic lambda. * pt.c (tsubst_lambda_expr): Copy current_function_returns_* to generic lambda. From-SVN: r260685 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index fdf73d1..371c8b7 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 cfce9a9..d0fc9ee 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 0000000..8e31db3 --- /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);