https://github.com/AaronBallman created https://github.com/llvm/llvm-project/pull/135013
We were passing the address of a local variable to a call to Diag() which then tried to use the object after its lifetime ended, resulting in crashes. We no longer pass the temporary object any longer. Fixes #26612 >From 99190952174f334642ec237596969f9b0c846411 Mon Sep 17 00:00:00 2001 From: Aaron Ballman <aa...@aaronballman.com> Date: Wed, 9 Apr 2025 09:51:49 -0400 Subject: [PATCH] Fix crash with align_value diagnostic reporting We were passing the address of a local variable to a call to Diag() which then tried to use the object after its lifetime ended, resulting in crashes. We no longer pass the temporary object any longer. Fixes #26612 --- clang/docs/ReleaseNotes.rst | 4 ++++ clang/lib/Sema/SemaDeclAttr.cpp | 3 +-- clang/test/SemaCXX/align_value.cpp | 14 ++++++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 5b702b56038f7..cd16641c25ed8 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -386,6 +386,10 @@ Bug Fixes to Attribute Support or too few attribute argument indicies for the specified callback function. (#GH47451) +- No longer crashing on ``__attribute__((align_value(N)))`` during template + instantiation when the function parameter type is not a pointer or reference. + (#GH26612) + Bug Fixes to C++ Support ^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index d76afe9d6464d..b3c0367ed51b2 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -4383,7 +4383,6 @@ static void handleAlignValueAttr(Sema &S, Decl *D, const ParsedAttr &AL) { } void Sema::AddAlignValueAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E) { - AlignValueAttr TmpAttr(Context, CI, E); SourceLocation AttrLoc = CI.getLoc(); QualType T; @@ -4397,7 +4396,7 @@ void Sema::AddAlignValueAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E) { if (!T->isDependentType() && !T->isAnyPointerType() && !T->isReferenceType() && !T->isMemberPointerType()) { Diag(AttrLoc, diag::warn_attribute_pointer_or_reference_only) - << &TmpAttr << T << D->getSourceRange(); + << CI << T << D->getSourceRange(); return; } diff --git a/clang/test/SemaCXX/align_value.cpp b/clang/test/SemaCXX/align_value.cpp index 519868201f994..ad89791902e7f 100644 --- a/clang/test/SemaCXX/align_value.cpp +++ b/clang/test/SemaCXX/align_value.cpp @@ -24,3 +24,17 @@ struct nope { // expected-note@+1 {{in instantiation of template class 'nope<long double, 4>' requested here}} nope<long double, 4> y2; +namespace GH26612 { +// This used to crash while issuing the diagnostic about only applying to a +// pointer or reference type. +// FIXME: it would be ideal to only diagnose once rather than twice. We get one +// diagnostic from explicit template arguments and another one for deduced +// template arguments, which seems silly. +template <class T> +void f(T __attribute__((align_value(4))) x) {} // expected-warning 2 {{'align_value' attribute only applies to a pointer or reference ('int' is invalid)}} + +void foo() { + f<int>(0); // expected-note {{while substituting explicitly-specified template arguments into function template 'f'}} \ + expected-note {{while substituting deduced template arguments into function template 'f' [with T = int]}} +} +} // namespace GH26612 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits