[clang] 6bf8046 - [clang] MicrosoftMangle: pick correct tagdecl for mangling tagkind (#155662)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Aug 27 10:48:57 PDT 2025
Author: Matheus Izvekov
Date: 2025-08-27T17:48:53Z
New Revision: 6bf8046baad97082c042ddfc491f9ee887978069
URL: https://github.com/llvm/llvm-project/commit/6bf8046baad97082c042ddfc491f9ee887978069
DIFF: https://github.com/llvm/llvm-project/commit/6bf8046baad97082c042ddfc491f9ee887978069.diff
LOG: [clang] MicrosoftMangle: pick correct tagdecl for mangling tagkind (#155662)
This fixes a regression reported here:
https://github.com/llvm/llvm-project/pull/147835#issuecomment-3225550458
Since this regression was never released, there are no release notes.
Added:
Modified:
clang/lib/AST/MicrosoftMangle.cpp
clang/test/CodeGenCXX/mangle-ms-cxx11.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp
index fc79ab1de24ff..2ac38a24456c7 100644
--- a/clang/lib/AST/MicrosoftMangle.cpp
+++ b/clang/lib/AST/MicrosoftMangle.cpp
@@ -3246,13 +3246,17 @@ void MicrosoftCXXNameMangler::mangleTagTypeKind(TagTypeKind TTK) {
}
void MicrosoftCXXNameMangler::mangleType(const EnumType *T, Qualifiers,
SourceRange) {
- mangleType(cast<TagType>(T)->getOriginalDecl()->getDefinitionOrSelf());
+ mangleType(cast<TagType>(T)->getOriginalDecl());
}
void MicrosoftCXXNameMangler::mangleType(const RecordType *T, Qualifiers,
SourceRange) {
- mangleType(cast<TagType>(T)->getOriginalDecl()->getDefinitionOrSelf());
+ mangleType(cast<TagType>(T)->getOriginalDecl());
}
void MicrosoftCXXNameMangler::mangleType(const TagDecl *TD) {
+ // MSVC chooses the tag kind of the definition if it exists, otherwise it
+ // always picks the first declaration.
+ const auto *Def = TD->getDefinition();
+ TD = Def ? Def : TD->getFirstDecl();
mangleTagTypeKind(TD->getTagKind());
mangleName(TD);
}
diff --git a/clang/test/CodeGenCXX/mangle-ms-cxx11.cpp b/clang/test/CodeGenCXX/mangle-ms-cxx11.cpp
index 312c70cc740eb..44f4436328a7d 100644
--- a/clang/test/CodeGenCXX/mangle-ms-cxx11.cpp
+++ b/clang/test/CodeGenCXX/mangle-ms-cxx11.cpp
@@ -358,3 +358,42 @@ struct s { enum {}; enum {}; };
// DBG-DAG: DW_TAG_enumeration_type{{.*}}identifier: ".?AW4<unnamed-type-$S3>@s at pr37723@@"
s x;
}
+
+namespace InconsistentTagKinds {
+ namespace t1 {
+ class A;
+ struct A;
+ void f(A*) {}
+ // CHECK-DAG: @"?f at t1@InconsistentTagKinds@@YAXPAVA at 12@@Z"
+ } // namespace t1
+ namespace t2 {
+ struct A;
+ class A;
+ void f(A*) {}
+ // CHECK-DAG: @"?f at t2@InconsistentTagKinds@@YAXPAUA at 12@@Z"
+ } // namespace t2
+ namespace t3 {
+ class A {};
+ struct A;
+ void f(A*) {}
+ // CHECK-DAG: @"?f at t3@InconsistentTagKinds@@YAXPAVA at 12@@Z"
+ } // namespace t3
+ namespace t4 {
+ struct A {};
+ class A;
+ void f(A*) {}
+ // CHECK-DAG: @"?f at t4@InconsistentTagKinds@@YAXPAUA at 12@@Z"
+ } // namespace t4
+ namespace t5 {
+ class A;
+ struct A {};
+ void f(A*) {}
+ // CHECK-DAG: @"?f at t5@InconsistentTagKinds@@YAXPAUA at 12@@Z"
+ } // namespace t5
+ namespace t6 {
+ struct A;
+ class A {};
+ void f(A*) {}
+ // CHECK-DAG: @"?f at t6@InconsistentTagKinds@@YAXPAVA at 12@@Z"
+ } // namespace t6
+} // namespace InconsistentTagKinds
More information about the cfe-commits
mailing list