diff mbox

C++ PATCH for c++/78193 (inherited ctor regression on sparc32)

Message ID CADzB+2=Euok2qEqOWQvUdGiXTe_Ruep7fZa_u-=hmQ8mJHAeiQ@mail.gmail.com
State New
Headers show

Commit Message

Jason Merrill Nov. 17, 2016, 10:39 p.m. UTC
The issue here was that we were still introducing extra temporaries of
an empty class in a CALL_FROM_THUNK_P call to the inherited
constructor.

Tested x86_64-pc-linux-gnu, applying to trunk.
commit 312678eec4a6dac8fe05e2ecfde60a717543ae76
Author: Jason Merrill <jason@redhat.com>
Date:   Thu Nov 17 17:18:26 2016 -0500

            PR c++/78193 - inherited ctor regressions on sparc32.
    
            * call.c (build_over_call): Don't set CALL_FROM_THUNK_P here.
            (build_call_a): Set it here, and don't insert EMPTY_CLASS_EXPR.
            (convert_like_real) [ck_rvalue]: Also pass non-addressable
            types along directly.
diff mbox

Patch

diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index d25e2e7..97003e5 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -375,10 +375,18 @@  build_call_a (tree function, int n, tree *argarray)
 
   TREE_HAS_CONSTRUCTOR (function) = (decl && DECL_CONSTRUCTOR_P (decl));
 
+  if (current_function_decl && decl
+      && flag_new_inheriting_ctors
+      && DECL_INHERITED_CTOR (current_function_decl)
+      && (DECL_INHERITED_CTOR (current_function_decl)
+	  == DECL_CLONED_FUNCTION (decl)))
+    /* Pass arguments directly to the inherited constructor.  */
+    CALL_FROM_THUNK_P (function) = true;
+
   /* Don't pass empty class objects by value.  This is useful
      for tags in STL, which are used to control overload resolution.
      We don't need to handle other cases of copying empty classes.  */
-  if (! decl || ! DECL_BUILT_IN (decl))
+  else if (! decl || ! DECL_BUILT_IN (decl))
     for (i = 0; i < n; i++)
       {
 	tree arg = CALL_EXPR_ARG (function, i);
@@ -6844,8 +6852,7 @@  convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
 	 constructor.  */
       if (current_function_decl
 	  && flag_new_inheriting_ctors
-	  && DECL_INHERITED_CTOR (current_function_decl)
-	  && TREE_ADDRESSABLE (totype))
+	  && DECL_INHERITED_CTOR (current_function_decl))
 	return expr;
 
       /* Fall through.  */
@@ -8094,13 +8101,6 @@  build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
       /* build_new_op_1 will clear this when appropriate.  */
       CALL_EXPR_ORDERED_ARGS (c) = true;
     }
-  if (current_function_decl
-      && flag_new_inheriting_ctors
-      && DECL_INHERITED_CTOR (current_function_decl)
-      && cand->num_convs)
-    /* Don't introduce copies when passing arguments along to the inherited
-       constructor.  */
-    CALL_FROM_THUNK_P (call) = true;
   return call;
 }