[clang] [clang][bytecode] Fix crash on __builtin_align_up with one-past-end pointers (PR #178652)

via cfe-commits cfe-commits at lists.llvm.org
Thu Jan 29 10:13:18 PST 2026


https://github.com/mugiwaraluffy56 updated https://github.com/llvm/llvm-project/pull/178652

>From de9c82488d954c995301badd8ea79b8d39eefdb7 Mon Sep 17 00:00:00 2001
From: mugiwaraluffy56 <myakampuneeth at gmail.com>
Date: Thu, 29 Jan 2026 19:02:20 +0530
Subject: [PATCH] [clang][bytecode] Fix crash on __builtin_align_up with
 one-past-end pointers

Fix assertion failure when evaluating __builtin_align_up/down/is_aligned
with one-past-end pointers like `&array[size]`.

The issue was that getIndex() calls getOffset() which asserts when
Offset == PastEndMark. For one-past-end pointers, we now use
getNumElems() instead which gives the correct index.

Fixes #178647
---
 clang/lib/AST/ByteCode/InterpBuiltin.cpp      | 5 ++++-
 clang/test/AST/ByteCode/builtin-align-cxx.cpp | 3 +++
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
index 4cf6898df3692..fd75e212e7d5e 100644
--- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp
+++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
@@ -1211,7 +1211,10 @@ static bool interp__builtin_is_aligned_up_down(InterpState &S, CodePtr OpPC,
   if (!Ptr.isBlockPointer())
     return false;
 
-  unsigned PtrOffset = Ptr.getIndex();
+  // For one-past-end pointers, we can't call getIndex() since it asserts.
+  // Use getNumElems() instead which gives the correct index for past-end.
+  unsigned PtrOffset =
+      Ptr.isElementPastEnd() ? Ptr.getNumElems() : Ptr.getIndex();
   CharUnits BaseAlignment =
       S.getASTContext().getDeclAlign(Ptr.getDeclDesc()->asValueDecl());
   CharUnits PtrAlign =
diff --git a/clang/test/AST/ByteCode/builtin-align-cxx.cpp b/clang/test/AST/ByteCode/builtin-align-cxx.cpp
index a1edf307d6c47..636d58383867a 100644
--- a/clang/test/AST/ByteCode/builtin-align-cxx.cpp
+++ b/clang/test/AST/ByteCode/builtin-align-cxx.cpp
@@ -240,5 +240,8 @@ static_assert(!__builtin_is_aligned(static_cast<unsigned long>(7), static_cast<s
 static_assert(!__builtin_is_aligned(static_cast<signed long>(7), static_cast<unsigned short>(4)), "");
 static_assert(!__builtin_is_aligned(static_cast<unsigned short>(7), static_cast<signed long>(4)), "");
 
+// Check that one-past-end pointers work correctly (GH#178647).
+static_assert(__builtin_align_up(&align32array[128], 4) == align32array + 128, "");
+
 // Check the diagnostic message
 _Alignas(void) char align_void_array[1]; // both-error {{invalid application of '_Alignas' to an incomplete type 'void'}}



More information about the cfe-commits mailing list