On 12/18/19 6:40 PM, Jakub Jelinek wrote:
Hi!
While looking at PR92666, I've spotted a wrong-code issue where we ignore
any side-effects on arguments passed to ellipsis if they have
decltype(nullptr) type.
Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk and release branches?
2019-12-19 Jakub Jelinek <ja...@redhat.com>
PR c++/92992
* call.c (convert_arg_to_ellipsis): For decltype(nullptr) arguments
that have side-effects use cp_build_compound_expr.
OK.
* g++.dg/cpp0x/nullptr45.C: New test.
--- gcc/cp/call.c.jj 2019-12-17 10:19:51.013282361 +0100
+++ gcc/cp/call.c 2019-12-18 18:23:01.441357443 +0100
@@ -7822,7 +7822,12 @@ convert_arg_to_ellipsis (tree arg, tsubs
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))
--- gcc/testsuite/g++.dg/cpp0x/nullptr45.C.jj 2019-12-18 18:37:48.537933751
+0100
+++ gcc/testsuite/g++.dg/cpp0x/nullptr45.C 2019-12-18 18:37:17.290406672
+0100
@@ -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 ();
+}
Jakub