aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/method.c
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2019-12-11 11:51:05 -0500
committerJason Merrill <jason@gcc.gnu.org>2019-12-11 11:51:05 -0500
commit60e457d9cad52491bbff434bf611b21f2da07ecc (patch)
tree2c438668a84a9f52f6e1c808d948c2b62bdf7297 /gcc/cp/method.c
parentd6e8c01cff1bee743a9d00e9a43303ec29fde233 (diff)
downloadgcc-60e457d9cad52491bbff434bf611b21f2da07ecc.zip
gcc-60e457d9cad52491bbff434bf611b21f2da07ecc.tar.gz
gcc-60e457d9cad52491bbff434bf611b21f2da07ecc.tar.bz2
PR c++/92774 - ICE with implicitly deleted operator<=>.
Missing error-recovery code. While I was poking at this I also figured we don't need to iterate over the members of a union. * method.c (comp_info::~comp_info): Factor out of... (build_comparison_op): Here. Handle error return from build_new_op. From-SVN: r279235
Diffstat (limited to 'gcc/cp/method.c')
-rw-r--r--gcc/cp/method.c33
1 files changed, 21 insertions, 12 deletions
diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index 83da20a..97c27c5 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -1244,6 +1244,21 @@ struct comp_info
if (noex && !expr_noexcept_p (expr, tf_none))
noex = false;
}
+
+ ~comp_info ()
+ {
+ if (first_time)
+ {
+ DECL_DECLARED_CONSTEXPR_P (fndecl) = constexp || was_constexp;
+ tree raises = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fndecl));
+ if (!raises || UNEVALUATED_NOEXCEPT_SPEC_P (raises))
+ {
+ raises = noex ? noexcept_true_spec : noexcept_false_spec;
+ TREE_TYPE (fndecl) = build_exception_variant (TREE_TYPE (fndecl),
+ raises);
+ }
+ }
+ }
};
/* Build up the definition of a defaulted comparison operator. Unlike other
@@ -1282,6 +1297,7 @@ build_comparison_op (tree fndecl, tsubst_flags_t complain)
if (complain & tf_error)
inform (info.loc, "cannot default compare union %qT", ctype);
DECL_DELETED_FN (fndecl) = true;
+ return;
}
tree compound_stmt = NULL_TREE;
@@ -1335,6 +1351,11 @@ build_comparison_op (tree fndecl, tsubst_flags_t complain)
NULL_TREE);
tree comp = build_new_op (info.loc, code, flags, lhs_mem, rhs_mem,
NULL_TREE, NULL, complain);
+ if (comp == error_mark_node)
+ {
+ DECL_DELETED_FN (fndecl) = true;
+ continue;
+ }
comps.safe_push (comp);
}
if (code == SPACESHIP_EXPR && is_auto (rettype))
@@ -1430,18 +1451,6 @@ build_comparison_op (tree fndecl, tsubst_flags_t complain)
finish_compound_stmt (compound_stmt);
else
--cp_unevaluated_operand;
-
- if (info.first_time)
- {
- DECL_DECLARED_CONSTEXPR_P (fndecl) = info.constexp || info.was_constexp;
- tree raises = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fndecl));
- if (!raises || UNEVALUATED_NOEXCEPT_SPEC_P (raises))
- {
- raises = info.noex ? noexcept_true_spec : noexcept_false_spec;
- TREE_TYPE (fndecl) = build_exception_variant (TREE_TYPE (fndecl),
- raises);
- }
- }
}
/* Synthesize FNDECL, a non-static member function. */