https://github.com/tbaederr updated https://github.com/llvm/llvm-project/pull/202505
>From b3767085f160519c34acdd867c9e7cc6000ab225 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <[email protected]> Date: Tue, 9 Jun 2026 06:45:06 +0200 Subject: [PATCH] [clang][bytecode] Fix shifting by negative IntAP values The negation of a negative value didn't necessarily result in a positive value. Fix that by giving it one more bit of precision. --- clang/lib/AST/ByteCode/Interp.h | 2 +- clang/test/AST/ByteCode/intap.cpp | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/clang/lib/AST/ByteCode/Interp.h b/clang/lib/AST/ByteCode/Interp.h index d2ca122d0e805..38202582b653e 100644 --- a/clang/lib/AST/ByteCode/Interp.h +++ b/clang/lib/AST/ByteCode/Interp.h @@ -3257,7 +3257,7 @@ inline bool DoShiftAP(InterpState &S, CodePtr OpPC, const APSInt &LHS, return false; return DoShiftAP<LT, RT, Dir == ShiftDir::Left ? ShiftDir::Right : ShiftDir::Left>( - S, OpPC, LHS, -RHS, Result); + S, OpPC, LHS, -(RHS.extend(RHS.getBitWidth() + 1)), Result); } if (!CheckShift<Dir>(S, OpPC, static_cast<LT>(LHS), static_cast<RT>(RHS), diff --git a/clang/test/AST/ByteCode/intap.cpp b/clang/test/AST/ByteCode/intap.cpp index 5c3e9f979e129..c9904cca8d76c 100644 --- a/clang/test/AST/ByteCode/intap.cpp +++ b/clang/test/AST/ByteCode/intap.cpp @@ -1,7 +1,7 @@ // RUN: %clang_cc1 -fexperimental-new-constant-interpreter -fms-extensions -std=c++11 -verify=expected,both %s // RUN: %clang_cc1 -fexperimental-new-constant-interpreter -fms-extensions -std=c++20 -verify=expected,both %s -// RUN: %clang_cc1 -std=c++11 -fms-extensions -verify=ref,both %s -// RUN: %clang_cc1 -std=c++20 -fms-extensions -verify=ref,both %s +// RUN: %clang_cc1 -fms-extensions -std=c++11 -verify=ref,both %s +// RUN: %clang_cc1 -fms-extensions -std=c++20 -verify=ref,both %s using MaxBitInt = _BitInt(128); @@ -298,6 +298,12 @@ namespace IncDec { #endif } +namespace NegShift { + constexpr __int128_t a = ((__int128_t)1 << 127); + static_assert((2 >> a) == 1, ""); // both-error {{not an integral constant expression}} \ + // both-note {{negative shift count -170141183460469231731687303715884105728}} +} + #if __cplusplus >= 201402L const __int128_t a = ( (__int128_t)1 << 64 ); const _BitInt(72) b = ( 1 << 72 ); // both-warning {{shift count >= width of type}} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
