diff options
author | Jason Merrill <jason@redhat.com> | 2024-02-05 19:56:45 -0500 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2024-02-05 21:29:43 -0500 |
commit | c5d34912ad576be1ef19be92f7eabde54b9089eb (patch) | |
tree | 223d85153cb925b56b887a7997a8d916ee6f6463 | |
parent | 66eebab468045fcb3a8eedcfcc6756ad46aef3b8 (diff) | |
download | gcc-c5d34912ad576be1ef19be92f7eabde54b9089eb.zip gcc-c5d34912ad576be1ef19be92f7eabde54b9089eb.tar.gz gcc-c5d34912ad576be1ef19be92f7eabde54b9089eb.tar.bz2 |
c++: defaulted op== for incomplete class [PR107291]
After complaining about lack of friendship, we should not try to go on and
define the defaulted comparison operator anyway.
PR c++/107291
gcc/cp/ChangeLog:
* method.cc (early_check_defaulted_comparison): Fail if not friend.
gcc/testsuite/ChangeLog:
* g++.dg/cpp2a/spaceship-eq17.C: New test.
-rw-r--r-- | gcc/cp/method.cc | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/spaceship-eq17.C | 5 |
2 files changed, 10 insertions, 1 deletions
diff --git a/gcc/cp/method.cc b/gcc/cp/method.cc index d49e5a5..3b8dc75 100644 --- a/gcc/cp/method.cc +++ b/gcc/cp/method.cc @@ -1228,7 +1228,11 @@ early_check_defaulted_comparison (tree fn) /* Defaulted outside the class body. */ ctx = TYPE_MAIN_VARIANT (parmtype); if (!is_friend (ctx, fn)) - error_at (loc, "defaulted %qD is not a friend of %qT", fn, ctx); + { + error_at (loc, "defaulted %qD is not a friend of %qT", fn, ctx); + inform (location_of (ctx), "declared here"); + ok = false; + } } else if (!same_type_ignoring_top_level_qualifiers_p (parmtype, ctx)) saw_bad = true; diff --git a/gcc/testsuite/g++.dg/cpp2a/spaceship-eq17.C b/gcc/testsuite/g++.dg/cpp2a/spaceship-eq17.C new file mode 100644 index 0000000..039bfac --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/spaceship-eq17.C @@ -0,0 +1,5 @@ +// PR c++/107291 +// { dg-do compile { target c++20 } } + +struct S4; // { dg-message "declared here" } +bool operator==(S4 const &, S4 const &) = default; // { dg-error "not a friend" } |