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


Reply via email to