[llvm] [LIT] Fix env without subcommand causing early return in pipeline (PR #184028)

Aaron Chen via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 2 10:59:19 PST 2026


https://github.com/nailo2c updated https://github.com/llvm/llvm-project/pull/184028

>From 6b91ffc99263e29ed90f0cf63ada26beedae6253 Mon Sep 17 00:00:00 2001
From: nailo2c <nailo2c at gmail.com>
Date: Sun, 1 Mar 2026 11:04:18 -0800
Subject: [PATCH 1/2] [LIT] Fix env without subcommand causing early return in
 pipeline

---
 llvm/utils/lit/lit/TestRunner.py              | 30 +++++++++++++------
 .../shtest-env-positive/env-calls-env.txt     | 14 ++++-----
 .../Inputs/shtest-env-positive/env-i.txt      | 10 +++----
 .../shtest-env-positive/env-no-subcommand.txt |  3 +-
 .../Inputs/shtest-env-positive/env-u.txt      |  6 ++--
 .../tests/Inputs/shtest-env-positive/env.txt  |  8 ++---
 .../Inputs/shtest-env-positive/mixed.txt      |  8 ++---
 7 files changed, 45 insertions(+), 34 deletions(-)

diff --git a/llvm/utils/lit/lit/TestRunner.py b/llvm/utils/lit/lit/TestRunner.py
index 9e5c7d253a236..b2f67b4b7340c 100644
--- a/llvm/utils/lit/lit/TestRunner.py
+++ b/llvm/utils/lit/lit/TestRunner.py
@@ -831,16 +831,28 @@ def _executeShCmd(cmd, shenv, results, timeoutHelper):
                     cmd_shenv = ShellEnvironment(shenv.cwd, shenv.env, shenv.umask)
                 args = updateEnv(cmd_shenv, args)
                 if not args:
-                    # Return the environment variables if no argument is provided.
-                    env_str = "\n".join(
-                        f"{key}={value}" for key, value in sorted(cmd_shenv.env.items())
-                    )
-                    results.append(
-                        ShellCommandResult(
-                            j, env_str, "", 0, timeoutHelper.timeoutReached(), []
+                    if len(cmd.commands) == 1:
+                        # Single command: return environment variables in-process.
+                        env_str = "\n".join(
+                            f"{key}={value}" for key, value in sorted(cmd_shenv.env.items())
                         )
-                    )
-                    return 0
+                        results.append(
+                            ShellCommandResult(
+                                j, env_str, "", 0, timeoutHelper.timeoutReached(), []
+                            )
+                        )
+                        return 0
+                    # Pipeline: replace with a subprocess that prints the
+                    # environment variables to stdout so the output can be
+                    # piped to the next command.
+                    args = [
+                        sys.executable,
+                        "-c",
+                        "import os, sys; sys.stdout.write("
+                        "'\\n'.join(k + '=' + v"
+                        " for k, v in sorted(os.environ.items())) + '\\n')",
+                    ]
+                    break
             elif args[0] == "not":
                 not_args.append(args.pop(0))
                 not_count += 1
diff --git a/llvm/utils/lit/tests/Inputs/shtest-env-positive/env-calls-env.txt b/llvm/utils/lit/tests/Inputs/shtest-env-positive/env-calls-env.txt
index ee40c60a1e4b6..bf96212468998 100644
--- a/llvm/utils/lit/tests/Inputs/shtest-env-positive/env-calls-env.txt
+++ b/llvm/utils/lit/tests/Inputs/shtest-env-positive/env-calls-env.txt
@@ -3,14 +3,14 @@
 ## Check that internal env can call internal env.
 # RUN: env env | FileCheck -check-prefix=CHECK-2-EMPTY-ARGS %s
 #
-# CHECK-2-EMPTY-ARGS: BAR = 2
-# CHECK-2-EMPTY-ARGS: FOO = 1
+# CHECK-2-EMPTY-ARGS: BAR=2
+# CHECK-2-EMPTY-ARGS: FOO=1
 
 ## Check setting variables in a nested env call.
 # RUN: env FOO=2 env BAR=1 | FileCheck -check-prefix=CHECK-2-VAL %s
 #
-# CHECK-2-VAL: BAR = 1
-# CHECK-2-VAL: FOO = 2
+# CHECK-2-VAL: BAR=1
+# CHECK-2-VAL: FOO=2
 
 ## Check unsetting variables in a nested env call.
 # RUN: env -u FOO env -u BAR | FileCheck -check-prefix=CHECK-2-U %s
@@ -22,11 +22,11 @@
 # RUN: env -u FOO BAR=1 env -u BAR FOO=2 | FileCheck -check-prefix=CHECK-2-U-VAL %s
 #
 # CHECK-2-U-VAL-NOT: BAR
-# CHECK-2-U-VAL: FOO = 2
+# CHECK-2-U-VAL: FOO=2
 
 ## Check setting, unsetting, and adding a new variable in nested env calls.
 # RUN: env -u FOO BAR=1 env -u BAR FOO=2 env BAZ=3 | FileCheck -check-prefix=CHECK-3 %s
 #
 # CHECK-3-NOT: BAR
-# CHECK-3: BAZ = 3
-# CHECK-3: FOO = 2
+# CHECK-3: BAZ=3
+# CHECK-3: FOO=2
diff --git a/llvm/utils/lit/tests/Inputs/shtest-env-positive/env-i.txt b/llvm/utils/lit/tests/Inputs/shtest-env-positive/env-i.txt
index 2a66db1d48d05..5396cf8adda69 100644
--- a/llvm/utils/lit/tests/Inputs/shtest-env-positive/env-i.txt
+++ b/llvm/utils/lit/tests/Inputs/shtest-env-positive/env-i.txt
@@ -5,19 +5,19 @@
 # RUN: env | FileCheck --check-prefix=CHECK-ENV-PRESET %s
 ## Check clearing the entire environment.
 #
-# RUN: env -i | FileCheck --check-prefix=CHECK-ENV-CLEAR-1 %s
+# RUN: env -i | FileCheck --check-prefix=CHECK-ENV-CLEAR %s
 #
 ## Check setting a variable in a clear environment.
 #
-# RUN: env -i BAZ=3 | FileCheck --check-prefix=CHECK-ENV-ONE-1 %s
+# RUN: env -i BAZ=3 | FileCheck --check-prefix=CHECK-ENV-ONE %s
 #
 
-# CHECK-ENV-PRESET: BAR = 2
-# CHECK-ENV-PRESET: FOO = 1
+# CHECK-ENV-PRESET: BAR=2
+# CHECK-ENV-PRESET: FOO=1
 
 # CHECK-ENV-CLEAR-NOT: BAR
 # CHECK-ENV-CLEAR-NOT: FOO
 
 # CHECK-ENV-ONE-NOT: BAR
-# CHECK-ENV-ONE: BAZ = 3
+# CHECK-ENV-ONE: BAZ=3
 # CHECK-ENV-ONE-NOT: FOO
diff --git a/llvm/utils/lit/tests/Inputs/shtest-env-positive/env-no-subcommand.txt b/llvm/utils/lit/tests/Inputs/shtest-env-positive/env-no-subcommand.txt
index dded9069c44f2..235b744b52acb 100644
--- a/llvm/utils/lit/tests/Inputs/shtest-env-positive/env-no-subcommand.txt
+++ b/llvm/utils/lit/tests/Inputs/shtest-env-positive/env-no-subcommand.txt
@@ -1,5 +1,4 @@
 ## Tests the env command in various scenarios: without arguments, setting, unsetting, and mixing envrionment variables.
-# FIXME: All of these tests are broken and will not even call FileCheck.
 
 ## Check default environment.
 # RUN: env | FileCheck -check-prefix=NO-ARGS %s
@@ -30,7 +29,7 @@
 # MIXED-SET-UNSET: QUX=3
 
 ## Mixed set and unset with additional variable.
-# RUN: env -u FOO BAR=1 -u BAR FOO=2 BAZ=4 | FileCheck -check-prefix=MIXED-SET-UNSET-ADD-3 %s
+# RUN: env -u FOO BAR=1 -u BAR FOO=2 BAZ=4 | FileCheck -check-prefix=MIXED-SET-UNSET-ADD %s
 #
 # MIXED-SET-UNSET-ADD-NOT: BAR
 # MIXED-SET-UNSET-ADD: BAZ=4
diff --git a/llvm/utils/lit/tests/Inputs/shtest-env-positive/env-u.txt b/llvm/utils/lit/tests/Inputs/shtest-env-positive/env-u.txt
index 2945639c0642d..810d11ceb7c49 100644
--- a/llvm/utils/lit/tests/Inputs/shtest-env-positive/env-u.txt
+++ b/llvm/utils/lit/tests/Inputs/shtest-env-positive/env-u.txt
@@ -12,10 +12,10 @@
 #
 # RUN: env -u FOO -u BAR | FileCheck --check-prefix=CHECK-ENV-UNSET-MULTIPLE %s
 
-# CHECK-ENV-PRESET: BAR = 2
-# CHECK-ENV-PRESET: FOO = 1
+# CHECK-ENV-PRESET: BAR=2
+# CHECK-ENV-PRESET: FOO=1
 
-# CHECK-ENV-UNSET-1: BAR = 2
+# CHECK-ENV-UNSET-1: BAR=2
 # CHECK-ENV-UNSET-1-NOT: FOO
 
 # CHECK-ENV-UNSET-MULTIPLE-NOT: BAR
diff --git a/llvm/utils/lit/tests/Inputs/shtest-env-positive/env.txt b/llvm/utils/lit/tests/Inputs/shtest-env-positive/env.txt
index 74a2a65d260f4..4dff8ab4370e5 100644
--- a/llvm/utils/lit/tests/Inputs/shtest-env-positive/env.txt
+++ b/llvm/utils/lit/tests/Inputs/shtest-env-positive/env.txt
@@ -8,8 +8,8 @@
 #
 # RUN: env A_FOO=1 B_BAR=2 C_OOF=3 | FileCheck --check-prefix=CHECK-ENV-MULTIPLE %s
 
-# CHECK-ENV-1: A_FOO = 999
+# CHECK-ENV-1: A_FOO=999
 
-# CHECK-ENV-MULTIPLE: A_FOO = 1
-# CHECK-ENV-MULTIPLE: B_BAR = 2
-# CHECK-ENV-MULTIPLE: C_OOF = 3
+# CHECK-ENV-MULTIPLE: A_FOO=1
+# CHECK-ENV-MULTIPLE: B_BAR=2
+# CHECK-ENV-MULTIPLE: C_OOF=3
diff --git a/llvm/utils/lit/tests/Inputs/shtest-env-positive/mixed.txt b/llvm/utils/lit/tests/Inputs/shtest-env-positive/mixed.txt
index c2c4e8bfdfc8b..7ee4f5226a926 100644
--- a/llvm/utils/lit/tests/Inputs/shtest-env-positive/mixed.txt
+++ b/llvm/utils/lit/tests/Inputs/shtest-env-positive/mixed.txt
@@ -8,11 +8,11 @@
 #
 # RUN: env A_FOO=1 -u FOO B_BAR=2 -u BAR C_OOF=3 | FileCheck --check-prefix=CHECK-ENV-MULTIPLE %s
 
-# CHECK-ENV-1: A_FOO = 999
+# CHECK-ENV-1: A_FOO=999
 # CHECK-ENV-1-NOT: FOO
 
-# CHECK-ENV-MULTIPLE: A_FOO = 1
+# CHECK-ENV-MULTIPLE: A_FOO=1
 # CHECK-ENV-MULTIPLE-NOT: BAR
-# CHECK-ENV-MULTIPLE: B_BAR = 2
-# CHECK-ENV-MULTIPLE: C_OOF = 3
+# CHECK-ENV-MULTIPLE: B_BAR=2
+# CHECK-ENV-MULTIPLE: C_OOF=3
 # CHECK-ENV-MULTIPLE-NOT: FOO

>From 868775dbf3e2b4f45d7773fde21a7d155723f4b2 Mon Sep 17 00:00:00 2001
From: nailo2c <nailo2c at gmail.com>
Date: Mon, 2 Mar 2026 10:59:03 -0800
Subject: [PATCH 2/2] fix CI error: code_formatter

---
 llvm/utils/lit/lit/TestRunner.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/llvm/utils/lit/lit/TestRunner.py b/llvm/utils/lit/lit/TestRunner.py
index b2f67b4b7340c..8fdf7b6a114c4 100644
--- a/llvm/utils/lit/lit/TestRunner.py
+++ b/llvm/utils/lit/lit/TestRunner.py
@@ -834,7 +834,8 @@ def _executeShCmd(cmd, shenv, results, timeoutHelper):
                     if len(cmd.commands) == 1:
                         # Single command: return environment variables in-process.
                         env_str = "\n".join(
-                            f"{key}={value}" for key, value in sorted(cmd_shenv.env.items())
+                            f"{key}={value}"
+                            for key, value in sorted(cmd_shenv.env.items())
                         )
                         results.append(
                             ShellCommandResult(



More information about the llvm-commits mailing list