Skip to content

Commit 89f6d27

Browse files
committed
ExistentialTypeSyntaxChecker: Fix any fix-it for compositions
1 parent 8955625 commit 89f6d27

File tree

3 files changed

+46
-6
lines changed

3 files changed

+46
-6
lines changed

lib/Sema/TypeCheckType.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6085,14 +6085,14 @@ class ExistentialTypeSyntaxChecker : public ASTWalker {
60856085
auto replacementIt = it;
60866086

60876087
// Backtrack the stack and expand the replacement range to any parent
6088-
// `.Type` metatypes, skipping only parentheses.
6088+
// compositions or `.Type` metatypes, skipping only parentheses.
60896089
do {
60906090
--it;
60916091
if ((*it)->isParenType()) {
60926092
continue;
60936093
}
60946094

6095-
if (isa<MetatypeTypeRepr>(*it)) {
6095+
if (isa<CompositionTypeRepr>(*it) || isa<MetatypeTypeRepr>(*it)) {
60966096
replacementIt = it;
60976097
continue;
60986098
}

test/type/explicit_existential.swift

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -451,13 +451,33 @@ func testAnyFixIt() {
451451
// expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{22-30=any HasAssoc}}
452452
func f(_: some G<HasAssoc>.HasAssoc_Alias) {}
453453
}
454+
// https://github.com/apple/swift/issues/65027
455+
// expected-error@+2:10 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-29=any HasAssoc & HasAssoc}}
456+
// expected-error@+1:21 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-29=any HasAssoc & HasAssoc}}
457+
let _: HasAssoc & HasAssoc
458+
// expected-error@+2:10 {{constraint that suppresses conformance requires 'any'}}{{10-10=any }}
459+
// expected-error@+1:22 {{constraint that suppresses conformance requires 'any'}}{{10-10=any }}
460+
let _: ~Copyable & ~Copyable
461+
// expected-error@+3:10 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-42=any HasAssoc & (HasAssoc & HasAssoc)}}
462+
// expected-error@+2:22 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-42=any HasAssoc & (HasAssoc & HasAssoc)}}
463+
// expected-error@+1:33 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-42=any HasAssoc & (HasAssoc & HasAssoc)}}
464+
let _: HasAssoc & (HasAssoc & HasAssoc)
465+
// FIXME: Incorrect fix-its for nested composition.
466+
// expected-error@+3:10 {{constraint that suppresses conformance requires 'any'}}{{10-10=any }}
467+
// expected-error@+2:23 {{constraint that suppresses conformance requires 'any'}}{{23-23=any }}
468+
// expected-error@+1:35 {{constraint that suppresses conformance requires 'any'}}{{23-23=any }}
469+
let _: ~Copyable & (~Copyable & ~Copyable)
454470

455471
// Misc. compound cases.
456472

457-
// FIXME: Incorrect fix-it for 'NonCopyableHasAssoc'.
458473
// expected-error@+2 {{constraint that suppresses conformance requires 'any'}}{{21-21=any }}
459-
// expected-error@+1 {{use of protocol 'NonCopyableHasAssoc' as a type must be written 'any NonCopyableHasAssoc'}}{{21-40=any NonCopyableHasAssoc}}
474+
// expected-error@+1 {{use of protocol 'NonCopyableHasAssoc' as a type must be written 'any NonCopyableHasAssoc'}}{{21-52=any NonCopyableHasAssoc & ~Copyable}}
460475
let _: (borrowing NonCopyableHasAssoc & ~Copyable) -> Void
476+
// FIXME: Incorrect fix-it.
477+
// expected-error@+3:15 {{constraint that suppresses conformance requires 'any'}}{{15-15=any }}
478+
// expected-error@+2:28 {{use of protocol 'NonCopyableHasAssoc' as a type must be written 'any NonCopyableHasAssoc'}}{{10-88=(any (((((~Copyable) & NonCopyableHasAssoc) & NonCopyableHasAssoc).Type.Type)).Type)}}
479+
// expected-error@+1:51 {{use of protocol 'NonCopyableHasAssoc' as a type must be written 'any NonCopyableHasAssoc'}}{{10-88=(any (((((~Copyable) & NonCopyableHasAssoc) & NonCopyableHasAssoc).Type.Type)).Type)}}
480+
let _: (((((~Copyable) & NonCopyableHasAssoc) & NonCopyableHasAssoc).Type.Type)).Type?
461481
let _: any (((((~Copyable) & NonCopyableHasAssoc) & NonCopyableHasAssoc).Type.Type)).Type // OK
462482

463483
// Misplaced '?'.

test/type/explicit_existential_swift6.swift

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -483,13 +483,33 @@ func testAnyFixIt() {
483483
// expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{22-30=any HasAssoc}}
484484
func f(_: some G<HasAssoc>.HasAssoc_Alias) {}
485485
}
486+
// https://github.com/apple/swift/issues/65027
487+
// expected-error@+2:10 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-29=any HasAssoc & HasAssoc}}
488+
// expected-error@+1:21 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-29=any HasAssoc & HasAssoc}}
489+
let _: HasAssoc & HasAssoc
490+
// expected-error@+2:10 {{constraint that suppresses conformance requires 'any'}}{{10-10=any }}
491+
// expected-error@+1:22 {{constraint that suppresses conformance requires 'any'}}{{10-10=any }}
492+
let _: ~Copyable & ~Copyable
493+
// expected-error@+3:10 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-42=any HasAssoc & (HasAssoc & HasAssoc)}}
494+
// expected-error@+2:22 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-42=any HasAssoc & (HasAssoc & HasAssoc)}}
495+
// expected-error@+1:33 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-42=any HasAssoc & (HasAssoc & HasAssoc)}}
496+
let _: HasAssoc & (HasAssoc & HasAssoc)
497+
// FIXME: Incorrect fix-its for nested composition.
498+
// expected-error@+3:10 {{constraint that suppresses conformance requires 'any'}}{{10-10=any }}
499+
// expected-error@+2:23 {{constraint that suppresses conformance requires 'any'}}{{23-23=any }}
500+
// expected-error@+1:35 {{constraint that suppresses conformance requires 'any'}}{{23-23=any }}
501+
let _: ~Copyable & (~Copyable & ~Copyable)
486502

487503
// Misc. compound cases.
488504

489-
// FIXME: Incorrect fix-it for 'NonCopyableHasAssoc'.
490505
// expected-error@+2 {{constraint that suppresses conformance requires 'any'}}{{21-21=any }}
491-
// expected-error@+1 {{use of protocol 'NonCopyableHasAssoc' as a type must be written 'any NonCopyableHasAssoc'}}{{21-40=any NonCopyableHasAssoc}}
506+
// expected-error@+1 {{use of protocol 'NonCopyableHasAssoc' as a type must be written 'any NonCopyableHasAssoc'}}{{21-52=any NonCopyableHasAssoc & ~Copyable}}
492507
let _: (borrowing NonCopyableHasAssoc & ~Copyable) -> Void
508+
// FIXME: Incorrect fix-it.
509+
// expected-error@+3:15 {{constraint that suppresses conformance requires 'any'}}{{15-15=any }}
510+
// expected-error@+2:28 {{use of protocol 'NonCopyableHasAssoc' as a type must be written 'any NonCopyableHasAssoc'}}{{10-88=(any (((((~Copyable) & NonCopyableHasAssoc) & NonCopyableHasAssoc).Type.Type)).Type)}}
511+
// expected-error@+1:51 {{use of protocol 'NonCopyableHasAssoc' as a type must be written 'any NonCopyableHasAssoc'}}{{10-88=(any (((((~Copyable) & NonCopyableHasAssoc) & NonCopyableHasAssoc).Type.Type)).Type)}}
512+
let _: (((((~Copyable) & NonCopyableHasAssoc) & NonCopyableHasAssoc).Type.Type)).Type?
493513
let _: any (((((~Copyable) & NonCopyableHasAssoc) & NonCopyableHasAssoc).Type.Type)).Type // OK
494514

495515
// Misplaced '?'.

0 commit comments

Comments
 (0)