[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