Skip to content

Commit 82f8d5d

Browse files
committed
[cxx-interop] add additional tests for calling base methods on FRT
1 parent ba5b1ba commit 82f8d5d

File tree

4 files changed

+101
-0
lines changed

4 files changed

+101
-0
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#pragma once
2+
3+
#define FRT \
4+
__attribute__((swift_attr("import_reference"))) \
5+
__attribute__((swift_attr("retain:immortal"))) \
6+
__attribute__((swift_attr("release:immortal")))
7+
8+
int &getCopyCounter() {
9+
static int copyCounter = 0;
10+
return copyCounter;
11+
}
12+
13+
class CopyTrackedBaseClass {
14+
public:
15+
CopyTrackedBaseClass(int x) : x(x) {}
16+
CopyTrackedBaseClass(const CopyTrackedBaseClass &other) : x(other.x) {
17+
++getCopyCounter();
18+
}
19+
20+
int getX() const {
21+
return x;
22+
}
23+
private:
24+
int x;
25+
} FRT;
26+
27+
class CopyTrackedDerivedClass: public CopyTrackedBaseClass {
28+
public:
29+
CopyTrackedDerivedClass(int x) : CopyTrackedBaseClass(x) {}
30+
31+
int getDerivedX() const {
32+
return getX();
33+
}
34+
} FRT;
35+
36+
CopyTrackedDerivedClass *makeCopyTrackedDerivedClass(int x) {
37+
return new CopyTrackedDerivedClass(x);
38+
}
39+
40+
class NonEmptyBase {
41+
public:
42+
int getY() const {
43+
return y;
44+
}
45+
private:
46+
int y = 11;
47+
} FRT;
48+
49+
class CopyTrackedDerivedDerivedClass: public NonEmptyBase, public CopyTrackedDerivedClass {
50+
public:
51+
CopyTrackedDerivedDerivedClass(int x) : CopyTrackedDerivedClass(x) {}
52+
} FRT;
53+
54+
CopyTrackedDerivedDerivedClass *makeCopyTrackedDerivedDerivedClass(int x) {
55+
return new CopyTrackedDerivedDerivedClass(x);
56+
}

test/Interop/Cxx/foreign-reference/Inputs/module.modulemap

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,8 @@ module MemberLayout {
3232
header "member-layout.h"
3333
requires cplusplus
3434
}
35+
36+
module FunctionInheritance {
37+
header "function-inheritance.h"
38+
requires cplusplus
39+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// RUN: %target-swift-emit-irgen -I %S/Inputs -enable-experimental-cxx-interop %s -validate-tbd-against-ir=none -Xcc -fignore-exceptions | %FileCheck %s
2+
3+
import FunctionInheritance
4+
5+
func testGetX() -> CInt {
6+
let derivedDerived = makeCopyTrackedDerivedDerivedClass(42)!
7+
return derivedDerived.getX()
8+
}
9+
10+
let _ = testGetX()
11+
12+
13+
// CHECK: define {{.*}}linkonce_odr{{.*}} i32 @{{.*}}__synthesizedBaseCall___synthesizedBaseCall_{{.*}}(ptr {{.*}} %[[THIS_PTR:.*]])
14+
// CHECK: %[[ADD_PTR:.*]] = getelementptr inbounds i8, ptr %{{.*}}, i64 4
15+
// CHECK: call noundef i32 @{{.*}}(ptr {{.*}} %[[ADD_PTR]])
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// RUN: %target-run-simple-swift(-I %S/Inputs/ -Xfrontend -enable-experimental-cxx-interop)
2+
//
3+
// REQUIRES: executable_test
4+
5+
import StdlibUnittest
6+
import FunctionInheritance
7+
8+
var FunctionsTestSuite = TestSuite("Calling functions in base foreign reference classes")
9+
10+
FunctionsTestSuite.test("base member FRT calls do not require copying") {
11+
let derived = makeCopyTrackedDerivedClass(42)!
12+
var copyCounter = getCopyCounter().pointee
13+
expectEqual(derived.getX(), 42)
14+
expectEqual(copyCounter, getCopyCounter().pointee)
15+
expectEqual(derived.getDerivedX(), 42)
16+
expectEqual(copyCounter, getCopyCounter().pointee)
17+
18+
let derivedDerived = makeCopyTrackedDerivedDerivedClass(-5)!
19+
copyCounter = getCopyCounter().pointee
20+
expectEqual(derivedDerived.getX(), -5)
21+
expectEqual(derivedDerived.getY(), 11)
22+
expectEqual(copyCounter, getCopyCounter().pointee)
23+
}
24+
25+
runAllTests()

0 commit comments

Comments
 (0)