[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