[llvm] [orc-rt] Fix off-by-one error in d20eca15e88 (SPS CI for calls). (PR #202872)

Lang Hames via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 10 00:08:12 PDT 2026


https://github.com/lhames created https://github.com/llvm/llvm-project/pull/202872

The main-function shaped caller in d20eca15e88 had an off-by-one error that I missed as I was looking at a stale build folder. This commit fixes the error, and makes some changes to related unit test variable names for consistency.

>From 2918d02d0cfa9035b847bda672656167010273a1 Mon Sep 17 00:00:00 2001
From: Lang Hames <lhames at gmail.com>
Date: Wed, 10 Jun 2026 16:56:45 +1000
Subject: [PATCH] [orc-rt] Fix off-by-one error in d20eca15e88 (SPS CI for
 calls).

The main-function shaped caller in d20eca15e88 had an off-by-one error that I
missed as I was looking at a stale build folder. This commit fixes the error,
and makes some changes to related unit test variable names for consistency.
---
 orc-rt/lib/executor/sps-ci/CallSPSCI.cpp |  4 +-
 orc-rt/unittests/CallSPSCITest.cpp       | 47 ++++++++++++------------
 2 files changed, 26 insertions(+), 25 deletions(-)

diff --git a/orc-rt/lib/executor/sps-ci/CallSPSCI.cpp b/orc-rt/lib/executor/sps-ci/CallSPSCI.cpp
index 16f8eb7f170cb..fd034c61af074 100644
--- a/orc-rt/lib/executor/sps-ci/CallSPSCI.cpp
+++ b/orc-rt/lib/executor/sps-ci/CallSPSCI.cpp
@@ -44,7 +44,9 @@ makeNullTerminatedCStringArray(std::vector<std::string> &U) {
 void call_main(move_only_function<void(int64_t)> Return, MainFn Main,
                std::vector<std::string> Args) {
   auto ArgV = makeNullTerminatedCStringArray(Args);
-  Return(Main(ArgV.size(), ArgV.data()));
+  // Use Args.size() below, not ArgV.size, because ArgV contains a null
+  // terminator.
+  Return(Main(Args.size(), ArgV.data()));
 }
 
 ORC_RT_SPS_WRAPPER(orc_rt_ci_sps_call_main,
diff --git a/orc-rt/unittests/CallSPSCITest.cpp b/orc-rt/unittests/CallSPSCITest.cpp
index b51e9ac87ab91..9c7cd04f315c1 100644
--- a/orc-rt/unittests/CallSPSCITest.cpp
+++ b/orc-rt/unittests/CallSPSCITest.cpp
@@ -53,15 +53,14 @@ TEST_F(CallSPSCITest, CallVoidVoid) {
   EXPECT_EQ(CallVoidVoidCount, 1);
 }
 
-static int CallMainArgc = -1;
-static std::vector<std::string> CallMainArgv;
-static bool CallMainArgvIsNullTerminated = false;
-static int callMainFn(int Argc, char *Argv[]) {
-  CallMainArgc = Argc;
-  for (int I = 0; I < Argc; ++I)
-    CallMainArgv.emplace_back(Argv[I]);
-  // Per the C standard, argv[argc] shall be a null pointer.
-  CallMainArgvIsNullTerminated = (Argv[Argc] == nullptr);
+static int CallMainArgC = -1;
+static std::vector<std::string> CallMainArgV;
+static bool CallMainArgVIsNullTerminated = false;
+static int callMainFn(int argc, char *argv[]) {
+  CallMainArgC = argc;
+  for (int I = 0; I < argc; ++I)
+    CallMainArgV.push_back(argv[I]);
+  CallMainArgVIsNullTerminated = (argv[argc] == nullptr);
   return 42;
 }
 
@@ -78,39 +77,39 @@ TEST_F(CallSPSCITest, CallMain) {
   ASSERT_TRUE(!!*Result) << toString(Result->takeError());
   EXPECT_EQ(**Result, 42);
 
-  EXPECT_EQ(CallMainArgc, 3)
+  EXPECT_EQ(CallMainArgC, 3)
       << "argc should equal the number of program arguments, "
          "not including the null terminator";
-  ASSERT_EQ(CallMainArgv.size(), 3U);
-  EXPECT_EQ(CallMainArgv[0], "prog");
-  EXPECT_EQ(CallMainArgv[1], "arg1");
-  EXPECT_EQ(CallMainArgv[2], "arg2");
-  EXPECT_TRUE(CallMainArgvIsNullTerminated)
+  ASSERT_EQ(CallMainArgV.size(), 3U);
+  EXPECT_EQ(CallMainArgV[0], "prog");
+  EXPECT_EQ(CallMainArgV[1], "arg1");
+  EXPECT_EQ(CallMainArgV[2], "arg2");
+  EXPECT_TRUE(CallMainArgVIsNullTerminated)
       << "argv[argc] must be a null pointer per the C standard";
 }
 
-static int CallMainEmptyArgvArgc = -1;
-static bool CallMainEmptyArgvIsNullTerminated = false;
-static int callMainEmptyArgvFn(int Argc, char *Argv[]) {
-  CallMainEmptyArgvArgc = Argc;
-  CallMainEmptyArgvIsNullTerminated = (Argv[Argc] == nullptr);
+static int CallMainEmptyArgVArgC = -1;
+static bool CallMainEmptyArgVIsNullTerminated = false;
+static int callMainEmptyArgVFn(int argc, char *argv[]) {
+  CallMainEmptyArgVArgC = argc;
+  CallMainEmptyArgVIsNullTerminated = (argv[argc] == nullptr);
   return 42;
 }
 
-TEST_F(CallSPSCITest, CallMainEmptyArgv) {
+TEST_F(CallSPSCITest, CallMainEmptyArgV) {
   using SPSSig = int64_t(SPSExecutorAddr, SPSSequence<SPSString>);
   std::optional<Expected<int64_t>> Result;
   std::vector<std::string> Args;
   SPSWrapperFunction<SPSSig>::call(
       caller("orc_rt_ci_sps_call_main"),
       [&](Expected<int64_t> R) { Result = std::move(R); },
-      reinterpret_cast<void *>(callMainEmptyArgvFn), Args);
+      reinterpret_cast<void *>(callMainEmptyArgVFn), Args);
 
   ASSERT_TRUE(Result.has_value());
   ASSERT_TRUE(!!*Result) << toString(Result->takeError());
   EXPECT_EQ(**Result, 42);
-  EXPECT_EQ(CallMainEmptyArgvArgc, 0);
-  EXPECT_TRUE(CallMainEmptyArgvIsNullTerminated);
+  EXPECT_EQ(CallMainEmptyArgVArgC, 0);
+  EXPECT_TRUE(CallMainEmptyArgVIsNullTerminated);
 }
 
 } // namespace



More information about the llvm-commits mailing list