diff options
author | Jason Merrill <jason@redhat.com> | 2019-12-11 11:51:05 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2019-12-11 11:51:05 -0500 |
commit | 60e457d9cad52491bbff434bf611b21f2da07ecc (patch) | |
tree | 2c438668a84a9f52f6e1c808d948c2b62bdf7297 /gcc/cp/method.c | |
parent | d6e8c01cff1bee743a9d00e9a43303ec29fde233 (diff) | |
download | gcc-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.c | 33 |
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. */ |