Change error message to specify when inout usage is allowed

This commit is contained in:
Minhyuk Kim
2023-09-15 02:03:12 +09:00
parent d9a03dda17
commit c0eab4f551
8 changed files with 30 additions and 28 deletions

View File

@@ -3681,13 +3681,10 @@ ERROR(dynamic_self_default_arg,none,
ERROR(attr_only_one_decl_kind,none,
"%0 may only be used on '%1' declarations", (DeclAttribute,StringRef))
ERROR(attr_only_valid_on_func_or_init_params,none,
"'%0' may only be used on function or initializer parameters", (StringRef))
ERROR(attr_not_on_variadic_parameters,none,
"'%0' must not be used on variadic parameters", (StringRef))
ERROR(attr_not_on_subscript_parameters,none,
"'%0' must not be used on subscript parameters", (StringRef))
ERROR(attr_not_on_enum_case_parameters,none,
"'%0' must not be used on enum case parameters", (StringRef))
ERROR(attr_not_on_stored_properties,none,
"'%0' must not be used on stored properties", (DeclAttribute))

View File

@@ -4294,26 +4294,21 @@ TypeResolver::resolveOwnershipTypeRepr(OwnershipTypeRepr *repr,
options.hasBase(TypeResolverContext::SubscriptDecl) ||
options.hasBase(TypeResolverContext::EnumElementDecl)) {
auto diagID = diag::attr_only_on_parameters;
bool removeRepr = true;
if (options.hasBase(TypeResolverContext::SubscriptDecl)) {
diagID = diag::attr_not_on_subscript_parameters;
decltype(diag::attr_only_on_parameters) diagID;
if (options.hasBase(TypeResolverContext::SubscriptDecl) ||
options.hasBase(TypeResolverContext::EnumElementDecl)) {
diagID = diag::attr_only_valid_on_func_or_init_params;
} else if (options.is(TypeResolverContext::VariadicFunctionInput)) {
diagID = diag::attr_not_on_variadic_parameters;
} else if (options.hasBase(TypeResolverContext::EnumElementDecl)) {
diagID = diag::attr_not_on_enum_case_parameters;
} else {
diagID = diag::attr_only_on_parameters;
removeRepr = false;
}
StringRef name;
if (ownershipRepr) {
name = ownershipRepr->getSpecifierSpelling();
}
auto diag = diagnoseInvalid(repr, repr->getSpecifierLoc(), diagID, name);
if (removeRepr)
diag.fixItRemove(repr->getLoc());
diagnoseInvalid(repr, repr->getSpecifierLoc(), diagID, name);
return ErrorType::get(getASTContext());
}

View File

@@ -36,7 +36,7 @@ actor TestActor {
var value2: Int = 1 // expected-note 4{{property declared here}}
var points: [Point] = [] // expected-note {{property declared here}}
subscript(x : inout Int) -> Int { // expected-error {{'inout' must not be used on subscript parameters}}
subscript(x : inout Int) -> Int { // expected-error {{'inout' may only be used on function or initializer parameters}}
x += 1
return x
}

View File

@@ -646,8 +646,8 @@ func f(a : FooClass, b : LetStructMembers) {
class MutableSubscripts {
var x : Int = 0
subscript(x: inout Int) -> () { x += 1 } // expected-error {{'inout' must not be used on subscript parameters}}
subscript<T>(x: inout T) -> () { // expected-error {{'inout' must not be used on subscript parameters}}
subscript(x: inout Int) -> () { x += 1 } // expected-error {{'inout' may only be used on function or initializer parameters}}
subscript<T>(x: inout T) -> () { // expected-error {{'inout' may only be used on function or initializer parameters}}
fatalError()
}

View File

@@ -7,7 +7,7 @@ func h(_ : inout Int) -> (inout Int) -> (inout Int) -> Int { }
func ff(x: (inout Int, inout Float)) { } // expected-error 2{{'inout' may only be used on parameters}}
enum inout_carrier {
case carry(inout Int) // expected-error {{'inout' may only be used on parameters}}
case carry(inout Int) // expected-error {{'inout' may only be used on function or initializer parameters}}
}
func deprecated(inout x: Int) {} // expected-error {{'inout' before a parameter name is not allowed, place it before the parameter type instead}}

View File

@@ -324,8 +324,8 @@ func useSynthesizedMember() {
// Non-materializable argument type
enum Lens<T> {
case foo(inout T) // expected-error {{'inout' may only be used on parameters}}
case bar(inout T, Int) // expected-error {{'inout' may only be used on parameters}}
case foo(inout T) // expected-error {{'inout' may only be used on function or initializer parameters}}
case bar(inout T, Int) // expected-error {{'inout' may only be used on function or initializer parameters}}
case baz((inout T) -> ()) // ok
case quux((inout T, inout T) -> ()) // ok

View File

@@ -464,15 +464,15 @@ do {
struct InOutSubscripts {
subscript(x1: inout Int) -> Int { return 0 }
// expected-error@-1 {{'inout' must not be used on subscript parameters}}
// expected-error@-1 {{'inout' may only be used on function or initializer parameters}}
subscript(x2: inout Int, y2: inout Int) -> Int { return 0 }
// expected-error@-1 2{{'inout' must not be used on subscript parameters}}
// expected-error@-1 2{{'inout' may only be used on function or initializer parameters}}
subscript(x3: (inout Int) -> ()) -> Int { return 0 } // ok
subscript(x4: (inout Int, inout Int) -> ()) -> Int { return 0 } // ok
subscript(inout x5: Int) -> Int { return 0 }
// expected-error@-1 {{'inout' before a parameter name is not allowed, place it before the parameter type instead}}
// expected-error@-2 {{'inout' must not be used on subscript parameters}}
// expected-error@-2 {{'inout' may only be used on function or initializer parameters}}
}

View File

@@ -208,7 +208,17 @@ func rdar94888357() {
// https://github.com/apple/swift/issues/68417
enum E {
subscript(x: inout Int) -> Bool { true } // expected-error {{'inout' must not be used on subscript parameters}} {{16-22=}}
case c(x: inout Int) // expected-error {{'inout' must not be used on enum case parameters}} {{13-19=}}
func d(x: inout Int ...) // expected-error {{'inout' must not be used on variadic parameters}} {{13-19=}}
subscript(x: inout Int) -> Bool { true } // expected-error {{'inout' may only be used on function or initializer parameters}}
case c(x: inout Int) // expected-error {{'inout' may only be used on function or initializer parameters}}
func d(x: inout Int ...) {} // expected-error {{'inout' must not be used on variadic parameters}}
func e(x: inout Int) {} // ok
init(x: inout Int) {} // ok
}
do {
struct Test {
init(_: inout Int...) {} // expected-error {{'inout' must not be used on variadic parameters}}
func test(_: inout String...) {} // expected-error {{'inout' must not be used on variadic parameters}}
subscript(_: inout Double...) -> Bool { true } // expected-error {{'inout' may only be used on function or initializer parameters}}
}
}