c++: Don't synthesize sfk_comparison method multiple times [PR94907]
On the following testcase we ICE, because synthesize_method is called twice on the same sfk_comparison method fndecl, the first time it works fine because start_preparsed_function in that case sets both current_function_decl and cfun, but second time it is called it only sets the former and keeps cfun NULL, so we ICE when trying to store current_function_returns_value. I think it is just wrong to call synthesize_method multiple times, and most synthesize_method callers avoid that by not calling it if DECL_INITIAL is already set, so this patch does that too. 2020-05-06 Jakub Jelinek <jakub@redhat.com> PR c++/94907 * method.c (defaulted_late_check): Don't call synthesize_method on constexpr sfk_comparison if it has been called on it already. * g++.dg/cpp2a/spaceship-synth8.C: New test.
This commit is contained in:
parent
72a54e5e81
commit
25ee2155ea
@ -1,3 +1,9 @@
|
||||
2020-05-06 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/94907
|
||||
* method.c (defaulted_late_check): Don't call synthesize_method
|
||||
on constexpr sfk_comparison if it has been called on it already.
|
||||
|
||||
2020-05-06 Nathan Sidwell <nathan@acm.org>
|
||||
|
||||
PR c++/94946
|
||||
|
@ -2939,7 +2939,7 @@ defaulted_late_check (tree fn)
|
||||
{
|
||||
/* If the function was declared constexpr, check that the definition
|
||||
qualifies. Otherwise we can define the function lazily. */
|
||||
if (DECL_DECLARED_CONSTEXPR_P (fn))
|
||||
if (DECL_DECLARED_CONSTEXPR_P (fn) && !DECL_INITIAL (fn))
|
||||
synthesize_method (fn);
|
||||
return;
|
||||
}
|
||||
|
@ -1,3 +1,8 @@
|
||||
2020-05-06 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/94907
|
||||
* g++.dg/cpp2a/spaceship-synth8.C: New test.
|
||||
|
||||
2020-05-06 qing zhao <qing.zhao@oracle.com>
|
||||
|
||||
PR c/94230
|
||||
|
12
gcc/testsuite/g++.dg/cpp2a/spaceship-synth8.C
Normal file
12
gcc/testsuite/g++.dg/cpp2a/spaceship-synth8.C
Normal file
@ -0,0 +1,12 @@
|
||||
// PR c++/94907
|
||||
// { dg-do compile { target c++2a } }
|
||||
|
||||
namespace std { struct strong_ordering { }; }
|
||||
|
||||
struct E;
|
||||
struct D {
|
||||
virtual std::strong_ordering operator<=>(const struct E&) const = 0;
|
||||
};
|
||||
struct E : D {
|
||||
std::strong_ordering operator<=>(const E&) const override = default;
|
||||
};
|
Loading…
x
Reference in New Issue
Block a user