Skip to content

Commit d634566

Browse files
committed
Sema: reword inverse-on-extension message
We should be saying "can't suppress Copyable" instead, since you can't "suppress" ~Copyable. (cherry picked from commit 2893e3d)
1 parent 9c9bfdd commit d634566

File tree

4 files changed

+19
-10
lines changed

4 files changed

+19
-10
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7681,8 +7681,8 @@ ERROR(inverse_conflicts_explicit_composition, none,
76817681
"composition cannot contain '~%0' when another member requires '%0'",
76827682
(StringRef))
76837683
ERROR(inverse_extension, none,
7684-
"cannot suppress %0 in extension",
7685-
(Type))
7684+
"cannot suppress '%0' in extension",
7685+
(StringRef))
76867686
ERROR(copyable_illegal_deinit, none,
76877687
"deinitializer cannot be declared in %kind0 that conforms to 'Copyable'",
76887688
(const ValueDecl *))

lib/Sema/TypeCheckDeclPrimary.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -295,10 +295,15 @@ static void checkInheritanceClause(
295295
auto layout = inheritedTy->getExistentialLayout();
296296

297297
// An inverse on an extension is an error.
298-
if (isa<ExtensionDecl>(decl))
299-
if (auto pct = inheritedTy->getAs<ProtocolCompositionType>())
300-
if (!pct->getInverses().empty())
301-
decl->diagnose(diag::inverse_extension, inheritedTy);
298+
if (isa<ExtensionDecl>(decl)) {
299+
auto canInheritedTy = inheritedTy->getCanonicalType();
300+
if (auto pct = canInheritedTy->getAs<ProtocolCompositionType>()) {
301+
for (auto inverse : pct->getInverses()) {
302+
decl->diagnose(diag::inverse_extension,
303+
getProtocolName(getKnownProtocolKind(inverse)));
304+
}
305+
}
306+
}
302307

303308
// Subclass existentials are not allowed except on classes and
304309
// non-@objc protocols.

test/Generics/inverse_generics.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,11 +188,11 @@ class NiceTry: ~Copyable, Copyable {} // expected-error {{classes cannot be '~Co
188188

189189

190190
struct Extendo: ~Copyable {}
191-
extension Extendo: Copyable, ~Copyable {} // expected-error {{cannot suppress '~Copyable' in extension}}
191+
extension Extendo: Copyable, ~Copyable {} // expected-error {{cannot suppress 'Copyable' in extension}}
192192
// expected-error@-1 {{struct 'Extendo' required to be 'Copyable' but is marked with '~Copyable'}}
193193

194194
enum EnumExtendo {}
195-
extension EnumExtendo: ~Copyable {} // expected-error {{cannot suppress '~Copyable' in extension}}
195+
extension EnumExtendo: ~Copyable {} // expected-error {{cannot suppress 'Copyable' in extension}}
196196

197197
extension NeedsCopyable where Self: ~Copyable {}
198198
// expected-error@-1 {{'Self' required to be 'Copyable' but is marked with '~Copyable'}}

test/Parse/inverses.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ protocol Rope<Element>: Hashable, ~Copyable { // expected-error {{'Self' requir
5252
associatedtype Element: ~Copyable
5353
}
5454

55-
extension S: ~Copyable {} // expected-error {{cannot suppress '~Copyable' in extension}}
55+
extension S: ~Copyable {} // expected-error {{cannot suppress 'Copyable' in extension}}
5656

5757
struct S: ~U, // expected-error {{type 'U' cannot be suppressed}}
5858
~Copyable {}
@@ -129,4 +129,8 @@ func param2(_ t: ~Copyable.Type) {} // expected-error{{constraint that suppresse
129129
func param3(_ t: borrowing any ~Copyable) {}
130130
func param4(_ t: any ~Copyable.Type) {}
131131

132-
func param3(_ t: borrowing ExtraNoncopyProto & ~Copyable) {} // expected-error{{constraint that suppresses conformance requires 'any'}}{{28-28=any }}
132+
protocol P: ~Copyable {}
133+
protocol Q: ~Copyable {}
134+
protocol R: ~Copyable {}
135+
struct Blooper<T: ~Copyable>: ~Copyable {}
136+
extension Blooper: (Q & (R & (~Copyable & P))) {} // expected-error {{cannot suppress 'Copyable' in extension}}

0 commit comments

Comments
 (0)