PR c++/78193 - inherited ctor regressions on sparc32.
authorJason Merrill <jason@redhat.com>
Thu, 17 Nov 2016 22:40:28 +0000 (17:40 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 17 Nov 2016 22:40:28 +0000 (17:40 -0500)
* 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.

From-SVN: r242573

gcc/cp/ChangeLog
gcc/cp/call.c

index 3178c1f1c4d06784545715fbafd9b77427c4eb2c..afc2c16451111e88d4e0ca2edf1d8e406c14c719 100644 (file)
@@ -1,3 +1,11 @@
+2016-11-17  Jason Merrill  <jason@redhat.com>
+
+       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.
+
 2016-11-17  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/55080
index d25e2e79f0b5bf20635cbb814019cd3b3949c285..97003e534270b5f70b768e7b6a8930fffd1b9a15 100644 (file)
@@ -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;
 }