Skip to content

Commit f40d3b4

Browse files
authored
Merge pull request #83176 from Xazax-hun/fix-ref-name-mangling
2 parents bb4f61e + e8c8cde commit f40d3b4

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed

lib/ClangImporter/ClangClassTemplateNamePrinter.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "ImporterImpl.h"
1515
#include "swift/ClangImporter/ClangImporter.h"
1616
#include "clang/AST/TemplateArgumentVisitor.h"
17+
#include "clang/AST/Type.h"
1718
#include "clang/AST/TypeVisitor.h"
1819

1920
using namespace swift;
@@ -94,6 +95,18 @@ struct TemplateInstantiationNamePrinter
9495
return "_";
9596
}
9697

98+
std::string VisitReferenceType(const clang::ReferenceType *type) {
99+
llvm::SmallString<128> storage;
100+
llvm::raw_svector_ostream buffer(storage);
101+
if (type->isLValueReferenceType()) {
102+
buffer << "__cxxLRef<";
103+
} else {
104+
buffer << "__cxxRRef<";
105+
}
106+
buffer << Visit(type->getPointeeType().getTypePtr()) << ">";
107+
return buffer.str().str();
108+
}
109+
97110
std::string VisitPointerType(const clang::PointerType *type) {
98111
std::string pointeeResult = Visit(type->getPointeeType().getTypePtr());
99112

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: split-file %s %t
3+
4+
// 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
5+
6+
// RUN: %target-interop-build-clangxx -std=c++20 -c %t/use-swift-cxx-types.cpp -I %t -o %t/swift-cxx-execution.o -g
7+
// 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
8+
9+
// RUN: %target-codesign %t/swift-cxx-execution
10+
// RUN: %target-run %t/swift-cxx-execution
11+
12+
// REQUIRES: executable_test
13+
14+
//--- header.h
15+
#include <functional>
16+
namespace my_cpp {
17+
struct First {
18+
double value;
19+
};
20+
struct Second {
21+
bool value;
22+
};
23+
24+
using First_cb = std::function<void(const First &)>;
25+
using Second_cb = std::function<void(const Second &)>;
26+
} // namespace my_cpp
27+
28+
//--- module.modulemap
29+
module CxxTest {
30+
header "header.h"
31+
requires cplusplus
32+
}
33+
34+
//--- use-cxx-types.swift
35+
import CxxStdlib
36+
import CxxTest
37+
38+
public func
39+
hello(first : my_cpp.First_cb /* std::function */,
40+
second : my_cpp.Second_cb /* std::function */) {
41+
first.callAsFunction(my_cpp.First(value : 3.14))
42+
second.callAsFunction(my_cpp.Second(value : true))
43+
}
44+
45+
//--- use-swift-cxx-types.cpp
46+
47+
#include "header.h"
48+
#include "UseCxx.h"
49+
#include <assert.h>
50+
51+
int main() {
52+
UseCxx::hello([](const my_cpp::First &) {}, [](const my_cpp::Second &) {});
53+
}

0 commit comments

Comments
 (0)