[clang] Implement `ByteAddressBuffer` Load/Store methods (PR #176058)

Kaitlin Peng via cfe-commits cfe-commits at lists.llvm.org
Thu Jan 15 16:21:47 PST 2026


================
@@ -615,7 +634,7 @@ BuiltinTypeMethodBuilder &BuiltinTypeMethodBuilder::dereference(T Ptr) {
   Expr *Deref =
       UnaryOperator::Create(DeclBuilder.SemaRef.getASTContext(), PtrExpr,
                             UO_Deref, PtrExpr->getType()->getPointeeType(),
-                            VK_PRValue, OK_Ordinary, SourceLocation(),
+                            VK_LValue, OK_Ordinary, SourceLocation(),
----------------
kmpeng wrote:

It actually seems like this was implemented incorrectly before and should have always been lvalue. This is the rationale Justin gave:

> Consider https://godbolt.org/z/cbz3fcfY1 and https://godbolt.org/z/jPKK85hxq - the dereference (ie `UnaryOperator '*'`) is an LValue in every instance. Also consider [the cpp reference](https://en.cppreference.com/w/cpp/language/value_category.html), which includes in the list/examples of lvalue categories `*p`, like so: 
`*p, the built-in indirection expression;`
This makes sense, because the result of dereferencing a pointer is a valid thing to assign something to (the "Left" side of an assignment expression).

As to why I actually had to change it, the `UnaryOperator` being an rvalue was making it go through the wrong function in `ExprConstant.cpp` (`VectorExprEvaluator::VisitUnaryOperator` instead of `LValueExprEvaluator::VisitUnaryDeref`) and it was hitting an invalid cast

https://github.com/llvm/llvm-project/pull/176058


More information about the cfe-commits mailing list