Skip to content

Commit 8783ff9

Browse files
authored
Merge pull request #81096 from swiftlang/gaborh/frt-const-ptr-crash-on-6.2
2 parents d3cead6 + c3a7203 commit 8783ff9

File tree

9 files changed

+48
-33
lines changed

9 files changed

+48
-33
lines changed

lib/SIL/IR/SILFunctionType.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1520,10 +1520,8 @@ static bool isClangTypeMoreIndirectThanSubstType(TypeConverter &TC,
15201520
return false;
15211521

15221522
if (clangTy->getPointeeType()->getAs<clang::RecordType>()) {
1523-
// CF type as foreign class
1524-
if (substTy->getClassOrBoundGenericClass() &&
1525-
substTy->getClassOrBoundGenericClass()->getForeignClassKind() ==
1526-
ClassDecl::ForeignKind::CFType) {
1523+
// Foreign reference types
1524+
if (substTy->getClassOrBoundGenericClass()) {
15271525
return false;
15281526
}
15291527
}

test/Interop/Cxx/class/Inputs/closure.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,34 @@ void cfuncARCWeak(ARCWeak) noexcept;
4545
void (* _Nonnull getFnPtr() noexcept)(NonTrivial) noexcept;
4646
void (* _Nonnull getFnPtr2() noexcept)(ARCWeak) noexcept;
4747

48+
class SharedRef {
49+
public:
50+
static SharedRef *_Nonnull makeSharedRef() { return new SharedRef(); }
51+
int _refCount = 1;
52+
53+
private:
54+
SharedRef() = default;
55+
56+
SharedRef(const SharedRef &other) = delete;
57+
SharedRef &operator=(const SharedRef &other) = delete;
58+
SharedRef(SharedRef &&other) = delete;
59+
SharedRef &operator=(SharedRef &&other) = delete;
60+
} __attribute__((swift_attr("import_reference")))
61+
__attribute__((swift_attr("retain:retainSharedRef")))
62+
__attribute__((swift_attr("release:releaseSharedRef")));
63+
64+
inline void
65+
cppGo(void (*_Nonnull takeConstSharedRef)(const SharedRef *_Nonnull x)) {
66+
SharedRef *ref = SharedRef::makeSharedRef();
67+
takeConstSharedRef(ref);
68+
}
69+
70+
inline void retainSharedRef(SharedRef *_Nonnull x) { x->_refCount += 1; }
71+
inline void releaseSharedRef(SharedRef *_Nonnull x) {
72+
x->_refCount -= 1;
73+
if (x->_refCount == 0) {
74+
delete x;
75+
}
76+
}
77+
4878
#endif // __CLOSURE__

test/Interop/Cxx/class/closure-thunk-executable.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,8 @@ ClosureTestSuite.test("ConvertToFunctionPointer") {
1111
cfunc2({N in})
1212
}
1313

14+
ClosureTestSuite.test("Pass FRT to function pointer") {
15+
cppGo({N in })
16+
}
17+
1418
runAllTests()

test/Interop/Cxx/foreign-reference/move-only-irgen.swift

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,11 @@ import MoveOnly
66
// CHECK-LABEL: define {{.*}}swiftcc void @"$s4main4testyyF"
77

88
// CHECK: [[X:%.*]] = alloca ptr
9-
// CHECK: [[TMP:%.*]] = alloca ptr
109

1110
// CHECK: [[CREATED:%.*]] = call ptr @{{_ZN8MoveOnly6createEv|"\?create\@MoveOnly\@\@SAPEAU1\@XZ"}}()
1211
// CHECK: store ptr [[CREATED]], ptr [[X]]
13-
// CHECK: store ptr [[CREATED]], ptr [[TMP]]
1412

15-
// CHECK: [[TMP_LOAD:%.*]] = load ptr, ptr [[TMP]]
16-
// CHECK: call i32 @{{_ZNK8MoveOnly4testEv|"\?test\@MoveOnly\@\@QEBAHXZ"}}(ptr [[TMP_LOAD]])
13+
// CHECK: call i32 @{{_ZNK8MoveOnly4testEv|"\?test\@MoveOnly\@\@QEBAHXZ"}}(ptr [[CREATED]])
1714

1815
// CHECK: ret void
1916

test/Interop/Cxx/foreign-reference/move-only-silgen.swift

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,8 @@ import MoveOnly
1515
// CHECK: [[ACCESS_1:%.*]] = begin_access [read] [unknown] [[BOX]] : $*MoveOnly
1616
// CHECK: [[X_1:%.*]] = load [trivial] [[ACCESS_1]] : $*MoveOnly
1717

18-
// CHECK: [[TMP:%.*]] = alloc_stack $MoveOnly
19-
// CHECK: store [[X_1]] to [trivial] [[TMP]]
20-
21-
// CHECK: [[TEST_FN:%.*]] = function_ref @{{_ZNK8MoveOnly4testEv|\?test\@MoveOnly\@\@QEBAHXZ}} : $@convention(cxx_method) (@in_guaranteed MoveOnly) -> Int32
22-
// CHECK: apply [[TEST_FN]]([[TMP]]) : $@convention(cxx_method) (@in_guaranteed MoveOnly) -> Int32
18+
// CHECK: [[TEST_FN:%.*]] = function_ref @{{_ZNK8MoveOnly4testEv|\?test\@MoveOnly\@\@QEBAHXZ}} : $@convention(cxx_method) (MoveOnly) -> Int32
19+
// CHECK: apply [[TEST_FN]]([[X_1]]) : $@convention(cxx_method) (MoveOnly) -> Int32
2320

2421
// CHECK: return
2522
// CHECK-LABEL: end sil function '$s4main4testyyF'
@@ -30,4 +27,4 @@ public func test() {
3027

3128
// CHECK-LABEL: sil{{ \[available .*\] | }}[clang MoveOnly.create] @{{_ZN8MoveOnly6createEv|\?create\@MoveOnly\@\@SAPEAU1\@XZ}} : $@convention(c) () -> MoveOnly
3229

33-
// CHECK-LABEL: sil{{ \[available .*\] | }}[clang MoveOnly.test] @{{_ZNK8MoveOnly4testEv|\?test\@MoveOnly\@\@QEBAHXZ}} : $@convention(cxx_method) (@in_guaranteed MoveOnly) -> Int32
30+
// CHECK-LABEL: sil{{ \[available .*\] | }}[clang MoveOnly.test] @{{_ZNK8MoveOnly4testEv|\?test\@MoveOnly\@\@QEBAHXZ}} : $@convention(cxx_method) (MoveOnly) -> Int32

test/Interop/Cxx/foreign-reference/pod-irgen.swift

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import POD
99
// CHECK-LABEL: define {{.*}}swiftcc void @"$s4main4testyyF"
1010

1111
// CHECK: [[X:%.*]] = alloca ptr
12-
// CHECK: [[TMP:%.*]] = alloca ptr
1312

1413
// CHECK: [[CREATED:%.*]] = call ptr @{{_ZN7IntPair6createEv|"\?create\@IntPair\@\@SAPEAU1\@XZ"}}()
1514
// CHECK: store ptr [[CREATED]], ptr [[X]]
@@ -18,9 +17,7 @@ import POD
1817
// CHECK: [[INT_VALUE:%.*]] = getelementptr inbounds %Ts5Int32V, ptr [[B_FIELD]], i32 0, i32 0
1918
// CHECK: store i32 42, ptr [[INT_VALUE]], align 4
2019

21-
// CHECK: store ptr [[CREATED]], ptr [[TMP]]
22-
// CHECK: [[TMP_LOAD:%.*]] = load ptr, ptr [[TMP]]
23-
// CHECK: call i32 @{{_ZNK7IntPair4testEv|"\?test\@IntPair\@\@QEBAHXZ"}}(ptr [[TMP_LOAD]])
20+
// CHECK: call i32 @{{_ZNK7IntPair4testEv|"\?test\@IntPair\@\@QEBAHXZ"}}(ptr [[CREATED]])
2421

2522
// CHECK: ret void
2623

test/Interop/Cxx/foreign-reference/pod-silgen.swift

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,8 @@ import POD
2121

2222
// CHECK: [[ACCESS_3:%.*]] = begin_access [read] [unknown] [[BOX]] : $*IntPair
2323
// CHECK: [[X_2:%.*]] = load [trivial] [[ACCESS_3]] : $*IntPair
24-
// CHECK: [[TMP:%.*]] = alloc_stack $IntPair
25-
// CHECK: store [[X_2]] to [trivial] [[TMP]]
26-
// CHECK: [[TEST_FN:%.*]] = function_ref @{{_ZNK7IntPair4testEv|\?test\@IntPair\@\@QEBAHXZ}} : $@convention(cxx_method) (@in_guaranteed IntPair) -> Int32
27-
// CHECK: apply [[TEST_FN]]([[TMP]]) : $@convention(cxx_method) (@in_guaranteed IntPair) -> Int32
24+
// CHECK: [[TEST_FN:%.*]] = function_ref @{{_ZNK7IntPair4testEv|\?test\@IntPair\@\@QEBAHXZ}} : $@convention(cxx_method) (IntPair) -> Int32
25+
// CHECK: apply [[TEST_FN]]([[X_2]]) : $@convention(cxx_method) (IntPair) -> Int32
2826

2927
// CHECK: return
3028
// CHECK-LABEL: end sil function '$s4main4testyyF'
@@ -36,4 +34,4 @@ public func test() {
3634

3735
// CHECK-LABEL: sil{{ \[available .*\] | }}[clang IntPair.create] @{{_ZN7IntPair6createEv|\?create\@IntPair\@\@SAPEAU1\@XZ}} : $@convention(c) () -> IntPair
3836

39-
// CHECK-LABEL: sil{{ \[available .*\] | }}[clang IntPair.test] @{{_ZNK7IntPair4testEv|\?test\@IntPair\@\@QEBAHXZ}} : $@convention(cxx_method) (@in_guaranteed IntPair) -> Int32
37+
// CHECK-LABEL: sil{{ \[available .*\] | }}[clang IntPair.test] @{{_ZNK7IntPair4testEv|\?test\@IntPair\@\@QEBAHXZ}} : $@convention(cxx_method) (IntPair) -> Int32

test/Interop/Cxx/foreign-reference/singleton-irgen.swift

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,11 @@ import Singleton
77
// CHECK-LABEL: define {{.*}}swiftcc void @"$s4main4testyyF"
88

99
// CHECK: [[X:%.*]] = alloca ptr
10-
// CHECK: [[TMP:%.*]] = alloca ptr
1110

1211
// CHECK: [[CREATED:%.*]] = call ptr @{{_ZN21DeletedSpecialMembers6createEv|"\?create\@DeletedSpecialMembers\@\@SAPEAU1\@XZ"}}()
1312
// CHECK: store ptr [[CREATED]], ptr [[X]]
14-
// CHECK: store ptr [[CREATED]], ptr [[TMP]]
1513

16-
// CHECK: [[TMP_LOAD:%.*]] = load ptr, ptr [[TMP]]
17-
// CHECK: call i32 @{{_ZNK21DeletedSpecialMembers4testEv|"\?test\@DeletedSpecialMembers\@\@QEBAHXZ"}}(ptr [[TMP_LOAD]])
14+
// CHECK: call i32 @{{_ZNK21DeletedSpecialMembers4testEv|"\?test\@DeletedSpecialMembers\@\@QEBAHXZ"}}(ptr [[CREATED]])
1815

1916
// CHECK: call void @{{_Z8mutateItR21DeletedSpecialMembers|"\?mutateIt\@\@YAXAEAUDeletedSpecialMembers\@\@\@Z"}}(ptr [[CREATED]])
2017

test/Interop/Cxx/foreign-reference/singleton-silgen.swift

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,8 @@ import Singleton
1515
// CHECK: [[ACCESS_1:%.*]] = begin_access [read] [unknown] [[BOX]] : $*DeletedSpecialMembers
1616
// CHECK: [[X_1:%.*]] = load [trivial] [[ACCESS_1]] : $*DeletedSpecialMembers
1717

18-
// CHECK: [[TMP:%.*]] = alloc_stack $DeletedSpecialMembers
19-
// CHECK: store [[X_1]] to [trivial] [[TMP]]
20-
21-
// CHECK: [[TEST_FN:%.*]] = function_ref @{{_ZNK21DeletedSpecialMembers4testEv|\?test\@DeletedSpecialMembers\@\@QEBAHXZ}} : $@convention(cxx_method) (@in_guaranteed DeletedSpecialMembers) -> Int32
22-
// CHECK: apply [[TEST_FN]]([[TMP]]) : $@convention(cxx_method) (@in_guaranteed DeletedSpecialMembers) -> Int32
18+
// CHECK: [[TEST_FN:%.*]] = function_ref @{{_ZNK21DeletedSpecialMembers4testEv|\?test\@DeletedSpecialMembers\@\@QEBAHXZ}} : $@convention(cxx_method) (DeletedSpecialMembers) -> Int32
19+
// CHECK: apply [[TEST_FN]]([[X_1]]) : $@convention(cxx_method) (DeletedSpecialMembers) -> Int32
2320
// CHECK: [[ACCESS_2:%.*]] = begin_access [read] [unknown] [[BOX]] : $*DeletedSpecialMembers
2421
// CHECK: [[X_2:%.*]] = load [trivial] [[ACCESS_2]] : $*DeletedSpecialMembers
2522

@@ -36,6 +33,6 @@ public func test() {
3633

3734
// CHECK-LABEL: sil{{ \[available .*\] | }}[clang DeletedSpecialMembers.create] @{{_ZN21DeletedSpecialMembers6createEv|\?create\@DeletedSpecialMembers\@\@SAPEAU1\@XZ}} : $@convention(c) () -> DeletedSpecialMembers
3835

39-
// CHECK-LABEL: sil{{ \[available .*\] | }}[clang DeletedSpecialMembers.test] @{{_ZNK21DeletedSpecialMembers4testEv|\?test\@DeletedSpecialMembers\@\@QEBAHXZ}} : $@convention(cxx_method) (@in_guaranteed DeletedSpecialMembers) -> Int32
36+
// CHECK-LABEL: sil{{ \[available .*\] | }}[clang DeletedSpecialMembers.test] @{{_ZNK21DeletedSpecialMembers4testEv|\?test\@DeletedSpecialMembers\@\@QEBAHXZ}} : $@convention(cxx_method) (DeletedSpecialMembers) -> Int32
4037

4138
// CHECK-LABEL: sil{{ \[available .*\] | }}[serialized] [clang mutateIt] @{{_Z8mutateItR21DeletedSpecialMembers|\?mutateIt\@\@YAXAEAUDeletedSpecialMembers\@\@\@Z}} : $@convention(c) (DeletedSpecialMembers) -> ()

0 commit comments

Comments
 (0)