Skip to content

Commit 0b996dd

Browse files
committed
[MS ABI] Add a mangling for _Complex
MSVC doesn't implement a mangling for C99's _Complex so we must invent our own. For now, treating it like a class type called _Complex in the __clang namespace. This means that 'void f(__Complex int))' will demangle as: 'void f(struct __clang::_Complex<int>)' llvm-svn: 256583
1 parent 53b60a1 commit 0b996dd

File tree

2 files changed

+14
-5
lines changed

2 files changed

+14
-5
lines changed

clang/lib/AST/MicrosoftMangle.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2207,11 +2207,16 @@ void MicrosoftCXXNameMangler::mangleType(const RValueReferenceType *T,
22072207

22082208
void MicrosoftCXXNameMangler::mangleType(const ComplexType *T, Qualifiers,
22092209
SourceRange Range) {
2210-
DiagnosticsEngine &Diags = Context.getDiags();
2211-
unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
2212-
"cannot mangle this complex number type yet");
2213-
Diags.Report(Range.getBegin(), DiagID)
2214-
<< Range;
2210+
QualType ElementType = T->getElementType();
2211+
2212+
llvm::SmallString<64> TemplateMangling;
2213+
llvm::raw_svector_ostream Stream(TemplateMangling);
2214+
MicrosoftCXXNameMangler Extra(Context, Stream);
2215+
Stream << "?$";
2216+
Extra.mangleSourceName("_Complex");
2217+
Extra.mangleType(ElementType, Range, QMM_Escape);
2218+
2219+
mangleArtificalTagType(TTK_Struct, TemplateMangling, {"__clang"});
22152220
}
22162221

22172222
void MicrosoftCXXNameMangler::mangleType(const VectorType *T, Qualifiers Quals,

clang/test/CodeGenCXX/mangle-ms.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,3 +442,7 @@ namespace Atomic {
442442
// CHECK-DAG: define void @"\01?f@Atomic@@YAXU?$_Atomic@H@__clang@@@Z"(
443443
void f(_Atomic(int)) {}
444444
}
445+
namespace Complex {
446+
// CHECK-DAG: define void @"\01?f@Complex@@YAXU?$_Complex@H@__clang@@@Z"(
447+
void f(_Complex int) {}
448+
}

0 commit comments

Comments
 (0)