11#pragma once
22
3- #define FRT \
3+ #define IMMORTAL_FRT \
44 __attribute__ ((swift_attr(" import_reference" ))) \
55 __attribute__((swift_attr(" retain:immortal" ))) \
66 __attribute__((swift_attr(" release:immortal" )))
@@ -28,7 +28,7 @@ class CopyTrackedBaseClass {
2828 }
2929private:
3030 int x;
31- } FRT ;
31+ } IMMORTAL_FRT ;
3232
3333class CopyTrackedDerivedClass : public CopyTrackedBaseClass {
3434public:
@@ -37,7 +37,7 @@ class CopyTrackedDerivedClass: public CopyTrackedBaseClass {
3737 int getDerivedX () const {
3838 return getX ();
3939 }
40- } FRT ;
40+ } IMMORTAL_FRT ;
4141
4242CopyTrackedDerivedClass *makeCopyTrackedDerivedClass (int x) {
4343 return new CopyTrackedDerivedClass (x);
@@ -50,12 +50,12 @@ class NonEmptyBase {
5050 }
5151private:
5252 int y = 11 ;
53- } FRT ;
53+ } IMMORTAL_FRT ;
5454
5555class CopyTrackedDerivedDerivedClass : public NonEmptyBase , public CopyTrackedDerivedClass {
5656public:
5757 CopyTrackedDerivedDerivedClass (int x) : CopyTrackedDerivedClass(x) {}
58- } FRT ;
58+ } IMMORTAL_FRT ;
5959
6060CopyTrackedDerivedDerivedClass *makeCopyTrackedDerivedDerivedClass (int x) {
6161 return new CopyTrackedDerivedDerivedClass (x);
@@ -66,15 +66,14 @@ class BaseReturningFRTFromSubscript {
6666 CopyTrackedDerivedClass &operator [](int x) const {
6767 return *new CopyTrackedDerivedClass (x);
6868 }
69- } FRT ;
69+ } IMMORTAL_FRT ;
7070
7171BaseReturningFRTFromSubscript *makeBaseReturningFRTFromSubscript () {
7272 return new BaseReturningFRTFromSubscript ();
7373}
7474
75- class DerivedFromBaseReturningFRTFromSubscript : public BaseReturningFRTFromSubscript {
76- public:
77- } FRT;
75+ class DerivedFromBaseReturningFRTFromSubscript
76+ : public BaseReturningFRTFromSubscript{public : } IMMORTAL_FRT;
7877
7978DerivedFromBaseReturningFRTFromSubscript *makeDerivedFromBaseReturningFRTFromSubscript () {
8079 return new DerivedFromBaseReturningFRTFromSubscript ();
@@ -90,12 +89,53 @@ class BaseReturningFRTFromSubscriptPointer {
9089
9190private:
9291 CopyTrackedDerivedClass *value;
93- } FRT ;
92+ } IMMORTAL_FRT ;
9493
95- class DerivedFromBaseReturningFRTFromSubscriptPointer : public BaseReturningFRTFromSubscriptPointer {
96- public:
97- } FRT;
94+ class DerivedFromBaseReturningFRTFromSubscriptPointer
95+ : public BaseReturningFRTFromSubscriptPointer{public : } IMMORTAL_FRT;
9896
9997DerivedFromBaseReturningFRTFromSubscriptPointer *makeDerivedFromBaseReturningFRTFromSubscriptPointer () {
10098 return new DerivedFromBaseReturningFRTFromSubscriptPointer ();
10199}
100+
101+ struct IMMORTAL_FRT ImmortalBase {
102+ int value = 0 ;
103+
104+ virtual int get42 () const { return 42 ; }
105+ virtual int getOverridden42 () const { return 123 ; }
106+ virtual int getIntValue () const { return value; }
107+ };
108+
109+ struct IMMORTAL_FRT Immortal : public ImmortalBase {
110+ static Immortal *_Nonnull create () { return new Immortal (); }
111+
112+ virtual int getOverridden42 () const override { return 42 ; }
113+ virtual void setIntValue (int newValue) { this ->value = newValue; }
114+ };
115+
116+ struct IMMORTAL_FRT DerivedFromImmortal : public Immortal {
117+ static DerivedFromImmortal *_Nonnull create () {
118+ return new DerivedFromImmortal ();
119+ }
120+ };
121+
122+ struct HasDestructor {
123+ ~HasDestructor () {}
124+ };
125+
126+ struct IMMORTAL_FRT Immortal2 {
127+ public:
128+ virtual void virtualMethod (HasDestructor) = 0;
129+ virtual void virtualRename () const
130+ __attribute__((swift_name(" swiftVirtualRename()" )));
131+ };
132+
133+ inline const ImmortalBase *_Nonnull castToImmortalBase (
134+ const Immortal *_Nonnull immortal) {
135+ return static_cast <const ImmortalBase *>(immortal);
136+ }
137+
138+ inline const Immortal *_Nonnull castToImmortal (
139+ const DerivedFromImmortal *_Nonnull immortal) {
140+ return static_cast <const Immortal *>(immortal);
141+ }
0 commit comments