[clang] ba27c39 - [clang][Interp] Classify correct type for compound shifts
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Sun Feb 18 07:43:31 PST 2024
Author: Timm Bäder
Date: 2024-02-18T16:31:40+01:00
New Revision: ba27c3963d785a023cc8963ec3b6f508fe31527e
URL: https://github.com/llvm/llvm-project/commit/ba27c3963d785a023cc8963ec3b6f508fe31527e
DIFF: https://github.com/llvm/llvm-project/commit/ba27c3963d785a023cc8963ec3b6f508fe31527e.diff
LOG: [clang][Interp] Classify correct type for compound shifts
RT must be the type of the RHS, otherwise this later fails when
we set the RHS value to the temporary variable.
Added:
Modified:
clang/lib/AST/Interp/ByteCodeExprGen.cpp
clang/test/AST/Interp/shifts.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
index 72789d9d348144..6ad75d4e034a9d 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -1468,7 +1468,7 @@ bool ByteCodeExprGen<Emitter>::VisitCompoundAssignOperator(
std::optional<PrimType> LHSComputationT =
classify(E->getComputationLHSType());
std::optional<PrimType> LT = classify(LHS->getType());
- std::optional<PrimType> RT = classify(E->getComputationResultType());
+ std::optional<PrimType> RT = classify(RHS->getType());
std::optional<PrimType> ResultT = classify(E->getType());
if (!LT || !RT || !ResultT || !LHSComputationT)
diff --git a/clang/test/AST/Interp/shifts.cpp b/clang/test/AST/Interp/shifts.cpp
index cf71e7145c2742..e5201b3f8bbef7 100644
--- a/clang/test/AST/Interp/shifts.cpp
+++ b/clang/test/AST/Interp/shifts.cpp
@@ -188,3 +188,12 @@ namespace shifts {
// ref-cxx17-error {{not an integral constant expression}} \
// ref-cxx17-note {{in call to 'foo(2)'}}
};
+
+namespace LongInt {
+ constexpr int f() {
+ int a = 1;
+ a <<= (long)0;
+ return 1;
+ }
+ static_assert(f() == 1, "");
+};
More information about the cfe-commits
mailing list