[C++ PATCH] Fix bad defaulted comparison operator error recovery (PR c++/92966)
Jason Merrill
jason@redhat.com
Fri Dec 20 23:18:00 GMT 2019
On 12/17/19 3:57 PM, Jakub Jelinek wrote:
> Hi!
>
> When the prototype of defaulted comparison operator is incorrect, we set
> DECL_MAYBE_DELETED, but don't set DECL_DEFAULTED_FN and other flags, so we
> ICE during synthetize_method.
>
> Seems only marking DECL_MAYBE_DELETED those operators that we are also going
> to mark DECL_DEFAULTED_FN results in better error recovery.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK.
> 2019-12-17 Jakub Jelinek <jakub@redhat.com>
>
> PR c++/92966
> * method.c (early_check_defaulted_comparison): Don't set
> DECL_MAYBE_DELETED when returning false.
>
> * g++.dg/cpp2a/spaceship-eq8.C: New test.
>
> --- gcc/cp/method.c.jj 2019-12-11 18:19:03.185162579 +0100
> +++ gcc/cp/method.c 2019-12-17 15:28:57.819285145 +0100
> @@ -1146,7 +1146,7 @@ early_check_defaulted_comparison (tree f
> }
>
> /* We still need to deduce deleted/constexpr/noexcept and maybe return. */
> - DECL_MAYBE_DELETED (fn) = true;
> + DECL_MAYBE_DELETED (fn) = ok;
>
> return ok;
> }
> --- gcc/testsuite/g++.dg/cpp2a/spaceship-eq8.C.jj 2019-12-17 15:46:35.390322157 +0100
> +++ gcc/testsuite/g++.dg/cpp2a/spaceship-eq8.C 2019-12-17 15:46:31.493380971 +0100
> @@ -0,0 +1,8 @@
> +// PR c++/92966
> +// { dg-do compile { target c++2a } }
> +
> +struct S {
> + int operator==(const S&) const = default; // { dg-error "must return 'bool'" }
> + int s; // { dg-message "declared here" "" { target *-*-* } .-1 }
> +};
> +static_assert(S{} == S{}); // { dg-error "" }
>
> Jakub
>
More information about the Gcc-patches
mailing list