Author: Timm Baeder Date: 2025-03-04T14:07:53+01:00 New Revision: 53d433e702736f9edfee57ec2c1628c729336866
URL: https://github.com/llvm/llvm-project/commit/53d433e702736f9edfee57ec2c1628c729336866 DIFF: https://github.com/llvm/llvm-project/commit/53d433e702736f9edfee57ec2c1628c729336866.diff LOG: [clang][bytecode] Only emit literal_comparison for string literals (#129691) This is what the current interpreter does as well. Added: Modified: clang/lib/AST/ByteCode/Interp.h clang/test/AST/ByteCode/builtin-functions.cpp clang/test/AST/ByteCode/functions.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/ByteCode/Interp.h b/clang/lib/AST/ByteCode/Interp.h index db35208a02941..2cf7ae2dd6f96 100644 --- a/clang/lib/AST/ByteCode/Interp.h +++ b/clang/lib/AST/ByteCode/Interp.h @@ -1065,7 +1065,8 @@ inline bool CmpHelperEQ<Pointer>(InterpState &S, CodePtr OpPC, CompareFn Fn) { for (const auto &P : {LHS, RHS}) { if (P.isZero()) continue; - if (BothNonNull && P.pointsToLiteral()) { + if (BothNonNull && P.pointsToLiteral() && + isa<StringLiteral>(P.getDeclDesc()->asExpr())) { const SourceInfo &Loc = S.Current->getSource(OpPC); S.FFDiag(Loc, diag::note_constexpr_literal_comparison); return false; diff --git a/clang/test/AST/ByteCode/builtin-functions.cpp b/clang/test/AST/ByteCode/builtin-functions.cpp index d51b039d40043..0c26d40ec5cd5 100644 --- a/clang/test/AST/ByteCode/builtin-functions.cpp +++ b/clang/test/AST/ByteCode/builtin-functions.cpp @@ -1008,9 +1008,9 @@ namespace shufflevector { namespace FunctionStart { void a(void) {} - static_assert(__builtin_function_start(a) == a, ""); // both-error {{not an integral constant expression}} \ + static_assert(__builtin_function_start(a) == a, ""); // ref-error {{not an integral constant expression}} \ // ref-note {{comparison against opaque constant address '&__builtin_function_start(a)'}} \ - // expected-note {{comparison of addresses of potentially overlapping literals has unspecified value}} + // expected-error {{static assertion failed}} } namespace BuiltinInImplicitCtor { diff --git a/clang/test/AST/ByteCode/functions.cpp b/clang/test/AST/ByteCode/functions.cpp index 66693a1fd7e32..a7c8836eac6b8 100644 --- a/clang/test/AST/ByteCode/functions.cpp +++ b/clang/test/AST/ByteCode/functions.cpp @@ -484,6 +484,18 @@ namespace AddressOf { void testAddressof(int x) { static_assert(&x == __builtin_addressof(x), ""); } + + struct TS { + constexpr bool f(TS s) const { + /// The addressof call has a CXXConstructExpr as a parameter. + return this != __builtin_addressof(s); + } + }; + constexpr bool exprAddressOf() { + TS s; + return s.f(s); + } + static_assert(exprAddressOf(), ""); } namespace std { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits