Skip to content

Commit c883393

Browse files
committed
AST: Stricter invariants when constructing TypeAliasType
1 parent c2e5756 commit c883393

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
@@ -3011,9 +3011,12 @@ TypeAliasType::TypeAliasType(TypeAliasDecl *typealias, Type parent,
30113011

30123012
// Record the substitutions.
30133013
if (substitutions) {
3014+
assert(typealias->getGenericSignature()->isEqual(
3015+
substitutions.getGenericSignature()));
30143016
Bits.TypeAliasType.HasSubstitutionMap = true;
30153017
*getTrailingObjects<SubstitutionMap>() = substitutions;
30163018
} else {
3019+
assert(!typealias->isGenericContext());
30173020
Bits.TypeAliasType.HasSubstitutionMap = false;
30183021
}
30193022
}

lib/IDE/CompletionLookup.cpp

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1684,14 +1684,10 @@ void CompletionLookup::addTypeAliasRef(const TypeAliasDecl *TAD,
16841684
Builder.addBaseName(TAD->getName().str());
16851685
if (auto underlyingType = TAD->getUnderlyingType()) {
16861686
if (underlyingType->hasError()) {
1687-
Type parentType;
1688-
if (auto nominal = TAD->getDeclContext()->getSelfNominalTypeDecl()) {
1689-
parentType = nominal->getDeclaredInterfaceType();
1690-
}
16911687
addTypeAnnotation(Builder,
1692-
TypeAliasType::get(const_cast<TypeAliasDecl *>(TAD),
1693-
parentType, SubstitutionMap(),
1694-
underlyingType));
1688+
TAD->isGeneric()
1689+
? TAD->getUnboundGenericType()
1690+
: TAD->getDeclaredInterfaceType());
16951691

16961692
} else {
16971693
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)