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@pr37723@@" s x; } + +namespace InconsistentTagKinds { + namespace t1 { + class A; + struct A; + void f(A*) {} + // CHECK-DAG: @"?f@t1@InconsistentTagKinds@@YAXPAVA@12@@Z" + } // namespace t1 + namespace t2 { + struct A; + class A; + void f(A*) {} + // CHECK-DAG: @"?f@t2@InconsistentTagKinds@@YAXPAUA@12@@Z" + } // namespace t2 + namespace t3 { + class A {}; + struct A; + void f(A*) {} + // CHECK-DAG: @"?f@t3@InconsistentTagKinds@@YAXPAVA@12@@Z" + } // namespace t3 + namespace t4 { + struct A {}; + class A; + void f(A*) {} + // CHECK-DAG: @"?f@t4@InconsistentTagKinds@@YAXPAUA@12@@Z" + } // namespace t4 + namespace t5 { + class A; + struct A {}; + void f(A*) {} + // CHECK-DAG: @"?f@t5@InconsistentTagKinds@@YAXPAUA@12@@Z" + } // namespace t5 + namespace t6 { + struct A; + class A {}; + void f(A*) {} + // CHECK-DAG: @"?f@t6@InconsistentTagKinds@@YAXPAVA@12@@Z" + } // namespace t6 +} // namespace InconsistentTagKinds _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits