[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