From fe1a4b5961322c6e245dc16df6e61eda31cc5705 Mon Sep 17 00:00:00 2001 From: Gabor Horvath Date: Fri, 12 Jul 2024 16:33:35 +0100 Subject: [PATCH] [cxx-interop] Export accessors of static properties to C++ The code wants to avoid exporting certain synthesized operators but it inadvertently also prevented exporting accessors to static properties. rdar://115564118 --- lib/PrintAsClang/DeclAndTypePrinter.cpp | 2 +- ...swift-class-static-variables-execution.cpp | 23 +++++++++++++++++++ .../class/swift-class-static-variables.swift | 13 +++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 test/Interop/SwiftToCxx/class/swift-class-static-variables-execution.cpp create mode 100644 test/Interop/SwiftToCxx/class/swift-class-static-variables.swift diff --git a/lib/PrintAsClang/DeclAndTypePrinter.cpp b/lib/PrintAsClang/DeclAndTypePrinter.cpp index 1261e5af1dedd..fc1da8d1c23a8 100644 --- a/lib/PrintAsClang/DeclAndTypePrinter.cpp +++ b/lib/PrintAsClang/DeclAndTypePrinter.cpp @@ -1091,7 +1091,7 @@ class DeclAndTypePrinter::Implementation if (outputLang == OutputLanguageMode::Cxx) { // FIXME: Support operators. - if (AFD->isOperator() || (AFD->isStatic() && AFD->isImplicit())) + if (AFD->isOperator() || (AFD->isStatic() && AFD->isImplicit() && !isa(AFD))) return; auto *typeDeclContext = dyn_cast(AFD->getParent()); diff --git a/test/Interop/SwiftToCxx/class/swift-class-static-variables-execution.cpp b/test/Interop/SwiftToCxx/class/swift-class-static-variables-execution.cpp new file mode 100644 index 0000000000000..e16ba2e7109ff --- /dev/null +++ b/test/Interop/SwiftToCxx/class/swift-class-static-variables-execution.cpp @@ -0,0 +1,23 @@ +// RUN: %empty-directory(%t) + +// RUN: %target-swift-frontend %S/swift-class-static-variables.swift -typecheck -module-name Class -clang-header-expose-decls=all-public -emit-clang-header-path %t/class.h + +// RUN: %target-interop-build-clangxx -c %s -I %t -o %t/swift-class-execution.o +// RUN: %target-interop-build-swift %S/swift-class-static-variables.swift -o %t/swift-class-execution -Xlinker %t/swift-class-execution.o -module-name Class -Xfrontend -entry-point-function-name -Xfrontend swiftMain + +// RUN: %target-codesign %t/swift-class-execution +// RUN: %target-run %t/swift-class-execution + +// REQUIRES: executable_test + + +#include "class.h" +#include +#include + +using namespace Class; + +int main() { + auto x = FileUtilities::getShared(); + assert(x.getField() == 42); +} \ No newline at end of file diff --git a/test/Interop/SwiftToCxx/class/swift-class-static-variables.swift b/test/Interop/SwiftToCxx/class/swift-class-static-variables.swift new file mode 100644 index 0000000000000..b34faa6fb463b --- /dev/null +++ b/test/Interop/SwiftToCxx/class/swift-class-static-variables.swift @@ -0,0 +1,13 @@ + +// RUN: %empty-directory(%t) +// RUN: %target-swift-frontend %s -typecheck -module-name Class -clang-header-expose-decls=all-public -emit-clang-header-path %t/class.h +// RUN: %FileCheck %s < %t/class.h + +// RUN: %check-interop-cxx-header-in-clang(%t/class.h -DSWIFT_CXX_INTEROP_HIDE_STL_OVERLAY) + +public class FileUtilities { + public static let shared = FileUtilities() + public let field = 42; +} + +// CHECK: SWIFT_INLINE_THUNK FileUtilities FileUtilities::getShared() {