Skip to content

Commit 41406d6

Browse files
committed
AST: Stricter invariants when constructing TypeAliasType
1 parent 97ff354 commit 41406d6

File tree

4 files changed

+8
-10
lines changed

4 files changed

+8
-10
lines changed

lib/AST/ASTContext.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3019,9 +3019,12 @@ TypeAliasType::TypeAliasType(TypeAliasDecl *typealias, Type parent,
30193019

30203020
// Record the substitutions.
30213021
if (substitutions) {
3022+
assert(typealias->getGenericSignature()->isEqual(
3023+
substitutions.getGenericSignature()));
30223024
Bits.TypeAliasType.HasSubstitutionMap = true;
30233025
*getTrailingObjects<SubstitutionMap>() = substitutions;
30243026
} else {
3027+
assert(!typealias->isGenericContext());
30253028
Bits.TypeAliasType.HasSubstitutionMap = false;
30263029
}
30273030
}

lib/IDE/CompletionLookup.cpp

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1687,14 +1687,10 @@ void CompletionLookup::addTypeAliasRef(const TypeAliasDecl *TAD,
16871687
Builder.addBaseName(TAD->getName().str());
16881688
if (auto underlyingType = TAD->getUnderlyingType()) {
16891689
if (underlyingType->hasError()) {
1690-
Type parentType;
1691-
if (auto nominal = TAD->getDeclContext()->getSelfNominalTypeDecl()) {
1692-
parentType = nominal->getDeclaredInterfaceType();
1693-
}
16941690
addTypeAnnotation(Builder,
1695-
TypeAliasType::get(const_cast<TypeAliasDecl *>(TAD),
1696-
parentType, SubstitutionMap(),
1697-
underlyingType));
1691+
TAD->isGeneric()
1692+
? TAD->getUnboundGenericType()
1693+
: TAD->getDeclaredInterfaceType());
16981694

16991695
} else {
17001696
addTypeAnnotation(Builder, underlyingType);

lib/Sema/ImportResolution.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1045,8 +1045,7 @@ ScopedImportLookupRequest::evaluate(Evaluator &evaluator,
10451045
emittedDiag.emplace(ctx.Diags.diagnose(
10461046
importLoc, diag::imported_decl_is_wrong_kind_typealias,
10471047
typealias->getDescriptiveKind(),
1048-
TypeAliasType::get(typealias, Type(), SubstitutionMap(),
1049-
typealias->getUnderlyingType()),
1048+
typealias->getDeclaredInterfaceType(),
10501049
getImportKindString(importKind)));
10511050
} else {
10521051
emittedDiag.emplace(ctx.Diags.diagnose(

test/ImportResolution/import-specific-fixits.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import struct DeclsUsedWrongly.Choice // expected-error {{'Choice' was imported
3636
import struct DeclsUsedWrongly.Callback // expected-error {{type alias 'Callback' (aka '() -> ()') cannot be imported as 'struct'}} {{8-14=typealias}}
3737
import var DeclsUsedWrongly.Callback // expected-error {{'Callback' was imported as 'var', but is a type}} {{8-11=typealias}}
3838

39-
import struct DeclsUsedWrongly.Pair // expected-error {{type alias 'Pair' (aka '(T, T)') cannot be imported as 'struct'}} {{8-14=typealias}}
39+
import struct DeclsUsedWrongly.Pair // expected-error {{type alias 'Pair<T>' (aka '(T, T)') cannot be imported as 'struct'}} {{8-14=typealias}}
4040
import var DeclsUsedWrongly.Pair // expected-error {{'Pair' was imported as 'var', but is a type}} {{8-11=typealias}}
4141

4242
import struct Swift.print // expected-error {{'print' was imported as 'struct', but is a function}} {{8-14=func}}

0 commit comments

Comments
 (0)