Author: Michael Buch Date: 2025-02-07T11:10:09Z New Revision: c269182b13abddc459820e57a4d2065f364b23dc
URL: https://github.com/llvm/llvm-project/commit/c269182b13abddc459820e57a4d2065f364b23dc DIFF: https://github.com/llvm/llvm-project/commit/c269182b13abddc459820e57a4d2065f364b23dc.diff LOG: [lldb][TypeSystemClang] Initialize ClassTemplateSpecializationDecl's StrictPackMatch field (#126215) This addresses the MSAN failure reported in https://github.com/llvm/llvm-project/pull/125791#issuecomment-2639183154: ``` ==5633==WARNING: MemorySanitizer: use-of-uninitialized-value #0 in clang::ASTNodeImporter::CallOverloadedCreateFun<clang::ClassTemplateSpecializationDecl>::operator() #1 in bool clang::ASTNodeImporter::GetImportedOrCreateSpecialDecl<...> ... ``` The ASTImporter reads `D->hasStrictPackMatch()` and forwards it to the constructor of the destination `ClassTemplateSpecializationDecl`. But if `D` is a decl that LLDB created from debug-info, it would've been created using `ClassTemplateSpecializationDecl::CreateDeserialized`, which doesn't initialize the `StrictPackMatch` field. This patch just initializes the field to a fixed value of `false`, to preserve previous behaviour and avoid the use-of-uninitialized-value. An alternative would be to always initialize it in the `ClassTemplateSpecializationDecl` constructor, but there were reservations about providing a default value for it because it might lead to hard-to-diagnose problems down the line. Added: Modified: clang/include/clang/AST/DeclTemplate.h lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp Removed: ################################################################################ diff --git a/clang/include/clang/AST/DeclTemplate.h b/clang/include/clang/AST/DeclTemplate.h index a30ae798a99bc69..b82f75dd63fa508 100644 --- a/clang/include/clang/AST/DeclTemplate.h +++ b/clang/include/clang/AST/DeclTemplate.h @@ -1960,6 +1960,8 @@ class ClassTemplateSpecializationDecl : public CXXRecordDecl, bool hasStrictPackMatch() const { return StrictPackMatch; } + void setStrictPackMatch(bool Val) { StrictPackMatch = Val; } + /// Get the point of instantiation (if any), or null if none. SourceLocation getPointOfInstantiation() const { return PointOfInstantiation; diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp index 1da8fbe0bcd6dda..ecb571b1161bbc6 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -1666,6 +1666,12 @@ TypeSystemClang::CreateClassTemplateSpecializationDecl( ast.getTypeDeclType(class_template_specialization_decl, nullptr); class_template_specialization_decl->setDeclName( class_template_decl->getDeclName()); + + // FIXME: set to fixed value for now so it's not uninitialized. + // One way to determine StrictPackMatch would be + // Sema::CheckTemplateTemplateArgument. + class_template_specialization_decl->setStrictPackMatch(false); + SetOwningModule(class_template_specialization_decl, owning_module); decl_ctx->addDecl(class_template_specialization_decl); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits