From c0eab4f551377b42c643147555763b98da41c5bb Mon Sep 17 00:00:00 2001 From: Minhyuk Kim Date: Fri, 15 Sep 2023 02:03:12 +0900 Subject: [PATCH] Change error message to specify when inout usage is allowed --- include/swift/AST/DiagnosticsSema.def | 7 ++----- lib/Sema/TypeCheckType.cpp | 17 ++++++----------- test/Concurrency/actor_inout_isolation.swift | 2 +- test/Sema/immutability.swift | 4 ++-- test/attr/attr_inout.swift | 2 +- test/decl/enum/enumtest.swift | 4 ++-- test/decl/subscript/subscripting.swift | 6 +++--- test/type/types.swift | 16 +++++++++++++--- 8 files changed, 30 insertions(+), 28 deletions(-) diff --git a/include/swift/AST/DiagnosticsSema.def b/include/swift/AST/DiagnosticsSema.def index 1ea2f346148..b29cdb6918c 100644 --- a/include/swift/AST/DiagnosticsSema.def +++ b/include/swift/AST/DiagnosticsSema.def @@ -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)) diff --git a/lib/Sema/TypeCheckType.cpp b/lib/Sema/TypeCheckType.cpp index 5cf47d620c1..faf1b3fa8ae 100644 --- a/lib/Sema/TypeCheckType.cpp +++ b/lib/Sema/TypeCheckType.cpp @@ -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()); } diff --git a/test/Concurrency/actor_inout_isolation.swift b/test/Concurrency/actor_inout_isolation.swift index 80fe9f5bb59..1d4db33c694 100644 --- a/test/Concurrency/actor_inout_isolation.swift +++ b/test/Concurrency/actor_inout_isolation.swift @@ -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 } diff --git a/test/Sema/immutability.swift b/test/Sema/immutability.swift index 7b8e601b407..88d49d1a670 100644 --- a/test/Sema/immutability.swift +++ b/test/Sema/immutability.swift @@ -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(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(x: inout T) -> () { // expected-error {{'inout' may only be used on function or initializer parameters}} fatalError() } diff --git a/test/attr/attr_inout.swift b/test/attr/attr_inout.swift index 52d36d1f98e..fffdfc3ccbf 100644 --- a/test/attr/attr_inout.swift +++ b/test/attr/attr_inout.swift @@ -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}} diff --git a/test/decl/enum/enumtest.swift b/test/decl/enum/enumtest.swift index 6f7d02e5979..9cd20c41056 100644 --- a/test/decl/enum/enumtest.swift +++ b/test/decl/enum/enumtest.swift @@ -324,8 +324,8 @@ func useSynthesizedMember() { // Non-materializable argument type enum Lens { - 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 diff --git a/test/decl/subscript/subscripting.swift b/test/decl/subscript/subscripting.swift index 4e9ac98cd64..2cf1de7fcaa 100644 --- a/test/decl/subscript/subscripting.swift +++ b/test/decl/subscript/subscripting.swift @@ -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}} } diff --git a/test/type/types.swift b/test/type/types.swift index 45c6392fac6..3e9b6cc43fd 100644 --- a/test/type/types.swift +++ b/test/type/types.swift @@ -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}} + } +} \ No newline at end of file