diff --git a/lib/AST/SwiftNameTranslation.cpp b/lib/AST/SwiftNameTranslation.cpp index 730faf9d6984c..3b60e870e1cff 100644 --- a/lib/AST/SwiftNameTranslation.cpp +++ b/lib/AST/SwiftNameTranslation.cpp @@ -272,6 +272,10 @@ bool swift::cxx_translation::isObjCxxOnly(const clang::Decl *D, // requirements and the language options to check if we should actually // consider the module to have ObjC constructs. const auto &langOpts = D->getASTContext().getLangOpts(); + // TODO: have a reasonable guess for headers specified via + // `-import-objc-header`. + if (!D->hasOwningModule()) + return false; auto clangModule = D->getOwningModule()->getTopLevelModule(); bool requiresObjC = false; for (auto req : clangModule->Requirements) diff --git a/test/Interop/CxxToSwiftToCxx/bridge-bridging-header-to-cxx.swift b/test/Interop/CxxToSwiftToCxx/bridge-bridging-header-to-cxx.swift new file mode 100644 index 0000000000000..edc9961bd7334 --- /dev/null +++ b/test/Interop/CxxToSwiftToCxx/bridge-bridging-header-to-cxx.swift @@ -0,0 +1,26 @@ +// RUN: %empty-directory(%t) +// RUN: split-file %s %t + +// RUN: %target-swift-frontend -typecheck %t/use-cxx-types.swift -typecheck -module-name UseCxx -emit-clang-header-path %t/UseCxx.h -I %t -enable-experimental-cxx-interop -clang-header-expose-decls=all-public -import-objc-header %t/header.h + +// RUN: %target-interop-build-clangxx -std=c++20 -c %t/use-swift-cxx-types.cpp -I %t -o %t/swift-cxx-execution.o -g +// RUN: %target-interop-build-swift %t/use-cxx-types.swift -o %t/swift-cxx-execution -Xlinker %t/swift-cxx-execution.o -module-name UseCxx -Xfrontend -entry-point-function-name -Xfrontend swiftMain -I %t -g -import-objc-header %t/header.h + +//--- header.h +struct CxxTy { + int field; +}; + +//--- use-cxx-types.swift +public func foo() -> CxxTy { + CxxTy() +} + +//--- use-swift-cxx-types.cpp + +#include "header.h" +#include "UseCxx.h" + +int main() { + auto obj = UseCxx::foo(); +}