Author: Timm Bäder Date: 2024-06-24T19:27:28+02:00 New Revision: e6ec3664cb72fd95669cb516b21572da4236fd91
URL: https://github.com/llvm/llvm-project/commit/e6ec3664cb72fd95669cb516b21572da4236fd91 DIFF: https://github.com/llvm/llvm-project/commit/e6ec3664cb72fd95669cb516b21572da4236fd91.diff LOG: [clang][Interp] Fix classifying __builtin_addressof() argument It's an lvalue, so we need to use the classify() taking an expression. Added: Modified: clang/lib/AST/Interp/InterpBuiltin.cpp clang/test/AST/Interp/functions.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/Interp/InterpBuiltin.cpp b/clang/lib/AST/Interp/InterpBuiltin.cpp index aeb6ec42eb39e..98928b3c22d7c 100644 --- a/clang/lib/AST/Interp/InterpBuiltin.cpp +++ b/clang/lib/AST/Interp/InterpBuiltin.cpp @@ -609,8 +609,8 @@ static bool interp__builtin_addressof(InterpState &S, CodePtr OpPC, const InterpFrame *Frame, const Function *Func, const CallExpr *Call) { - PrimType PtrT = - S.getContext().classify(Call->getArg(0)->getType()).value_or(PT_Ptr); + assert(Call->getArg(0)->isLValue()); + PrimType PtrT = S.getContext().classify(Call->getArg(0)).value_or(PT_Ptr); if (PtrT == PT_FnPtr) { const FunctionPointer &Arg = S.Stk.peek<FunctionPointer>(); diff --git a/clang/test/AST/Interp/functions.cpp b/clang/test/AST/Interp/functions.cpp index 10c62a43ef33b..f43be1d3c0403 100644 --- a/clang/test/AST/Interp/functions.cpp +++ b/clang/test/AST/Interp/functions.cpp @@ -473,6 +473,10 @@ namespace AddressOf { constexpr _Complex float F = {3, 4}; static_assert(__builtin_addressof(F) == &F, ""); + + void testAddressof(int x) { + static_assert(&x == __builtin_addressof(x), ""); + } } namespace std { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits