Skip to content

Commit d9a03dd

Browse files
committed
[Sema] Produce better diagnostics when using inout on parameter types that cannot be 'inout'. Resolves swiftlang#68417
1 parent 7eac199 commit d9a03dd

File tree

3 files changed

+20
-3
lines changed

3 files changed

+20
-3
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3685,6 +3685,9 @@ ERROR(attr_not_on_variadic_parameters,none,
36853685
"'%0' must not be used on variadic parameters", (StringRef))
36863686
ERROR(attr_not_on_subscript_parameters,none,
36873687
"'%0' must not be used on subscript parameters", (StringRef))
3688+
ERROR(attr_not_on_enum_case_parameters,none,
3689+
"'%0' must not be used on enum case parameters", (StringRef))
3690+
36883691
ERROR(attr_not_on_stored_properties,none,
36893692
"'%0' must not be used on stored properties", (DeclAttribute))
36903693

lib/Sema/TypeCheckType.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4294,19 +4294,26 @@ TypeResolver::resolveOwnershipTypeRepr(OwnershipTypeRepr *repr,
42944294
options.hasBase(TypeResolverContext::SubscriptDecl) ||
42954295
options.hasBase(TypeResolverContext::EnumElementDecl)) {
42964296

4297-
decltype(diag::attr_only_on_parameters) diagID;
4298-
if (options.getBaseContext() == TypeResolverContext::SubscriptDecl) {
4297+
auto diagID = diag::attr_only_on_parameters;
4298+
bool removeRepr = true;
4299+
if (options.hasBase(TypeResolverContext::SubscriptDecl)) {
42994300
diagID = diag::attr_not_on_subscript_parameters;
43004301
} else if (options.is(TypeResolverContext::VariadicFunctionInput)) {
43014302
diagID = diag::attr_not_on_variadic_parameters;
4303+
} else if (options.hasBase(TypeResolverContext::EnumElementDecl)) {
4304+
diagID = diag::attr_not_on_enum_case_parameters;
43024305
} else {
43034306
diagID = diag::attr_only_on_parameters;
4307+
removeRepr = false;
43044308
}
43054309
StringRef name;
43064310
if (ownershipRepr) {
43074311
name = ownershipRepr->getSpecifierSpelling();
43084312
}
4309-
diagnoseInvalid(repr, repr->getSpecifierLoc(), diagID, name);
4313+
auto diag = diagnoseInvalid(repr, repr->getSpecifierLoc(), diagID, name);
4314+
if (removeRepr)
4315+
diag.fixItRemove(repr->getLoc());
4316+
43104317
return ErrorType::get(getASTContext());
43114318
}
43124319

test/type/types.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,3 +205,10 @@ func rdar94888357() {
205205

206206
let _ = S<String, String>("") // expected-error {{generic type 'S' specialized with too many type parameters (got 2, but expected 1)}}
207207
}
208+
209+
// https://github.com/apple/swift/issues/68417
210+
enum E {
211+
subscript(x: inout Int) -> Bool { true } // expected-error {{'inout' must not be used on subscript parameters}} {{16-22=}}
212+
case c(x: inout Int) // expected-error {{'inout' must not be used on enum case parameters}} {{13-19=}}
213+
func d(x: inout Int ...) // expected-error {{'inout' must not be used on variadic parameters}} {{13-19=}}
214+
}

0 commit comments

Comments
 (0)