From: Jakub Jelinek Date: Wed, 22 Jan 2020 16:39:55 +0000 (+0100) Subject: re PR c++/92992 (Side-effects dropped when decltype(nullptr) typed expression is... X-Git-Tag: releases/gcc-9.3.0~206 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=beee53d59e32e7859b32b19bc7e222e3d04cc5f0;p=thirdparty%2Fgcc.git re PR c++/92992 (Side-effects dropped when decltype(nullptr) typed expression is passed to ellipsis) PR c++/92992 * call.c (convert_arg_to_ellipsis): For decltype(nullptr) arguments that have side-effects use cp_build_compound_expr. * g++.dg/cpp0x/nullptr45.C: New test. --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0e1557c936e2..f0e314fd3548 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2020-01-22 Jakub Jelinek + + Backported from mainline + 2019-12-20 Jakub Jelinek + + PR c++/92992 + * call.c (convert_arg_to_ellipsis): For decltype(nullptr) arguments + that have side-effects use cp_build_compound_expr. + 2020-01-21 Jason Merrill PR c++/91476 - anon-namespace reference temp clash between TUs. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 8e14e89d5d49..787a7ed387bd 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -7543,7 +7543,12 @@ convert_arg_to_ellipsis (tree arg, tsubst_flags_t complain) arg = convert_to_real_nofold (double_type_node, arg); } else if (NULLPTR_TYPE_P (arg_type)) - arg = null_pointer_node; + { + if (TREE_SIDE_EFFECTS (arg)) + arg = cp_build_compound_expr (arg, null_pointer_node, complain); + else + arg = null_pointer_node; + } else if (INTEGRAL_OR_ENUMERATION_TYPE_P (arg_type)) { if (SCOPED_ENUM_P (arg_type)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d76c05982452..2e507fdfe505 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2020-01-22 Jakub Jelinek + + Backported from mainline + 2019-12-20 Jakub Jelinek + + PR c++/92992 + * g++.dg/cpp0x/nullptr45.C: New test. + 2020-01-22 Joseph Myers Backport from mainline: diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr45.C b/gcc/testsuite/g++.dg/cpp0x/nullptr45.C new file mode 100644 index 000000000000..3ff226803dff --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr45.C @@ -0,0 +1,24 @@ +// PR c++/92992 +// { dg-do run { target c++11 } } + +int a; + +void +bar (int, ...) +{ +} + +decltype (nullptr) +baz () +{ + a++; + return nullptr; +} + +int +main () +{ + bar (0, baz ()); + if (a != 1) + __builtin_abort (); +}