diff --git a/include/swift/SIL/AbstractionPattern.h b/include/swift/SIL/AbstractionPattern.h index 890b6222225f7..3c5791cb99728 100644 --- a/include/swift/SIL/AbstractionPattern.h +++ b/include/swift/SIL/AbstractionPattern.h @@ -323,8 +323,10 @@ class AbstractionPattern { TheKind = unsigned(kind); OrigType = origType; GenericSig = CanGenericSignature(); - if (OrigType->hasTypeParameter()) + if (OrigType->hasTypeParameter()) { + assert(OrigType == signature->getCanonicalTypeInContext(origType)); GenericSig = signature; + } } void initClangType(CanGenericSignature signature, diff --git a/lib/SIL/AbstractionPattern.cpp b/lib/SIL/AbstractionPattern.cpp index 65a6d7f145417..9a7e5de9625d4 100644 --- a/lib/SIL/AbstractionPattern.cpp +++ b/lib/SIL/AbstractionPattern.cpp @@ -46,12 +46,13 @@ TypeConverter::getAbstractionPattern(AbstractStorageDecl *decl, AbstractionPattern TypeConverter::getAbstractionPattern(SubscriptDecl *decl, bool isNonObjC) { + auto type = decl->getElementInterfaceType()->getCanonicalType(); CanGenericSignature genericSig; - if (auto sig = decl->getGenericSignatureOfContext()) + if (auto sig = decl->getGenericSignatureOfContext()) { genericSig = sig.getCanonicalSignature(); - return AbstractionPattern(genericSig, - decl->getElementInterfaceType() - ->getCanonicalType()); + type = sig->getCanonicalTypeInContext(type); + } + return AbstractionPattern(genericSig, type); } static const clang::Type *getClangType(const clang::Decl *decl) { @@ -76,13 +77,15 @@ static Bridgeability getClangDeclBridgeability(const clang::Decl *decl) { AbstractionPattern TypeConverter::getAbstractionPattern(VarDecl *var, bool isNonObjC) { - CanGenericSignature genericSig; - if (auto sig = var->getDeclContext()->getGenericSignatureOfContext()) - genericSig = sig.getCanonicalSignature(); - CanType swiftType = var->getInterfaceType() ->getCanonicalType(); + CanGenericSignature genericSig; + if (auto sig = var->getDeclContext()->getGenericSignatureOfContext()) { + genericSig = sig.getCanonicalSignature(); + swiftType = genericSig->getCanonicalTypeInContext(swiftType); + } + if (isNonObjC) return AbstractionPattern(genericSig, swiftType); @@ -109,12 +112,15 @@ AbstractionPattern TypeConverter::getAbstractionPattern(EnumElementDecl *decl) { "Optional.Some does not have a unique abstraction pattern because " "optionals are re-abstracted"); + CanType type = decl->getArgumentInterfaceType()->getCanonicalType(); + CanGenericSignature genericSig; - if (auto sig = decl->getParentEnum()->getGenericSignatureOfContext()) + if (auto sig = decl->getParentEnum()->getGenericSignatureOfContext()) { genericSig = sig.getCanonicalSignature(); - return AbstractionPattern(genericSig, - decl->getArgumentInterfaceType() - ->getCanonicalType()); + type = genericSig->getCanonicalTypeInContext(type); + } + + return AbstractionPattern(genericSig, type); } AbstractionPattern::EncodedForeignErrorInfo diff --git a/lib/SIL/SILFunctionType.cpp b/lib/SIL/SILFunctionType.cpp index 678dc1cb43872..c8303951ca489 100644 --- a/lib/SIL/SILFunctionType.cpp +++ b/lib/SIL/SILFunctionType.cpp @@ -293,6 +293,8 @@ CanSILFunctionType SILFunctionType::getAutoDiffDerivativeFunctionType( // Given a type, returns its formal SIL parameter info. auto getTangentParameterInfoForOriginalResult = [&](CanType tanType, ResultConvention origResConv) -> SILParameterInfo { + if (derivativeFnGenSig) + tanType = derivativeFnGenSig->getCanonicalTypeInContext(tanType); AbstractionPattern pattern(derivativeFnGenSig, tanType); auto &tl = TC.getTypeLowering(pattern, tanType, TypeExpansionContext::minimal()); @@ -317,6 +319,8 @@ CanSILFunctionType SILFunctionType::getAutoDiffDerivativeFunctionType( // Given a type, returns its formal SIL result info. auto getTangentResultInfoForOriginalParameter = [&](CanType tanType, ParameterConvention origParamConv) -> SILResultInfo { + if (derivativeFnGenSig) + tanType = derivativeFnGenSig->getCanonicalTypeInContext(tanType); AbstractionPattern pattern(derivativeFnGenSig, tanType); auto &tl = TC.getTypeLowering(pattern, tanType, TypeExpansionContext::minimal());