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

Reply via email to