https://github.com/tbaederr created 
https://github.com/llvm/llvm-project/pull/226115

`CharUnits` is just an `int64_t`, but passed around by const reference in 
`APValue` for some reason.

>From 9ec0a862e347b617b74320fbab8e347ef13ea714 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <[email protected]>
Date: Thu, 24 Sep 2026 12:05:26 +0200
Subject: [PATCH] Copy CharUnits parameters

---
 clang/include/clang/AST/APValue.h | 28 +++++++++++++---------------
 clang/lib/AST/APValue.cpp         |  7 +++----
 2 files changed, 16 insertions(+), 19 deletions(-)

diff --git a/clang/include/clang/AST/APValue.h 
b/clang/include/clang/AST/APValue.h
index c5c871ef953cb5..6bea43d9c82b45 100644
--- a/clang/include/clang/AST/APValue.h
+++ b/clang/include/clang/AST/APValue.h
@@ -13,6 +13,7 @@
 #ifndef LLVM_CLANG_AST_APVALUE_H
 #define LLVM_CLANG_AST_APVALUE_H
 
+#include "clang/AST/CharUnits.h"
 #include "clang/Basic/LLVM.h"
 #include "llvm/ADT/APFixedPoint.h"
 #include "llvm/ADT/APFloat.h"
@@ -29,7 +30,6 @@ template <typename T> class BasicReaderBase;
 
   class AddrLabelExpr;
   class ASTContext;
-  class CharUnits;
   class CXXRecordDecl;
   class Decl;
   class DiagnosticBuilder;
@@ -375,7 +375,7 @@ class APValue {
   /// \param Base The base of the lvalue.
   /// \param Offset The offset of the lvalue.
   /// \param IsNullPtr Whether this lvalue is a null pointer.
-  APValue(LValueBase Base, const CharUnits &Offset, NoLValuePath,
+  APValue(LValueBase Base, CharUnits Offset, NoLValuePath,
           bool IsNullPtr = false)
       : Kind(None), AllowConstexprUnknown(false) {
     MakeLValue();
@@ -388,9 +388,8 @@ class APValue {
   /// \param OnePastTheEnd Whether this lvalue is one-past-the-end of the
   /// subobject it points to.
   /// \param IsNullPtr Whether this lvalue is a null pointer.
-  APValue(LValueBase Base, const CharUnits &Offset,
-          ArrayRef<LValuePathEntry> Path, bool OnePastTheEnd,
-          bool IsNullPtr = false)
+  APValue(LValueBase Base, CharUnits Offset, ArrayRef<LValuePathEntry> Path,
+          bool OnePastTheEnd, bool IsNullPtr = false)
       : Kind(None), AllowConstexprUnknown(false) {
     MakeLValue();
     setLValue(Base, Offset, Path, OnePastTheEnd, IsNullPtr);
@@ -399,7 +398,7 @@ class APValue {
   /// \param Base The base of the lvalue.
   /// \param Offset The offset of the lvalue.
   /// \param IsNullPtr Whether this lvalue is a null pointer.
-  APValue(LValueBase Base, const CharUnits &Offset, ConstexprUnknown,
+  APValue(LValueBase Base, CharUnits Offset, ConstexprUnknown,
           bool IsNullPtr = false)
       : Kind(None), AllowConstexprUnknown(true) {
     MakeLValue();
@@ -572,7 +571,7 @@ class APValue {
 
   const LValueBase getLValueBase() const;
   CharUnits &getLValueOffset();
-  const CharUnits &getLValueOffset() const {
+  CharUnits getLValueOffset() const {
     return const_cast<APValue*>(this)->getLValueOffset();
   }
   bool isLValueOnePastTheEnd() const;
@@ -753,11 +752,9 @@ class APValue {
     ((ComplexAPFloat *)(char *)&Data)->Real = std::move(R);
     ((ComplexAPFloat *)(char *)&Data)->Imag = std::move(I);
   }
-  void setLValue(LValueBase B, const CharUnits &O, NoLValuePath,
-                 bool IsNullPtr);
-  void setLValue(LValueBase B, const CharUnits &O,
-                 ArrayRef<LValuePathEntry> Path, bool OnePastTheEnd,
-                 bool IsNullPtr);
+  void setLValue(LValueBase B, CharUnits O, NoLValuePath, bool IsNullPtr);
+  void setLValue(LValueBase B, CharUnits O, ArrayRef<LValuePathEntry> Path,
+                 bool OnePastTheEnd, bool IsNullPtr);
   void setUnion(const FieldDecl *Field, const APValue &Value);
   void setAddrLabelDiff(const AddrLabelExpr* LHSExpr,
                         const AddrLabelExpr* RHSExpr) {
@@ -852,9 +849,10 @@ class APValue {
     M->NumCols = NumCols;
     return {M->Elts, NumElts};
   }
-  MutableArrayRef<LValuePathEntry>
-  setLValueUninit(LValueBase B, const CharUnits &O, unsigned Size,
-                  bool OnePastTheEnd, bool IsNullPtr);
+  MutableArrayRef<LValuePathEntry> setLValueUninit(LValueBase B, CharUnits O,
+                                                   unsigned Size,
+                                                   bool OnePastTheEnd,
+                                                   bool IsNullPtr);
   MutableArrayRef<const CXXRecordDecl *>
   setMemberPointerUninit(const ValueDecl *Member, bool IsDerivedMember,
                          unsigned Size);
diff --git a/clang/lib/AST/APValue.cpp b/clang/lib/AST/APValue.cpp
index 5cf5a4aa6431b8..27e281d1142a4b 100644
--- a/clang/lib/AST/APValue.cpp
+++ b/clang/lib/AST/APValue.cpp
@@ -13,7 +13,6 @@
 #include "clang/AST/APValue.h"
 #include "Linkage.h"
 #include "clang/AST/ASTContext.h"
-#include "clang/AST/CharUnits.h"
 #include "clang/AST/DeclCXX.h"
 #include "clang/AST/Expr.h"
 #include "clang/AST/ExprCXX.h"
@@ -1056,7 +1055,7 @@ bool APValue::isNullPointer() const {
   return ((const LV *)(const char *)&Data)->IsNullPtr;
 }
 
-void APValue::setLValue(LValueBase B, const CharUnits &O, NoLValuePath,
+void APValue::setLValue(LValueBase B, CharUnits O, NoLValuePath,
                         bool IsNullPtr) {
   assert(isLValue() && "Invalid accessor");
   LV &LVal = *((LV *)(char *)&Data);
@@ -1068,7 +1067,7 @@ void APValue::setLValue(LValueBase B, const CharUnits &O, 
NoLValuePath,
 }
 
 MutableArrayRef<APValue::LValuePathEntry>
-APValue::setLValueUninit(LValueBase B, const CharUnits &O, unsigned Size,
+APValue::setLValueUninit(LValueBase B, CharUnits O, unsigned Size,
                          bool IsOnePastTheEnd, bool IsNullPtr) {
   assert(isLValue() && "Invalid accessor");
   LV &LVal = *((LV *)(char *)&Data);
@@ -1080,7 +1079,7 @@ APValue::setLValueUninit(LValueBase B, const CharUnits 
&O, unsigned Size,
   return {LVal.getPath(), Size};
 }
 
-void APValue::setLValue(LValueBase B, const CharUnits &O,
+void APValue::setLValue(LValueBase B, CharUnits O,
                         ArrayRef<LValuePathEntry> Path, bool IsOnePastTheEnd,
                         bool IsNullPtr) {
   MutableArrayRef<APValue::LValuePathEntry> InternalPath =

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to