@@ -150,7 +150,7 @@ namespace {
150150
151151 Type performTypeResolution (TypeRepr *TyR, bool IsSILType,
152152 GenericEnvironment *GenericEnv,
153- GenericParamList *GenericParams);
153+ GenericParamList *GenericParams) const ;
154154
155155 void convertRequirements (ArrayRef<RequirementRepr> From,
156156 SmallVectorImpl<Requirement> &To);
@@ -915,9 +915,8 @@ void SILParser::convertRequirements(ArrayRef<RequirementRepr> From,
915915 // Use parser lexical scopes to resolve references
916916 // to the generic parameters.
917917 auto ResolveToInterfaceType = [&](TypeRepr *TyR) -> Type {
918- return performTypeResolution (TyR, /* IsSILType=*/ false ,
919- ContextGenericEnv, ContextGenericParams)
920- ->mapTypeOutOfContext ();
918+ return performTypeResolution (TyR, /* IsSILType=*/ false , ContextGenericEnv,
919+ ContextGenericParams);
921920 };
922921
923922 for (auto &Req : From) {
@@ -1187,7 +1186,7 @@ static bool parseDeclSILOptional(bool *isTransparent,
11871186
11881187Type SILParser::performTypeResolution (TypeRepr *TyR, bool IsSILType,
11891188 GenericEnvironment *GenericEnv,
1190- GenericParamList *GenericParams) {
1189+ GenericParamList *GenericParams) const {
11911190 if (GenericEnv == nullptr )
11921191 GenericEnv = ContextGenericEnv;
11931192
@@ -1251,26 +1250,26 @@ bool SILParser::parseASTType(CanType &result,
12511250 ParserResult<TypeRepr> parsedType = P.parseType ();
12521251 if (parsedType.isNull ()) return true ;
12531252
1254- bool wantInterfaceType = true ;
1253+ bool wantContextualType = false ;
12551254 if (genericEnv == nullptr ) {
12561255 genericEnv = ContextGenericEnv;
1257- wantInterfaceType = false ;
1256+ wantContextualType = true ;
12581257 }
12591258 if (genericParams == nullptr )
12601259 genericParams = ContextGenericParams;
12611260
12621261 bindSILGenericParams (parsedType.get ());
12631262
1264- const auto resolvedType =
1265- performTypeResolution (parsedType.get (), /* isSILType=*/ false ,
1266- genericEnv, genericParams);
1263+ auto resolvedType = performTypeResolution (
1264+ parsedType.get (), /* isSILType=*/ false , genericEnv, genericParams);
1265+ if (wantContextualType && genericEnv) {
1266+ resolvedType = genericEnv->mapTypeIntoContext (resolvedType);
1267+ }
1268+
12671269 if (resolvedType->hasError ())
12681270 return true ;
12691271
1270- if (wantInterfaceType)
1271- result = resolvedType->mapTypeOutOfContext ()->getCanonicalType ();
1272- else
1273- result = resolvedType->getCanonicalType ();
1272+ result = resolvedType->getCanonicalType ();
12741273
12751274 return false ;
12761275}
@@ -1363,9 +1362,12 @@ bool SILParser::parseSILType(SILType &Result,
13631362 auto *attrRepr =
13641363 P.applyAttributeToType (
13651364 TyR.get (), attrs, specifier, specifierLoc, isolatedLoc);
1366- const auto Ty =
1367- performTypeResolution (attrRepr, /* IsSILType=*/ true ,
1368- OuterGenericEnv, OuterGenericParams);
1365+ auto Ty = performTypeResolution (attrRepr, /* IsSILType=*/ true , OuterGenericEnv,
1366+ OuterGenericParams);
1367+ if (OuterGenericEnv) {
1368+ Ty = OuterGenericEnv->mapTypeIntoContext (Ty);
1369+ }
1370+
13691371 if (Ty->hasError ())
13701372 return true ;
13711373
@@ -1930,9 +1932,12 @@ bool SILParser::parseSubstitutions(SmallVectorImpl<ParsedSubstitution> &parsed,
19301932 if (TyR.isNull ())
19311933 return true ;
19321934
1933- const auto Ty =
1934- performTypeResolution (TyR.get (), /* IsSILType=*/ false ,
1935- GenericEnv, GenericParams);
1935+ auto Ty = performTypeResolution (TyR.get (), /* IsSILType=*/ false , GenericEnv,
1936+ GenericParams);
1937+ if (GenericEnv) {
1938+ Ty = GenericEnv->mapTypeIntoContext (Ty);
1939+ }
1940+
19361941 if (Ty->hasError ())
19371942 return true ;
19381943 parsed.push_back ({Loc, Ty});
@@ -2321,9 +2326,8 @@ bool SILParser::parseSILDeclRef(SILDeclRef &Member, bool FnTypeRequired) {
23212326 genericParams = fnType->getGenericParams ();
23222327 }
23232328
2324- const auto Ty =
2325- performTypeResolution (TyR.get (), /* IsSILType=*/ false ,
2326- genericEnv, genericParams);
2329+ const auto Ty = performTypeResolution (TyR.get (), /* IsSILType=*/ false ,
2330+ genericEnv, genericParams);
23272331 if (Ty->hasError ())
23282332 return true ;
23292333
@@ -6841,9 +6845,12 @@ ProtocolConformanceRef SILParser::parseProtocolConformanceHelper(
68416845 if (witnessParams == nullptr )
68426846 witnessParams = ContextGenericParams;
68436847
6844- const auto ConformingTy =
6845- performTypeResolution (TyR.get (), /* IsSILType=*/ false ,
6846- witnessEnv, witnessParams);
6848+ auto ConformingTy = performTypeResolution (TyR.get (), /* IsSILType=*/ false ,
6849+ witnessEnv, witnessParams);
6850+ if (witnessEnv) {
6851+ ConformingTy = witnessEnv->mapTypeIntoContext (ConformingTy);
6852+ }
6853+
68476854 if (ConformingTy->hasError ())
68486855 return ProtocolConformanceRef ();
68496856
@@ -6957,13 +6964,17 @@ static bool parseSILWitnessTableEntry(
69576964 if (TyR.isNull ())
69586965 return true ;
69596966
6960- const auto Ty =
6967+ auto Ty =
69616968 swift::performTypeResolution (TyR.get (), P.Context ,
69626969 /* isSILMode=*/ false ,
69636970 /* isSILType=*/ false ,
69646971 witnessEnv,
69656972 witnessParams,
69666973 &P.SF );
6974+ if (witnessEnv) {
6975+ Ty = witnessEnv->mapTypeIntoContext (Ty);
6976+ }
6977+
69676978 if (Ty->hasError ())
69686979 return true ;
69696980
@@ -7018,12 +7029,16 @@ static bool parseSILWitnessTableEntry(
70187029 if (TyR.isNull ())
70197030 return true ;
70207031
7021- const auto Ty =
7032+ auto Ty =
70227033 swift::performTypeResolution (TyR.get (), P.Context ,
70237034 /* isSILMode=*/ false ,
70247035 /* isSILType=*/ false ,
70257036 witnessEnv, witnessParams,
70267037 &P.SF );
7038+ if (witnessEnv) {
7039+ Ty = witnessEnv->mapTypeIntoContext (Ty);
7040+ }
7041+
70277042 if (Ty->hasError ())
70287043 return true ;
70297044
0 commit comments