Skip to content

Commit 8a78496

Browse files
authored
Merge pull request #77769 from swiftlang/gaborh/nonescapable-enabled
[cxx-interop] Use the new lifetime dependence language feature flag
2 parents c50dcae + 51e92d9 commit 8a78496

File tree

3 files changed

+33
-4
lines changed

3 files changed

+33
-4
lines changed

lib/ClangImporter/ImportDecl.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2184,8 +2184,7 @@ namespace {
21842184
MoveOnlyAttr(/*Implicit=*/true));
21852185
}
21862186

2187-
if (Impl.SwiftContext.LangOpts.hasFeature(Feature::NonescapableTypes) &&
2188-
evaluateOrDefault(
2187+
if (evaluateOrDefault(
21892188
Impl.SwiftContext.evaluator,
21902189
ClangTypeEscapability({decl->getTypeForDecl(), Impl}),
21912190
CxxEscapability::Unknown) == CxxEscapability::NonEscapable) {
@@ -3868,6 +3867,10 @@ namespace {
38683867
if (decl->getTemplatedKind() == clang::FunctionDecl::TK_FunctionTemplate)
38693868
return;
38703869

3870+
if (!result->getASTContext().LangOpts.hasFeature(
3871+
Feature::LifetimeDependence))
3872+
return;
3873+
38713874
SmallVector<LifetimeDependenceInfo, 1> lifetimeDependencies;
38723875
LifetimeDependenceInfo immortalLifetime(nullptr, nullptr, 0,
38733876
/*isImmortal*/ true);

test/Interop/Cxx/class/nonescapable-errors.swift

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// RUN: rm -rf %t
22
// RUN: split-file %s %t
33
// RUN: not %target-swift-frontend -typecheck -I %swift_src_root/lib/ClangImporter/SwiftBridging -I %t/Inputs %t/test.swift -enable-experimental-feature LifetimeDependence -cxx-interoperability-mode=default -diagnostic-style llvm 2>&1 | %FileCheck %s
4+
// RUN: not %target-swift-frontend -typecheck -I %swift_src_root/lib/ClangImporter/SwiftBridging -I %t/Inputs %t/test.swift -cxx-interoperability-mode=default -diagnostic-style llvm 2>&1 | %FileCheck %s -check-prefix=CHECK-NO-LIFETIMES
45

56
// REQUIRES: swift_feature_LifetimeDependence
67

@@ -77,10 +78,10 @@ Outer<Owner>::NonTemplated::Inner<View> j2();
7778
Outer<Owner>::NonTemplated::Inner<Owner> j3();
7879

7980
//--- test.swift
80-
8181
import Test
8282

8383
// CHECK: error: cannot infer lifetime dependence, no parameters found that are either ~Escapable or Escapable with a borrowing ownership
84+
// CHECK-NO-LIFETIMES: test.swift:5:32: error: returning ~Escapable type requires '-enable-experimental-feature LifetimeDependence'
8485
public func noAnnotations() -> View {
8586
// CHECK: nonescapable.h:15:7: warning: the returned type 'Owner' is annotated as escapable; it cannot have lifetime dependencies
8687
f(nil)
@@ -90,22 +91,33 @@ public func noAnnotations() -> View {
9091
f2(nil, nil)
9192
// CHECK: nonescapable.h:23:6: warning: the returned type 'View' is annotated as non-escapable; its lifetime dependencies must be annotated
9293
// CHECK: nonescapable.h:23:6: error: cannot infer lifetime dependence, no parameters found that are either ~Escapable or Escapable with a borrowing ownership
94+
// CHECK-NO-LIFETIMES: nonescapable.h:23:6: error: returning ~Escapable type requires '-enable-experimental-feature LifetimeDependence'
9395
g(nil)
9496
h1(nil)
9597
// CHECK: nonescapable.h:33:21: error: cannot infer lifetime dependence, no parameters found that are either ~Escapable or Escapable with a borrowing ownership
98+
// CHECK-NO-LIFETIMES: nonescapable.h:33:21: error: returning ~Escapable type requires '-enable-experimental-feature LifetimeDependence'
9699
h2(nil)
97100
// CHECK: nonescapable.h:34:21: error: cannot infer lifetime dependence, no parameters found that are either ~Escapable or Escapable with a borrowing ownership
101+
// CHECK-NO-LIFETIMES: nonescapable.h:34:21: error: returning ~Escapable type requires '-enable-experimental-feature LifetimeDependence'
98102
h3(nil)
99103
i1()
100104
// CHECK: nonescapable.h:38:39: error: template parameter 'Missing' does not exist
105+
// CHECK-NO-LIFETIMES: nonescapable.h:38:39: error: template parameter 'Missing' does not exist
101106
i2()
102107
// CHECK: nonescapable.h:44:33: error: template parameter 'S' expected to be a type parameter
108+
// CHECK-NO-LIFETIMES: nonescapable.h:44:33: error: template parameter 'S' expected to be a type parameter
103109
j1()
104110
// CHECK: nonescapable.h:62:41: error: cannot infer lifetime dependence, no parameters found that are either ~Escapable or Escapable with a borrowing ownership
111+
// CHECK-NO-LIFETIMES: nonescapable.h:62:41: error: returning ~Escapable type requires '-enable-experimental-feature LifetimeDependence'
105112
j2()
106113
// CHECK: nonescapable.h:63:41: error: cannot infer lifetime dependence, no parameters found that are either ~Escapable or Escapable with a borrowing ownership
114+
// CHECK-NO-LIFETIMES: nonescapable.h:63:41: error: returning ~Escapable type requires '-enable-experimental-feature LifetimeDependence'
107115
j3()
108116
// CHECK-NOT: error
109117
// CHECK-NOT: warning
110118
return View()
119+
// CHECK-NO-LIFETIMES: nonescapable.h:4:5: error: returning ~Escapable type requires '-enable-experimental-feature LifetimeDependence'
120+
// CHECK-NO-LIFETIMES: nonescapable.h:5:5: error: returning ~Escapable type requires '-enable-experimental-feature LifetimeDependence'
121+
// CHECK-NO-LIFETIMES-NOT: error
122+
// CHECK-NO-LIFETIMES-NOT: warning
111123
}

test/Interop/Cxx/class/nonescapable-lifetimebound.swift

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// RUN: rm -rf %t
22
// RUN: split-file %s %t
3-
// RUN: %target-swift-frontend -I %swift_src_root/lib/ClangImporter/SwiftBridging -I %t/Inputs -emit-sil %t/test.swift -cxx-interoperability-mode=default -diagnostic-style llvm 2>&1 | %FileCheck %s
3+
// RUN: %target-swift-frontend -I %swift_src_root/lib/ClangImporter/SwiftBridging -I %t/Inputs -emit-sil %t/test.swift -enable-experimental-feature LifetimeDependence -cxx-interoperability-mode=default -diagnostic-style llvm 2>&1 | %FileCheck %s
4+
// RUN: not %target-swift-frontend -I %swift_src_root/lib/ClangImporter/SwiftBridging -I %t/Inputs -emit-sil %t/test.swift -cxx-interoperability-mode=default -diagnostic-style llvm 2>&1 | %FileCheck %s -check-prefix=CHECK-NO-LIFETIMES
45

56

67
//--- Inputs/module.modulemap
@@ -92,6 +93,19 @@ View returnsImmortal() SWIFT_RETURNS_INDEPENDENT_VALUE {
9293
// CHECK: sil [clang OtherView.init] {{.*}} : $@convention(c) (@guaranteed View) -> @lifetime(copy 0) @out OtherView
9394
// CHECK: sil [clang returnsImmortal] {{.*}} : $@convention(c) () -> @lifetime(immortal) @autoreleased View
9495

96+
// CHECK-NO-LIFETIMES: nonescapable.h:36:6: error: returning ~Escapable type requires '-enable-experimental-feature LifetimeDependence'
97+
// CHECK-NO-LIFETIMES: nonescapable.h:40:6: error: returning ~Escapable type requires '-enable-experimental-feature LifetimeDependence'
98+
// CHECK-NO-LIFETIMES: nonescapable.h:46:6: error: returning ~Escapable type requires '-enable-experimental-feature LifetimeDependence'
99+
// CHECK-NO-LIFETIMES: nonescapable.h:53:6: error: returning ~Escapable type requires '-enable-experimental-feature LifetimeDependence'
100+
// CHECK-NO-LIFETIMES: nonescapable.h:23:10: error: returning ~Escapable type requires '-enable-experimental-feature LifetimeDependence'
101+
// CHECK-NO-LIFETIMES: nonescapable.h:27:10: error: returning ~Escapable type requires '-enable-experimental-feature LifetimeDependence'
102+
// CHECK-NO-LIFETIMES: nonescapable.h:4:5: error: returning ~Escapable type requires '-enable-experimental-feature LifetimeDependence'
103+
// CHECK-NO-LIFETIMES: nonescapable.h:5:5: error: returning ~Escapable type requires '-enable-experimental-feature LifetimeDependence'
104+
// CHECK-NO-LIFETIMES: nonescapable.h:13:5: error: returning ~Escapable type requires '-enable-experimental-feature LifetimeDependence'
105+
// CHECK-NO-LIFETIMES: nonescapable.h:14:5: error: returning ~Escapable type requires '-enable-experimental-feature LifetimeDependence'
106+
// CHECK-NO-LIFETIMES: nonescapable.h:68:6: error: returning ~Escapable type requires '-enable-experimental-feature LifetimeDependence'
107+
// CHECK-NO-LIFETIMES-NOT: error
108+
95109
//--- test.swift
96110

97111
import Test

0 commit comments

Comments
 (0)