PR c++/84978, ICE with NRVO.
authorJason Merrill <jason@redhat.com>
Tue, 20 Mar 2018 18:05:59 +0000 (14:05 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 20 Mar 2018 18:05:59 +0000 (14:05 -0400)
* cvt.c (cp_get_fndecl_from_callee): Add fold parameter.
(cp_get_callee_fndecl_nofold): New.
* cp-gimplify.c (cp_genericize_r): Use it instead.
* call.c (check_self_delegation): Likewise.

From-SVN: r258689

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/cp/cp-gimplify.c
gcc/cp/cp-tree.h
gcc/cp/cvt.c

index 5d7b9c09983c613f52fcbb6ef607b5b0455f64ea..894a33e52359c7ca2194abeb634abcbc587f5fdd 100644 (file)
@@ -1,3 +1,11 @@
+2018-03-20  Jason Merrill  <jason@redhat.com>
+
+       PR c++/84978, ICE with NRVO.
+       * cvt.c (cp_get_fndecl_from_callee): Add fold parameter.
+       (cp_get_callee_fndecl_nofold): New.
+       * cp-gimplify.c (cp_genericize_r): Use it instead.
+       * call.c (check_self_delegation): Likewise.
+
 2018-03-20  Nathan Sidwell  <nathan@acm.org>
 
        PR c++/84962
index 23d4f82a1a0c4182905574784fcd36008c713e16..dbdb8d5812daa32ff52c6a55f92adb8c9c72d09e 100644 (file)
@@ -8739,7 +8739,7 @@ check_self_delegation (tree ret)
 {
   if (TREE_CODE (ret) == TARGET_EXPR)
     ret = TARGET_EXPR_INITIAL (ret);
-  tree fn = cp_get_callee_fndecl (ret);
+  tree fn = cp_get_callee_fndecl_nofold (ret);
   if (fn && DECL_ABSTRACT_ORIGIN (fn) == current_function_decl)
     error ("constructor delegates to itself");
 }
index 332ff2bbb054e343724051a0d1eb79c1d17bfe70..3edecf24c92758dcba97375a7c31bd3ce28d72f0 100644 (file)
@@ -1521,7 +1521,7 @@ cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data)
         version is inlinable, a direct call to this version can be made
         otherwise the call should go through the dispatcher.  */
       {
-       tree fn = cp_get_callee_fndecl (stmt);
+       tree fn = cp_get_callee_fndecl_nofold (stmt);
        if (fn && DECL_FUNCTION_VERSIONED (fn)
            && (current_function_decl == NULL
                || !targetm.target_option.can_inline_p (current_function_decl,
index 077ef2d13f998a6b8f91b2a570a85870f8c66b7e..4df16e2e1caf7b5e3e58ed4b7a960618f9056aac 100644 (file)
@@ -6110,7 +6110,8 @@ extern tree cp_convert_and_check                (tree, tree, tsubst_flags_t);
 extern tree cp_fold_convert                    (tree, tree);
 extern tree cp_get_callee                      (tree);
 extern tree cp_get_callee_fndecl               (tree);
-extern tree cp_get_fndecl_from_callee          (tree);
+extern tree cp_get_callee_fndecl_nofold                (tree);
+extern tree cp_get_fndecl_from_callee          (tree, bool fold = true);
 extern tree convert_to_void                    (tree, impl_conv_void,
                                                 tsubst_flags_t);
 extern tree convert_force                      (tree, tree, int,
index 40e7576f23c8a2434cab403c29329a276149ac03..9b53fa3067d9dafe7063dc79db1e2a7f022a0ebe 100644 (file)
@@ -941,7 +941,7 @@ cp_get_callee (tree call)
    if we can.  */
 
 tree
-cp_get_fndecl_from_callee (tree fn)
+cp_get_fndecl_from_callee (tree fn, bool fold /* = true */)
 {
   if (fn == NULL_TREE)
     return fn;
@@ -951,7 +951,8 @@ cp_get_fndecl_from_callee (tree fn)
   if (type == unknown_type_node)
     return NULL_TREE;
   gcc_assert (POINTER_TYPE_P (type));
-  fn = maybe_constant_init (fn);
+  if (fold)
+    fn = maybe_constant_init (fn);
   STRIP_NOPS (fn);
   if (TREE_CODE (fn) == ADDR_EXPR)
     {
@@ -971,6 +972,14 @@ cp_get_callee_fndecl (tree call)
   return cp_get_fndecl_from_callee (cp_get_callee (call));
 }
 
+/* As above, but not using the constexpr machinery.  */
+
+tree
+cp_get_callee_fndecl_nofold (tree call)
+{
+  return cp_get_fndecl_from_callee (cp_get_callee (call), false);
+}
+
 /* Subroutine of convert_to_void.  Warn if we're discarding something with
    attribute [[nodiscard]].  */