@@ -862,14 +862,16 @@ static ValueDecl *getRefCountingOperation(ASTContext &ctx, Identifier id) {
862862static ValueDecl *getLoadOperation (ASTContext &ctx, Identifier id) {
863863 return getBuiltinFunction (ctx, id, _thin,
864864 _generics (_unrestricted,
865- _conformsTo (_typeparam (0 ), _copyable)),
865+ _conformsTo (_typeparam (0 ), _copyable),
866+ _conformsTo (_typeparam (0 ), _escapable)),
866867 _parameters (_rawPointer),
867868 _typeparam (0 ));
868869}
869870
870871static ValueDecl *getTakeOperation (ASTContext &ctx, Identifier id) {
871872 return getBuiltinFunction (ctx, id, _thin,
872- _generics (_unrestricted),
873+ _generics (_unrestricted,
874+ _conformsTo (_typeparam (0 ), _escapable)),
873875 _parameters (_rawPointer),
874876 _typeparam (0 ));
875877}
@@ -902,7 +904,8 @@ static ValueDecl *getDestroyArrayOperation(ASTContext &ctx, Identifier id) {
902904static ValueDecl *getCopyOperation (ASTContext &ctx, Identifier id) {
903905 return getBuiltinFunction (ctx, id, _thin,
904906 _generics (_unrestricted,
905- _conformsTo (_typeparam (0 ), _copyable)),
907+ _conformsTo (_typeparam (0 ), _copyable),
908+ _conformsTo (_typeparam (0 ), _escapable)),
906909 _parameters (_typeparam (0 )), _typeparam (0 ));
907910}
908911
@@ -976,12 +979,16 @@ static ValueDecl *getAllocWithTailElemsOperation(ASTContext &Context,
976979 1 + NumTailTypes > (int )std::size (GenericParamNames))
977980 return nullptr ;
978981 BuiltinFunctionBuilder builder (Context, 1 + NumTailTypes);
979- builder.addParameter (makeMetatype (makeGenericParam (0 )));
982+
983+ auto resultTy = makeGenericParam (0 );
984+ builder.addConformanceRequirement (resultTy, KnownProtocolKind::Escapable);
985+
986+ builder.addParameter (makeMetatype (resultTy));
980987 for (int Idx = 0 ; Idx < NumTailTypes; ++Idx) {
981988 builder.addParameter (makeConcrete (BuiltinIntegerType::getWordType (Context)));
982989 builder.addParameter (makeMetatype (makeGenericParam (Idx + 1 )));
983990 }
984- builder.setResult (makeGenericParam ( 0 ) );
991+ builder.setResult (resultTy );
985992 return builder.build (Id);
986993}
987994
@@ -1262,6 +1269,7 @@ static ValueDecl *getCOWBufferForReading(ASTContext &C, Identifier Id) {
12621269 //
12631270 BuiltinFunctionBuilder builder (C, 1 , true );
12641271 auto T = makeGenericParam ();
1272+ builder.addConformanceRequirement (T, KnownProtocolKind::Escapable);
12651273 builder.addParameter (T);
12661274 builder.setResult (T);
12671275 return builder.build (Id);
@@ -1286,7 +1294,11 @@ static ValueDecl *getCastReferenceOperation(ASTContext &ctx,
12861294 // SILGen and IRGen check additional constraints during lowering.
12871295 BuiltinFunctionBuilder builder (ctx, 2 );
12881296 builder.addParameter (makeGenericParam (0 ), ParamSpecifier::LegacyOwned);
1289- builder.setResult (makeGenericParam (1 ));
1297+
1298+ auto resultTy = makeGenericParam (1 );
1299+ builder.addConformanceRequirement (resultTy, KnownProtocolKind::Escapable);
1300+ builder.setResult (resultTy);
1301+
12901302 return builder.build (name);
12911303}
12921304
@@ -1296,7 +1308,11 @@ static ValueDecl *getReinterpretCastOperation(ASTContext &ctx,
12961308 // SILGen and IRGen check additional constraints during lowering.
12971309 BuiltinFunctionBuilder builder (ctx, 2 );
12981310 builder.addParameter (makeGenericParam (0 ), ParamSpecifier::LegacyOwned);
1299- builder.setResult (makeGenericParam (1 ));
1311+
1312+ auto resultTy = makeGenericParam (1 );
1313+ builder.addConformanceRequirement (resultTy, KnownProtocolKind::Escapable);
1314+ builder.setResult (resultTy);
1315+
13001316 return builder.build (name);
13011317}
13021318
@@ -1485,7 +1501,11 @@ static ValueDecl *getConvertUnownedUnsafeToGuaranteed(ASTContext &ctx,
14851501 BuiltinFunctionBuilder builder (ctx, 3 );
14861502 builder.addParameter (makeGenericParam (0 )); // Base
14871503 builder.addParameter (makeGenericParam (1 ), ParamSpecifier::InOut); // Unmanaged
1488- builder.setResult (makeGenericParam (2 )); // Guaranteed Result
1504+
1505+ auto resultTy = makeGenericParam (2 );
1506+ builder.addConformanceRequirement (resultTy, KnownProtocolKind::Escapable);
1507+ builder.setResult (resultTy); // Guaranteed Result
1508+
14891509 return builder.build (id);
14901510}
14911511
0 commit comments