Skip to content

Commit 184058e

Browse files
authored
Merge pull request #76588 from meg-gupta/lifetimeremovefeatureguardincompiler
Remove feature guard on lifetime dependence inference
2 parents 9e5a105 + cf4832e commit 184058e

22 files changed

+66
-44
lines changed

lib/AST/Builtins.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2114,9 +2114,13 @@ static ValueDecl *getOnceOperation(ASTContext &Context,
21142114
static ValueDecl *getPolymorphicBinaryOperation(ASTContext &ctx,
21152115
Identifier id) {
21162116
BuiltinFunctionBuilder builder(ctx);
2117-
builder.addParameter(makeGenericParam());
2118-
builder.addParameter(makeGenericParam());
2119-
builder.setResult(makeGenericParam());
2117+
2118+
// Builtins of the form: func binOp<T>(_ t: T, _ t: T) -> T
2119+
auto genericParam = makeGenericParam();
2120+
builder.addConformanceRequirement(genericParam, KnownProtocolKind::Escapable);
2121+
builder.addParameter(genericParam);
2122+
builder.addParameter(genericParam);
2123+
builder.setResult(genericParam);
21202124
return builder.build(id);
21212125
}
21222126

@@ -2230,6 +2234,7 @@ static ValueDecl *getEmplace(ASTContext &ctx, Identifier id) {
22302234
BuiltinFunctionBuilder builder(ctx, /* genericParamCount */ 1);
22312235

22322236
auto T = makeGenericParam();
2237+
builder.addConformanceRequirement(T, KnownProtocolKind::Escapable);
22332238

22342239
auto fnParamTy = FunctionType::get(FunctionType::Param(ctx.TheRawPointerType),
22352240
ctx.TheEmptyTupleType,

lib/AST/ConformanceLookup.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -850,6 +850,10 @@ static bool conformsToInvertible(CanType type, InvertibleProtocolKind ip) {
850850
if (type->is<SILPackType>())
851851
return true;
852852

853+
if (type->is<SILTokenType>()) {
854+
return true;
855+
}
856+
853857
// The SIL types in the AST do not have real conformances, and should have
854858
// been handled in SILType instead.
855859
assert(!(type->is<SILBoxType,

lib/AST/LifetimeDependence.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -684,9 +684,6 @@ std::optional<LifetimeDependenceInfo> LifetimeDependenceInfo::inferMutatingSelf(
684684

685685
std::optional<llvm::ArrayRef<LifetimeDependenceInfo>>
686686
LifetimeDependenceInfo::get(AbstractFunctionDecl *afd) {
687-
if (!afd->getASTContext().LangOpts.hasFeature(Feature::NonescapableTypes)) {
688-
return std::nullopt;
689-
}
690687
assert(isa<FuncDecl>(afd) || isa<ConstructorDecl>(afd));
691688

692689
if (afd->getAttrs().hasAttribute<LifetimeAttr>()) {
@@ -706,9 +703,6 @@ std::optional<llvm::ArrayRef<LifetimeDependenceInfo>>
706703
LifetimeDependenceInfo::get(FunctionTypeRepr *funcRepr,
707704
ArrayRef<SILParameterInfo> params,
708705
ArrayRef<SILResultInfo> results, DeclContext *dc) {
709-
if (!dc->getASTContext().LangOpts.hasFeature(Feature::NonescapableTypes)) {
710-
return std::nullopt;
711-
}
712706
SmallVector<LifetimeDependenceInfo, 1> lifetimeDependencies;
713707

714708
auto getLifetimeDependenceFromDependsOnTypeModifier =

lib/ClangImporter/ImportType.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2633,9 +2633,11 @@ static ParamDecl *getParameterInfo(ClangImporter::Implementation *impl,
26332633
// Swift doesn't support default values of inout parameters.
26342634
// TODO: support default arguments of constructors
26352635
// (https://github.com/apple/swift/issues/70124)
2636+
// TODO: support params with template parameters
26362637
if (param->hasDefaultArg() && !isInOut &&
26372638
!isa<clang::CXXConstructorDecl>(param->getDeclContext()) &&
2638-
impl->isDefaultArgSafeToImport(param)) {
2639+
impl->isDefaultArgSafeToImport(param) &&
2640+
!param->isTemplated()) {
26392641
SwiftDeclSynthesizer synthesizer(*impl);
26402642
if (CallExpr *defaultArgExpr = synthesizer.makeDefaultArgument(
26412643
param, swiftParamTy, paramInfo->getParameterNameLoc())) {

lib/Parse/ParseDecl.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2718,8 +2718,8 @@ ParserResult<LifetimeAttr> Parser::parseLifetimeAttribute(SourceLoc atLoc,
27182718
SourceLoc loc) {
27192719
ParserStatus status;
27202720
if (!Context.LangOpts.hasFeature(Feature::NonescapableTypes)) {
2721-
diagnose(loc, diag::requires_experimental_feature, "lifetime attribute",
2722-
false, getFeatureName(Feature::NonescapableTypes));
2721+
diagnose(loc, diag::requires_experimental_feature, "@lifetime", false,
2722+
getFeatureName(Feature::NonescapableTypes));
27232723
status.setIsParseError();
27242724
return status;
27252725
}

lib/SIL/IR/SILModule.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -920,7 +920,7 @@ void SILModule::performOnceForPrespecializedImportedExtensions(
920920
SmallVector<ModuleDecl *, 8> importedModules;
921921
// Add the Swift module.
922922
if (!isStdlibModule()) {
923-
auto *SwiftStdlib = getASTContext().getStdlibModule(true);
923+
auto *SwiftStdlib = getASTContext().getStdlibModule();
924924
if (SwiftStdlib)
925925
importedModules.push_back(SwiftStdlib);
926926
}

lib/Sema/TypeCheckAttr.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,7 @@ class AttributeChecker : public AttributeVisitor<AttributeChecker> {
363363

364364
void visitUnsafeInheritExecutorAttr(UnsafeInheritExecutorAttr *attr);
365365

366-
bool visitLifetimeAttr(DeclAttribute *attr);
366+
bool visitOwnershipAttr(DeclAttribute *attr);
367367
void visitEagerMoveAttr(EagerMoveAttr *attr);
368368
void visitNoEagerMoveAttr(NoEagerMoveAttr *attr);
369369

@@ -403,7 +403,7 @@ void AttributeChecker::visitNoImplicitCopyAttr(NoImplicitCopyAttr *attr) {
403403
}
404404

405405
if (auto *funcDecl = dyn_cast<FuncDecl>(D)) {
406-
if (visitLifetimeAttr(attr))
406+
if (visitOwnershipAttr(attr))
407407
return;
408408

409409
// We only handle non-lvalue arguments today.
@@ -7480,7 +7480,7 @@ void AttributeChecker::visitUnsafeInheritExecutorAttr(
74807480
}
74817481
}
74827482

7483-
bool AttributeChecker::visitLifetimeAttr(DeclAttribute *attr) {
7483+
bool AttributeChecker::visitOwnershipAttr(DeclAttribute *attr) {
74847484
if (auto *funcDecl = dyn_cast<FuncDecl>(D)) {
74857485
auto declContext = funcDecl->getDeclContext();
74867486
// eagerMove attribute may only appear in type context
@@ -7493,7 +7493,7 @@ bool AttributeChecker::visitLifetimeAttr(DeclAttribute *attr) {
74937493
}
74947494

74957495
void AttributeChecker::visitEagerMoveAttr(EagerMoveAttr *attr) {
7496-
if (visitLifetimeAttr(attr))
7496+
if (visitOwnershipAttr(attr))
74977497
return;
74987498
if (auto *nominal = dyn_cast<NominalTypeDecl>(D)) {
74997499
if (nominal->getSelfTypeInContext()->isNoncopyable()) {
@@ -7517,7 +7517,7 @@ void AttributeChecker::visitEagerMoveAttr(EagerMoveAttr *attr) {
75177517
}
75187518

75197519
void AttributeChecker::visitNoEagerMoveAttr(NoEagerMoveAttr *attr) {
7520-
if (visitLifetimeAttr(attr))
7520+
if (visitOwnershipAttr(attr))
75217521
return;
75227522
// @_noEagerMove and @_eagerMove are opposites and can't be combined.
75237523
if (D->getAttrs().hasAttribute<EagerMoveAttr>()) {

test/IRGen/builtins.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
2-
// RUN: %target-swift-frontend -module-name builtins -parse-stdlib -Xllvm -sil-disable-pass=target-constant-folding -disable-access-control -primary-file %s -emit-ir -o - -disable-objc-attr-requires-foundation-module | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-runtime
1+
// RUN: %target-swift-frontend -enable-builtin-module -module-name builtins -Xllvm -sil-disable-pass=target-constant-folding -disable-access-control -primary-file %s -emit-ir -o - -disable-objc-attr-requires-foundation-module | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-runtime
32

43
// REQUIRES: CPU=x86_64 || CPU=arm64 || CPU=arm64e
54

6-
import Swift
5+
import Builtin
76

87
typealias Int = Builtin.Int32
98
typealias Bool = Builtin.Int1

test/IRGen/polymorphic_builtins.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
// This line tests that IRGen is properly turning the unspecialized builtins
22
// into traps.
33
//
4-
// RUN: %target-swift-frontend -emit-ir -parse-as-library -parse-stdlib -Xllvm -sil-disable-pass=Simplification %s | %FileCheck %s
4+
// RUN: %target-swift-frontend -enable-builtin-module -emit-ir -parse-as-library -Xllvm -sil-disable-pass=Simplification %s | %FileCheck %s
55

66
// Make sure we are not eliminating these builtins before IRGen runs. As part of
77
// the builtin's contract, we expect IRGen to convert them to traps, not
88
// anything before.
99
//
10-
// RUN: %target-swift-frontend -emit-sil -parse-as-library -parse-stdlib -Xllvm -sil-disable-pass=Simplification %s | %FileCheck --check-prefix=SIL %s
10+
// RUN: %target-swift-frontend -enable-builtin-module -emit-sil -parse-as-library -Xllvm -sil-disable-pass=Simplification %s | %FileCheck --check-prefix=SIL %s
1111

12-
import Swift
12+
import Builtin
1313

1414
// SIL-LABEL: sil [transparent] @$s20polymorphic_builtins11_isConcrete4typeSbxm_tlF : $@convention(thin) <T> (@thick T.Type) -> Bool {
1515
// SIL: builtin "isConcrete"<T>({{%[0-9]*}} : $@thick T.Type) : $Builtin.Int1

test/Inputs/polymorphic_builtins.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
2-
import Swift
1+
import Builtin
32

43
// =============================================================================
54

test/Interpreter/polymorphic_builtins.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,27 @@
77

88
// RUN: %empty-directory(%t)
99

10-
// RUN: %target-build-swift-dylib(%t/%target-library-name(mysimd)) -enable-library-evolution %S/../Inputs/polymorphic_builtins.swift -emit-module -emit-module-path %t/mysimd.swiftmodule -module-name mysimd -parse-stdlib -D DEBUG -Onone
10+
// RUN: %target-build-swift-dylib(%t/%target-library-name(mysimd)) -enable-builtin-module -enable-library-evolution %S/../Inputs/polymorphic_builtins.swift -emit-module -emit-module-path %t/mysimd.swiftmodule -module-name mysimd -D DEBUG -Onone
1111
// RUN: %target-codesign %t/%target-library-name(mysimd)
1212

13-
// RUN: %target-build-swift %s -L %t -I %t -lmysimd -parse-stdlib -Xfrontend -disable-access-control -Xfrontend -sil-verify-all %target-rpath(%t) -o %t/a.out -D DEBUG -Onone
13+
// RUN: %target-build-swift -enable-builtin-module %s -L %t -I %t -lmysimd -Xfrontend -disable-access-control -Xfrontend -sil-verify-all %target-rpath(%t) -o %t/a.out -D DEBUG -Onone
1414
// RUN: %target-codesign %t/a.out
1515

1616
// RUN: %target-run %t/a.out %t/%target-library-name(mysimd)
1717

1818
// RUN: %empty-directory(%t)
1919

20-
// RUN: %target-build-swift-dylib(%t/%target-library-name(mysimd)) -enable-library-evolution %S/../Inputs/polymorphic_builtins.swift -emit-module -emit-module-path %t/mysimd.swiftmodule -module-name mysimd -parse-stdlib -O
20+
// RUN: %target-build-swift-dylib(%t/%target-library-name(mysimd)) -enable-builtin-module -enable-library-evolution %S/../Inputs/polymorphic_builtins.swift -emit-module -emit-module-path %t/mysimd.swiftmodule -module-name mysimd -O
2121
// RUN: %target-codesign %t/%target-library-name(mysimd)
2222

23-
// RUN: %target-build-swift %s -L %t -I %t -lmysimd -parse-stdlib -Xfrontend -disable-access-control -Xfrontend -sil-verify-all %target-rpath(%t) -o %t/a.out -O
23+
// RUN: %target-build-swift -enable-builtin-module %s -L %t -I %t -lmysimd -Xfrontend -disable-access-control -Xfrontend -sil-verify-all %target-rpath(%t) -o %t/a.out -O
2424
// RUN: %target-codesign %t/a.out
2525

2626
// RUN: %target-run %t/a.out %t/%target-library-name(mysimd)
2727

2828
// REQUIRES: executable_test
2929

30-
import Swift
30+
import Builtin
3131
import StdlibUnittest
3232
import mysimd
3333

test/ModuleInterface/ModuleCache/Inputs/mock-sdk/ExportedLib.swiftinterface

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// swift-interface-format-version: 1.0
2-
// swift-module-flags: -parse-stdlib -module-name ExportedLib
2+
// swift-module-flags: -module-name ExportedLib
33

44
@_exported import SomeCModule
55

test/ModuleInterface/ModuleCache/Inputs/mock-sdk/SdkLib.swiftinterface

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// swift-interface-format-version: 1.0
2-
// swift-module-flags: -parse-stdlib -module-name SdkLib
2+
// swift-module-flags: -module-name SdkLib
33

44
@_exported import ExportedLib
55

test/ModuleInterface/ModuleCache/module-cache-options.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
// RUN: %empty-directory(%t)
33
// RUN: split-file %s %t
44

5-
// RUN: %target-swift-frontend -disable-implicit-concurrency-module-import -disable-implicit-string-processing-module-import -parse-stdlib -I %t -emit-module-interface-path %t/LeafModule.swiftinterface -module-name LeafModule %t/leaf.swift -emit-module -o /dev/null
6-
// RUN: %target-swift-frontend -disable-implicit-concurrency-module-import -disable-implicit-string-processing-module-import -parse-stdlib -I %t -module-cache-path %t/swiftcache -emit-module-interface-path %t/OtherModule.swiftinterface -module-name OtherModule %t/other.swift -emit-module -o /dev/null
7-
// RUN: %target-swift-frontend -disable-implicit-concurrency-module-import -disable-implicit-string-processing-module-import -parse-stdlib -I %t -module-cache-path %t/swiftcache -Xcc -fmodules-cache-path=%t/clangcache -emit-module -o %t/TestModule.swiftmodule -module-name TestModule %t/main.swift
5+
// RUN: %target-swift-frontend -disable-implicit-concurrency-module-import -disable-implicit-string-processing-module-import -I %t -emit-module-interface-path %t/LeafModule.swiftinterface -module-name LeafModule %t/leaf.swift -emit-module -o /dev/null
6+
// RUN: %target-swift-frontend -disable-implicit-concurrency-module-import -disable-implicit-string-processing-module-import -I %t -module-cache-path %t/swiftcache -emit-module-interface-path %t/OtherModule.swiftinterface -module-name OtherModule %t/other.swift -emit-module -o /dev/null
7+
// RUN: %target-swift-frontend -disable-implicit-concurrency-module-import -disable-implicit-string-processing-module-import -I %t -module-cache-path %t/swiftcache -Xcc -fmodules-cache-path=%t/clangcache -emit-module -o %t/TestModule.swiftmodule -module-name TestModule %t/main.swift
88

99
// RUN: NUM_SWIFT_MODULES=$(find %t/swiftcache -type f -name '*.swiftmodule' | wc -l)
1010
// RUN: NUM_CLANG_MODULES=$(find %t/clangcache -type f -name '*.pcm' | wc -l)

test/SILGen/builtins.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
// RUN: %target-swift-emit-silgen -parse-stdlib %s -disable-access-control -disable-objc-attr-requires-foundation-module -enable-objc-interop | %FileCheck %s
2-
// RUN: %target-swift-emit-sil -Onone -parse-stdlib %s -disable-access-control -disable-objc-attr-requires-foundation-module -enable-objc-interop | %FileCheck -check-prefix=CANONICAL %s
1+
// RUN: %target-swift-emit-silgen -enable-builtin-module %s -disable-access-control -disable-objc-attr-requires-foundation-module -enable-objc-interop | %FileCheck %s
2+
// RUN: %target-swift-emit-sil -enable-builtin-module -Onone %s -disable-access-control -disable-objc-attr-requires-foundation-module -enable-objc-interop | %FileCheck -check-prefix=CANONICAL %s
33

44
// REQUIRES: swift_in_compiler
55

6-
import Swift
6+
import Builtin
77

88
protocol ClassProto : class { }
99

test/SILGen/polymorphic_builtins.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
// RUN: %target-swift-frontend -parse-stdlib -emit-silgen %s | %FileCheck %s
1+
// RUN: %target-swift-frontend -enable-builtin-module -emit-silgen %s | %FileCheck %s
2+
3+
import Builtin
24

35
// CHECK-LABEL: sil hidden [ossa] @$s20polymorphic_builtins{{.*}}concreteAddTest{{.*}} : $@convention(thin) (Builtin.Vec4xInt32, Builtin.Vec4xInt32) -> Builtin.Vec4xInt32 {
46
// CHECK: bb0([[ARG0:%.*]] : $Builtin.Vec4xInt32, [[ARG1:%.*]] : $Builtin.Vec4xInt32):

test/SILOptimizer/capture_promotion_generic_context.sil

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
sil_stage raw
44

55
import Builtin
6+
import Swift
67

78
typealias Int = Builtin.Int32
89

test/SILOptimizer/capture_promotion_generic_context_ownership.sil

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
sil_stage raw
44

55
import Builtin
6+
import Swift
67

78
typealias Int = Builtin.Int32
89

test/SILOptimizer/constant_propagation_stdlib.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
// RUN: %target-swift-frontend -module-name constant_propagation_stdlib %s -parse-stdlib -emit-sil -o - | %FileCheck --check-prefix=CHECK-ONONE %s
2-
// RUN: %target-swift-frontend -module-name constant_propagation_stdlib %s -parse-stdlib -emit-sil -o - -O | %FileCheck --check-prefix=CHECK-O %s
1+
// RUN: %target-swift-frontend -module-name constant_propagation_stdlib %s -emit-sil -enable-builtin-module -o - | %FileCheck --check-prefix=CHECK-ONONE %s
2+
// RUN: %target-swift-frontend -module-name constant_propagation_stdlib %s -emit-sil -enable-builtin-module -o - -O | %FileCheck --check-prefix=CHECK-O %s
33

44
// REQUIRES: swift_in_compiler
55

6+
import Builtin
7+
68
public struct MyInt {
79
var v: Builtin.Int32
810
}

test/SILOptimizer/polymorphic_builtins_diagnostics.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
// RUN: %target-swift-frontend -parse-stdlib -emit-sil -verify %s
1+
// RUN: %target-swift-frontend -emit-sil -enable-builtin-module -verify %s
22

3-
import Swift
3+
import Builtin
44

55
struct MyInt {
66
var i: Builtin.Int64
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// RUN: %target-typecheck-verify-swift -disable-availability-checking
2+
// REQUIRES: asserts
3+
4+
struct NE : ~Escapable { // expected-error{{type 'Escapable' requires -enable-experimental-feature NonescapableTypes}}
5+
6+
}
7+
8+
@lifetime(ne) // expected-error{{'@lifetime' attribute is only valid when experimental feature NonescapableTypes is enabled}} expected-error{{expected declaration}}
9+
func derive(_ ne: NE) -> NE {
10+
ne
11+
}

validation-test/compiler_crashers_fixed/28435-swift-genericenvironment-maptypeintocontext.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
77

88
// RUN: not %target-swift-frontend %s -typecheck
9+
// REQUIRES: rdar136703549
10+
911
enum ST:d
1012
protocol a{typealias d:A.B{
1113
{

0 commit comments

Comments
 (0)