Skip to content

Commit f9b1a52

Browse files
committed
Fix escaping_optional_type_argument producing behavior
1 parent 5f68f7a commit f9b1a52

File tree

2 files changed

+12
-12
lines changed

2 files changed

+12
-12
lines changed

lib/Sema/TypeCheckType.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2384,13 +2384,14 @@ Type TypeResolver::resolveAttributedType(TypeAttributes &attrs,
23842384
auto loc = attrs.getLoc(TAK_escaping);
23852385
auto attrRange = getTypeAttrRangeWithAt(Context, loc);
23862386

2387-
diagnoseInvalid(repr, loc, diag::escaping_non_function_parameter)
2388-
.fixItRemove(attrRange);
2389-
2390-
// Try to find a helpful note based on how the type is being used
2387+
// Try to find a better diagnostic based on how the type is being used
23912388
if (options.is(TypeResolverContext::ImmediateOptionalTypeArgument)) {
23922389
diagnoseInvalid(repr, repr->getLoc(),
2393-
diag::escaping_optional_type_argument);
2390+
diag::escaping_optional_type_argument)
2391+
.fixItRemove(attrRange);
2392+
} else {
2393+
diagnoseInvalid(repr, loc, diag::escaping_non_function_parameter)
2394+
.fixItRemove(attrRange);
23942395
}
23952396
}
23962397

@@ -2414,7 +2415,9 @@ Type TypeResolver::resolveAttributedType(TypeAttributes &attrs,
24142415
if (!attrs.has(i))
24152416
continue;
24162417

2417-
if (i == TAK_escaping && ty->getOptionalObjectType()) {
2418+
Type optionalObjectType = ty->getOptionalObjectType();
2419+
if (i == TAK_escaping && optionalObjectType &&
2420+
optionalObjectType->is<AnyFunctionType>()) {
24182421
auto diag = diagnoseInvalid(repr, attrs.getLoc(i),
24192422
diag::escaping_optional_type_argument);
24202423
diag.fixItRemove(

test/attr/attr_escaping.swift

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,9 @@ func misuseEscaping(_ a: @escaping Int) {} // expected-error{{@escaping attribut
7474
func misuseEscaping(_ a: (@escaping Int)?) {} // expected-error{{@escaping attribute only applies to function types}} {{27-36=}}
7575
func misuseEscaping(opt a: @escaping ((Int) -> Int)?) {} // expected-error{{closure is already escaping in optional type argument}} {{28-38=}}
7676

77-
func misuseEscaping(_ a: (@escaping (Int) -> Int)?) {} // expected-error{{@escaping attribute may only be used in function parameter position}} {{27-36=}}
78-
// expected-error@-1{{closure is already escaping in optional type argument}}
79-
func misuseEscaping(nest a: (((@escaping (Int) -> Int))?)) {} // expected-error{{@escaping attribute may only be used in function parameter position}} {{32-41=}}
80-
// expected-error@-1{{closure is already escaping in optional type argument}}
81-
func misuseEscaping(iuo a: (@escaping (Int) -> Int)!) {} // expected-error{{@escaping attribute may only be used in function parameter position}} {{29-38=}}
82-
// expected-error@-1{{closure is already escaping in optional type argument}}
77+
func misuseEscaping(_ a: (@escaping (Int) -> Int)?) {} // expected-error{{closure is already escaping in optional type argument}} {{27-36=}}
78+
func misuseEscaping(nest a: (((@escaping (Int) -> Int))?)) {} // expected-error{{closure is already escaping in optional type argument}} {{32-41=}}
79+
func misuseEscaping(iuo a: (@escaping (Int) -> Int)!) {} // expected-error{{closure is already escaping in optional type argument}} {{29-38=}}
8380

8481
func misuseEscaping(_ a: Optional<@escaping (Int) -> Int>, _ b: Int) {} // expected-error{{@escaping attribute may only be used in function parameter position}} {{35-44=}}
8582
func misuseEscaping(_ a: (@escaping (Int) -> Int, Int)) {} // expected-error{{@escaping attribute may only be used in function parameter position}} {{27-36=}}

0 commit comments

Comments
 (0)