-
Notifications
You must be signed in to change notification settings - Fork 10.5k
[cxx-interop] Implement foreign reference types. #39605
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[cxx-interop] Implement foreign reference types. #39605
Conversation
@@ -1887,7 +1887,8 @@ static bool isPolymorphic(const AbstractStorageDecl *storage) { | |||
return true; | |||
|
|||
if (auto *classDecl = dyn_cast<ClassDecl>(storage->getDeclContext())) { | |||
if (storage->isFinal() || classDecl->isFinal()) | |||
if (storage->isFinal() || classDecl->isFinal() || | |||
classDecl->isForeignReferenceType()) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why is this here? Imported classes can have polymorphic operations. At the very least, this needs a comment.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added a comment.
6cf5f8e
to
dd2f450
Compare
dd2f450
to
b693fc7
Compare
@rjmccall this should be ready for re-review now. I think I addressed all your comments. Let me know what you think. Note: I still need to fix the issue with optionals (unless some macro tells us otherwise, we should be importing foreign reference types as optionals). I'll do that shortly, but I think the rest of the PR can still be reviewed without that change. |
5a89572
to
65b4f3c
Compare
@swift-ci please smoke test. |
@rjmccall friendly ping :) |
@swift-ci please smoke test. |
@rjmccall friendly ping :) |
65b4f3c
to
89fc96a
Compare
@@ -3841,7 +3842,8 @@ class ClassDecl final : public NominalTypeDecl { | |||
/// | |||
/// \see getForeignClassKind | |||
bool isForeign() const { | |||
return getForeignClassKind() != ForeignKind::Normal; | |||
return getForeignClassKind() != ForeignKind::Normal || | |||
const_cast<ClassDecl *>(this)->isForeignReferenceType(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is not ideal, but I think it's OK because we never construct a const decl, right?
89fc96a
to
191800f
Compare
@swift-ci please smoke test. |
6e17e51
to
ed9dad3
Compare
@swift-ci please smoke test. |
@rjmccall friendly ping :) |
6feca79
to
298cb75
Compare
c6f92e4
to
815b95a
Compare
@swift-ci please smoke test. |
815b95a
to
649b072
Compare
@swift-ci please smoke test. |
1 similar comment
@swift-ci please smoke test. |
649b072
to
f01913e
Compare
@swift-ci please smoke test. |
f01913e
to
58d5f52
Compare
@swift-ci please smoke test Linux. |
58d5f52
to
817a695
Compare
@swift-ci please smoke test Linux. |
817a695
to
9f0119b
Compare
@swift-ci please smoke test Linux. |
9f0119b
to
c38d1ed
Compare
@swift-ci please smoke test Linux. |
c38d1ed
to
ae9b541
Compare
@swift-ci please smoke test. |
This is an expiremental feature to allow an attribute, `import_as_ref`, to import a C++ record as a non-reference-counted reference type in Swift.
ae9b541
to
fc3b3a1
Compare
@swift-ci please smoke test. |
} | ||
|
||
bool CanType::isForeignReferenceType() { | ||
if (auto *classDecl = getPointer()->lookThroughAllOptionalTypes()->getClassOrBoundGenericClass()) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks like you duplicate the logic here. Can you call getPointer()->isForeignReferenceType()
instead?
public func test(_ _: AnyObject) {} | ||
|
||
// TODO: make this a better error. | ||
test(Empty.create()) // expected-error {{type of expression is ambiguous without more context}} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add a test for casting explicitly to any object.
IntPair passThroughByValue(IntPair x) { return x; } | ||
|
||
struct __attribute__((swift_attr("import_as_ref"))) RefHoldingPair { | ||
// REVIEW-NOTE: I added support for this but then removed it, as this sort of |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Resolve this.
- swiftlang#58975 switched many tests from XFAIL on linux to linux-gnu, so seven fail on the Android CI and two natively. They are now explicitly excluded. - swiftlang#39605 added several C++ Interop tests, 11 of which fail on the Android CI, so disable them for now. - swiftlang#42478 removed the @NoEscape attribute for the non-Android SIL/clang-function-types tests, so I remove it for Android too. - My pull swiftlang#40779 moved the Swift pointer tags to the second byte, so SILOptimizer/concat_string_literals.64 will need to be updated for that, disabled it for now. - Compiler-rt moved the directory in which it places those libraries for Android, llvm/llvm-project@a68ccba, so lit.cfg is updated for that.
This is an experimental feature to allow an attribute,
import_as_ref
, to import a C++ record as a non-reference-counted reference type in Swift.