From: Jakub Jelinek Date: Fri, 20 Dec 2019 23:15:52 +0000 (+0100) Subject: re PR c++/92992 (Side-effects dropped when decltype(nullptr) typed expression is... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6c7b84305a5e686644ee64bfd2d415f3f43fa85b;p=gcc.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. From-SVN: r279680 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 37353e91b03..c6858f98d57 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +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. + 2019-12-20 Eric Botcazou * decl2.c (c_parse_final_cleanups): Always call collect_source_ref on diff --git a/gcc/cp/call.c b/gcc/cp/call.c index cbd5747d6ca..aeddf30c71c 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -7822,7 +7822,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 8a235b5b367..d2e146464e0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-12-20 Jakub Jelinek + + PR c++/92992 + * g++.dg/cpp0x/nullptr45.C: New test. + 2019-12-20 Jonathan Wakely PR fortran/69497 diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr45.C b/gcc/testsuite/g++.dg/cpp0x/nullptr45.C new file mode 100644 index 00000000000..3ff226803df --- /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 (); +}