Skip to content

Commit 2893e3d

Browse files
committed
Sema: reword inverse-on-extension message
We should be saying "can't suppress Copyable" instead, since you can't "suppress" ~Copyable.
1 parent ec4a125 commit 2893e3d

File tree

4 files changed

+20
-9
lines changed

4 files changed

+20
-9
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7728,8 +7728,8 @@ ERROR(inverse_conflicts_explicit_composition, none,
77287728
"composition cannot contain '~%0' when another member requires '%0'",
77297729
(StringRef))
77307730
ERROR(inverse_extension, none,
7731-
"cannot suppress %0 in extension",
7732-
(Type))
7731+
"cannot suppress '%0' in extension",
7732+
(StringRef))
77337733
ERROR(copyable_illegal_deinit, none,
77347734
"deinitializer cannot be declared in %kind0 that conforms to 'Copyable'",
77357735
(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: 7 additions & 1 deletion
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 {}
@@ -123,3 +123,9 @@ func typeInExpression() {
123123

124124
func param3(_ t: borrowing any ~Copyable) {}
125125
func param4(_ t: any ~Copyable.Type) {}
126+
127+
protocol P: ~Copyable {}
128+
protocol Q: ~Copyable {}
129+
protocol R: ~Copyable {}
130+
struct Blooper<T: ~Copyable>: ~Copyable {}
131+
extension Blooper: (Q & (R & (~Copyable & P))) {} // expected-error {{cannot suppress 'Copyable' in extension}}

0 commit comments

Comments
 (0)