[clang] 65c0143 - [clang][Interp] Fix rotate builtins with differently-typed arguments
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 14 08:34:28 PDT 2024
Author: Timm Bäder
Date: 2024-03-14T16:34:07+01:00
New Revision: 65c0143296e3d8aafe819cbae4a48a3d53f8e7b3
URL: https://github.com/llvm/llvm-project/commit/65c0143296e3d8aafe819cbae4a48a3d53f8e7b3
DIFF: https://github.com/llvm/llvm-project/commit/65c0143296e3d8aafe819cbae4a48a3d53f8e7b3.diff
LOG: [clang][Interp] Fix rotate builtins with differently-typed arguments
We were assuming (and asserting) that both arguments have the same
type, but at least for the ms versions, that's not always the case.
Added:
clang/test/AST/Interp/ms.cpp
Modified:
clang/lib/AST/Interp/InterpBuiltin.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/Interp/InterpBuiltin.cpp b/clang/lib/AST/Interp/InterpBuiltin.cpp
index 8bbe881bb4b928..7e29d6183bdadd 100644
--- a/clang/lib/AST/Interp/InterpBuiltin.cpp
+++ b/clang/lib/AST/Interp/InterpBuiltin.cpp
@@ -533,11 +533,12 @@ static bool interp__builtin_rotate(InterpState &S, CodePtr OpPC,
const InterpFrame *Frame,
const Function *Func, const CallExpr *Call,
bool Right) {
- PrimType ArgT = *S.getContext().classify(Call->getArg(0)->getType());
- assert(ArgT == *S.getContext().classify(Call->getArg(1)->getType()));
+ PrimType AmountT = *S.getContext().classify(Call->getArg(1)->getType());
+ PrimType ValueT = *S.getContext().classify(Call->getArg(0)->getType());
- APSInt Amount = peekToAPSInt(S.Stk, ArgT);
- APSInt Value = peekToAPSInt(S.Stk, ArgT, align(primSize(ArgT)) * 2);
+ APSInt Amount = peekToAPSInt(S.Stk, AmountT);
+ APSInt Value = peekToAPSInt(
+ S.Stk, ValueT, align(primSize(AmountT)) + align(primSize(ValueT)));
APSInt Result;
if (Right)
diff --git a/clang/test/AST/Interp/ms.cpp b/clang/test/AST/Interp/ms.cpp
new file mode 100644
index 00000000000000..99716e90c7a1db
--- /dev/null
+++ b/clang/test/AST/Interp/ms.cpp
@@ -0,0 +1,8 @@
+// RUN: %clang_cc1 -verify=ref,both %s -fms-extensions
+// RUN: %clang_cc1 -verify=expected,both %s -fexperimental-new-constant-interpreter -fms-extensions
+
+// ref-no-diagnostics
+// expected-no-diagnostics
+
+/// Used to assert because the two parameters to _rotl do not have the same type.
+static_assert(_rotl(0x01, 5) == 32);
More information about the cfe-commits
mailing list