[clang] 3278948 - Fix `sed -e s at FOO@%/S@` and similar when there's @'s in the working directory

Daniel Sanders via cfe-commits cfe-commits at lists.llvm.org
Tue Dec 3 15:44:14 PST 2019


Author: Daniel Sanders
Date: 2019-12-03T15:44:01-08:00
New Revision: 327894859cc41c1730807f8a179aa880203262f5

URL: https://github.com/llvm/llvm-project/commit/327894859cc41c1730807f8a179aa880203262f5
DIFF: https://github.com/llvm/llvm-project/commit/327894859cc41c1730807f8a179aa880203262f5.diff

LOG: Fix `sed -e s at FOO@%/S@` and similar when there's @'s in the working directory

Jenkins sometimes starts a new working directory by appending @2 (or
incrementing the number if the @n suffix is already there). This causes
several clang tests to fail as:
  s at INPUT_DIR@%/S/Inputs at g
gets expanded to the invalid:
  s at INPUT_DIR@/path/to/workdir at 2/Inputs at g
                               ~~~~~~~~~~
where the part marked with ~'s is interpreted as the flags. These are
invalid and the test fails.

Previous fixes simply exchanged the @ character for another like | but
that's just moving the problem. Address it by adding an expansion that
escapes the @ character we're using as a delimiter as well as other magic
characters in the replacement of sed's s@@@.

There's still room for expansions to cause trouble though. One I ran into
while testing this was that having a directory called foo at bar causes lots
of `CHECK-NOT: foo` directives to match. There's also things like
directories containing `\1`

Added: 
    

Modified: 
    clang/test/Index/index-module-with-vfs.m
    clang/test/Modules/crash-vfs-ivfsoverlay.m
    clang/test/Modules/double-quotes.m
    clang/test/Modules/framework-public-includes-private.m
    clang/test/VFS/external-names.c
    clang/test/VFS/framework-import.m
    clang/test/VFS/implicit-include.c
    clang/test/VFS/include-mixed-real-and-virtual.c
    clang/test/VFS/include-real-from-virtual.c
    clang/test/VFS/include-virtual-from-real.c
    clang/test/VFS/include.c
    clang/test/VFS/incomplete-umbrella.m
    clang/test/VFS/module-import.m
    clang/test/VFS/module_missing_vfs.m
    clang/test/VFS/real-path-found-first.m
    clang/test/VFS/relative-path.c
    clang/test/VFS/test_nonmodular.c
    clang/test/VFS/umbrella-framework-import-skipnonexist.m
    clang/test/VFS/vfsroot-include.c
    clang/test/VFS/vfsroot-module.m
    clang/test/VFS/vfsroot-with-overlay.c
    llvm/utils/lit/lit/TestRunner.py

Removed: 
    


################################################################################
diff  --git a/clang/test/Index/index-module-with-vfs.m b/clang/test/Index/index-module-with-vfs.m
index 46fa68dfa130..06944d372d49 100644
--- a/clang/test/Index/index-module-with-vfs.m
+++ b/clang/test/Index/index-module-with-vfs.m
@@ -6,7 +6,7 @@ void foo() {
 }
 
 // RUN: rm -rf %t.cache
-// RUN: sed -e "s at INPUT_DIR@%/S/Inputs at g" -e "s at OUT_DIR@%/t at g" %S/Inputs/vfsoverlay.yaml > %t.yaml
+// RUN: sed -e "s at INPUT_DIR@%{/S:regex_replacement}/Inputs at g" -e "s at OUT_DIR@%{/t:regex_replacement}@g" %S/Inputs/vfsoverlay.yaml > %t.yaml
 // RUN: c-index-test -index-file %s -fmodules-cache-path=%t.cache -fmodules -F %t -I %t \
 // RUN:              -ivfsoverlay %t.yaml -Xclang -fdisable-module-hash | FileCheck %s
 

diff  --git a/clang/test/Modules/crash-vfs-ivfsoverlay.m b/clang/test/Modules/crash-vfs-ivfsoverlay.m
index 00992aa19fad..d2d2ccbd2546 100644
--- a/clang/test/Modules/crash-vfs-ivfsoverlay.m
+++ b/clang/test/Modules/crash-vfs-ivfsoverlay.m
@@ -3,7 +3,7 @@
 // RUN: rm -rf %t
 // RUN: mkdir -p %t/m
 // RUN: cp %S/../VFS/Inputs/actual_module2.map %t/actual_module2.map
-// RUN: sed -e "s at INPUT_DIR@%/t at g" -e "s at OUT_DIR@%/t/example at g" \
+// RUN: sed -e "s at INPUT_DIR@%{/t:regex_replacement}@g" -e "s at OUT_DIR@%{/t:regex_replacement}/example at g" \
 // RUN:   %S/../VFS/Inputs/vfsoverlay2.yaml > %t/srcvfs.yaml
 
 // RUN: env FORCE_CLANG_DIAGNOSTICS_CRASH= TMPDIR=%t TEMP=%t TMP=%t \

diff  --git a/clang/test/Modules/double-quotes.m b/clang/test/Modules/double-quotes.m
index 4ce712ccc6c5..99187fc26654 100644
--- a/clang/test/Modules/double-quotes.m
+++ b/clang/test/Modules/double-quotes.m
@@ -4,7 +4,7 @@
 // RUN: %hmaptool write %S/Inputs/double-quotes/a.hmap.json %t/a.hmap
 // RUN: %hmaptool write %S/Inputs/double-quotes/x.hmap.json %t/x.hmap
 
-// RUN: sed -e "s at TEST_DIR@%/S/Inputs/double-quotes at g" \
+// RUN: sed -e "s at TEST_DIR@%{/S:regex_replacement}/Inputs/double-quotes at g" \
 // RUN:   %S/Inputs/double-quotes/z.yaml > %t/z.yaml
 
 // The output with and without modules should be the same

diff  --git a/clang/test/Modules/framework-public-includes-private.m b/clang/test/Modules/framework-public-includes-private.m
index 0f1e3a242a15..37c43e9a6390 100644
--- a/clang/test/Modules/framework-public-includes-private.m
+++ b/clang/test/Modules/framework-public-includes-private.m
@@ -4,7 +4,7 @@
 // RUN: %hmaptool write %S/Inputs/framework-public-includes-private/a.hmap.json %t/a.hmap
 // RUN: %hmaptool write %S/Inputs/framework-public-includes-private/z.hmap.json %t/z.hmap
 
-// RUN: sed -e "s at TEST_DIR@%/S/Inputs/framework-public-includes-private at g" \
+// RUN: sed -e "s at TEST_DIR@%{/S:regex_replacement}/Inputs/framework-public-includes-private at g" \
 // RUN:   %S/Inputs/framework-public-includes-private/z.yaml > %t/z.yaml
 
 // The output with and without modules should be the same, without modules first.

diff  --git a/clang/test/VFS/external-names.c b/clang/test/VFS/external-names.c
index 1e12c930c35e..0500611c3e40 100644
--- a/clang/test/VFS/external-names.c
+++ b/clang/test/VFS/external-names.c
@@ -1,5 +1,5 @@
-// RUN: sed -e "s at INPUT_DIR@%/S/Inputs at g" -e "s at OUT_DIR@%/t at g" -e "s at EXTERNAL_NAMES@true@" %S/Inputs/use-external-names.yaml > %t.external.yaml
-// RUN: sed -e "s at INPUT_DIR@%/S/Inputs at g" -e "s at OUT_DIR@%/t at g" -e "s at EXTERNAL_NAMES@false@" %S/Inputs/use-external-names.yaml > %t.yaml
+// RUN: sed -e "s at INPUT_DIR@%{/S:regex_replacement}/Inputs at g" -e "s at OUT_DIR@%{/t:regex_replacement}@g" -e "s at EXTERNAL_NAMES@true@" %S/Inputs/use-external-names.yaml > %t.external.yaml
+// RUN: sed -e "s at INPUT_DIR@%{/S:regex_replacement}/Inputs at g" -e "s at OUT_DIR@%{/t:regex_replacement}@g" -e "s at EXTERNAL_NAMES@false@" %S/Inputs/use-external-names.yaml > %t.yaml
 
 #include "external-names.h"
 #ifdef REINCLUDE

diff  --git a/clang/test/VFS/framework-import.m b/clang/test/VFS/framework-import.m
index 858f1f57fbd1..cd923c1dbe0f 100644
--- a/clang/test/VFS/framework-import.m
+++ b/clang/test/VFS/framework-import.m
@@ -1,4 +1,4 @@
-// RUN: sed -e "s at INPUT_DIR@%/S/Inputs at g" -e "s at OUT_DIR@%/t at g" %S/Inputs/vfsoverlay.yaml > %t.yaml
+// RUN: sed -e "s at INPUT_DIR@%{/S:regex_replacement}/Inputs at g" -e "s at OUT_DIR@%{/t:regex_replacement}@g" %S/Inputs/vfsoverlay.yaml > %t.yaml
 // RUN: %clang_cc1 -Werror -F %t -ivfsoverlay %t.yaml -fsyntax-only %s
 
 #import <SomeFramework/public_header.h>

diff  --git a/clang/test/VFS/implicit-include.c b/clang/test/VFS/implicit-include.c
index 654e0a87de0e..06bff4b962db 100644
--- a/clang/test/VFS/implicit-include.c
+++ b/clang/test/VFS/implicit-include.c
@@ -1,4 +1,4 @@
-// RUN: sed -e "s at INPUT_DIR@%/S/Inputs at g" -e "s at OUT_DIR@%/t at g" %S/Inputs/vfsoverlay.yaml > %t.yaml
+// RUN: sed -e "s at INPUT_DIR@%{/S:regex_replacement}/Inputs at g" -e "s at OUT_DIR@%{/t:regex_replacement}@g" %S/Inputs/vfsoverlay.yaml > %t.yaml
 // RUN: %clang_cc1 -Werror -ivfsoverlay %t.yaml -I %t -include "not_real.h" -fsyntax-only %s
 
 void foo() {

diff  --git a/clang/test/VFS/include-mixed-real-and-virtual.c b/clang/test/VFS/include-mixed-real-and-virtual.c
index e4297c5737d9..b46ee9af9990 100644
--- a/clang/test/VFS/include-mixed-real-and-virtual.c
+++ b/clang/test/VFS/include-mixed-real-and-virtual.c
@@ -1,7 +1,7 @@
 // RUN: rm -rf %t
 // RUN: mkdir -p %t
 // RUN: echo "void baz(void);" > %t/real.h
-// RUN: sed -e "s at INPUT_DIR@%/S/Inputs at g" -e "s at OUT_DIR@%/t at g" %S/Inputs/vfsoverlay.yaml > %t.yaml
+// RUN: sed -e "s at INPUT_DIR@%{/S:regex_replacement}/Inputs at g" -e "s at OUT_DIR@%{/t:regex_replacement}@g" %S/Inputs/vfsoverlay.yaml > %t.yaml
 // RUN: %clang_cc1 -Werror -ivfsoverlay %t.yaml -I %t -fsyntax-only %s
 
 #include "not_real.h"

diff  --git a/clang/test/VFS/include-real-from-virtual.c b/clang/test/VFS/include-real-from-virtual.c
index 3a41c4ea2c76..7398be735c5f 100644
--- a/clang/test/VFS/include-real-from-virtual.c
+++ b/clang/test/VFS/include-real-from-virtual.c
@@ -1,7 +1,7 @@
 // RUN: rm -rf %t
 // RUN: mkdir -p %t
 // RUN: echo "void baz(void);" > %t/real.h
-// RUN: sed -e "s at INPUT_DIR@%/S/Inputs at g" -e "s at OUT_DIR@%/t at g" %S/Inputs/vfsoverlay.yaml > %t.yaml
+// RUN: sed -e "s at INPUT_DIR@%{/S:regex_replacement}/Inputs at g" -e "s at OUT_DIR@%{/t:regex_replacement}@g" %S/Inputs/vfsoverlay.yaml > %t.yaml
 // RUN: %clang_cc1 -Werror -ivfsoverlay %t.yaml -I %t -fsyntax-only %s
 
 #include "include_real.h"

diff  --git a/clang/test/VFS/include-virtual-from-real.c b/clang/test/VFS/include-virtual-from-real.c
index 0b0d4cd0025a..b50d5b729253 100644
--- a/clang/test/VFS/include-virtual-from-real.c
+++ b/clang/test/VFS/include-virtual-from-real.c
@@ -1,7 +1,7 @@
 // RUN: rm -rf %t
 // RUN: mkdir -p %t
 // RUN: echo '#include "not_real.h"' > %t/include_not_real.h
-// RUN: sed -e "s at INPUT_DIR@%/S/Inputs at g" -e "s at OUT_DIR@%/t at g" %S/Inputs/vfsoverlay.yaml > %t.yaml
+// RUN: sed -e "s at INPUT_DIR@%{/S:regex_replacement}/Inputs at g" -e "s at OUT_DIR@%{/t:regex_replacement}@g" %S/Inputs/vfsoverlay.yaml > %t.yaml
 // RUN: %clang_cc1 -Werror -ivfsoverlay %t.yaml -I %t -fsyntax-only %s
 
 #include "include_not_real.h"

diff  --git a/clang/test/VFS/include.c b/clang/test/VFS/include.c
index 16a1bca71a72..a55e73a38178 100644
--- a/clang/test/VFS/include.c
+++ b/clang/test/VFS/include.c
@@ -1,4 +1,4 @@
-// RUN: sed -e "s at INPUT_DIR@%/S/Inputs at g" -e "s at OUT_DIR@%/t at g" %S/Inputs/vfsoverlay.yaml > %t.yaml
+// RUN: sed -e "s at INPUT_DIR@%{/S:regex_replacement}/Inputs at g" -e "s at OUT_DIR@%{/t:regex_replacement}@g" %S/Inputs/vfsoverlay.yaml > %t.yaml
 // RUN: %clang_cc1 -Werror -I %t -ivfsoverlay %t.yaml -fsyntax-only %s
 
 #include "not_real.h"

diff  --git a/clang/test/VFS/incomplete-umbrella.m b/clang/test/VFS/incomplete-umbrella.m
index 5b2a1e0b4e1b..196313927bc0 100644
--- a/clang/test/VFS/incomplete-umbrella.m
+++ b/clang/test/VFS/incomplete-umbrella.m
@@ -1,7 +1,7 @@
 // RUN: rm -rf %t
 // RUN: mkdir -p %t/Incomplete.framework/Headers
 // RUN: echo '// IncompleteReal.h' > %t/Incomplete.framework/Headers/IncompleteReal.h
-// RUN: sed -e "s at INPUT_DIR@%/S/Inputs at g" -e "s at OUT_DIR@%/t at g" %S/Inputs/vfsoverlay.yaml > %t.yaml
+// RUN: sed -e "s at INPUT_DIR@%{/S:regex_replacement}/Inputs at g" -e "s at OUT_DIR@%{/t:regex_replacement}@g" %S/Inputs/vfsoverlay.yaml > %t.yaml
 // RUN: not %clang_cc1 -Werror -fmodules -fimplicit-module-maps -fmodules-cache-path=%t \
 // RUN:     -ivfsoverlay %t.yaml -F %t -fsyntax-only %s 2>&1 | FileCheck %s
 

diff  --git a/clang/test/VFS/module-import.m b/clang/test/VFS/module-import.m
index 336a72d31cfa..25d37bbf0a77 100644
--- a/clang/test/VFS/module-import.m
+++ b/clang/test/VFS/module-import.m
@@ -1,5 +1,5 @@
 // RUN: rm -rf %t
-// RUN: sed -e "s at INPUT_DIR@%/S/Inputs at g" -e "s at OUT_DIR@%/t at g" %S/Inputs/vfsoverlay.yaml > %t.yaml
+// RUN: sed -e "s at INPUT_DIR@%{/S:regex_replacement}/Inputs at g" -e "s at OUT_DIR@%{/t:regex_replacement}@g" %S/Inputs/vfsoverlay.yaml > %t.yaml
 // RUN: %clang_cc1 -Werror -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -ivfsoverlay %t.yaml -I %t -fsyntax-only %s
 
 @import not_real;
@@ -16,7 +16,7 @@ void foo() {
 #endif
 
 // Override the module map (vfsoverlay2 on top)
-// RUN: sed -e "s at INPUT_DIR@%/S/Inputs at g" -e "s at OUT_DIR@%/t at g" %S/Inputs/vfsoverlay2.yaml > %t2.yaml
+// RUN: sed -e "s at INPUT_DIR@%{/S:regex_replacement}/Inputs at g" -e "s at OUT_DIR@%{/t:regex_replacement}@g" %S/Inputs/vfsoverlay2.yaml > %t2.yaml
 // RUN: %clang_cc1 -Werror -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -ivfsoverlay %t.yaml -ivfsoverlay %t2.yaml -I %t -fsyntax-only %s
 
 // vfsoverlay2 not present

diff  --git a/clang/test/VFS/module_missing_vfs.m b/clang/test/VFS/module_missing_vfs.m
index 6285ac064927..3cd8fc2c9eed 100644
--- a/clang/test/VFS/module_missing_vfs.m
+++ b/clang/test/VFS/module_missing_vfs.m
@@ -5,7 +5,7 @@
 // ERROR: virtual filesystem overlay file '{{.*}}' not found
 // RUN: find %t/mcp -name "A-*.pcm" | count 1
 
-// RUN: sed -e "s at INPUT_DIR@%/S/Inputs at g" -e "s at OUT_DIR@%/t at g" %S/Inputs/MissingVFS/vfsoverlay.yaml > %t/vfs.yaml
+// RUN: sed -e "s at INPUT_DIR@%{/S:regex_replacement}/Inputs at g" -e "s at OUT_DIR@%{/t:regex_replacement}@g" %S/Inputs/MissingVFS/vfsoverlay.yaml > %t/vfs.yaml
 // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/mcp -I %S/Inputs/MissingVFS %s -fsyntax-only -ivfsoverlay %t/vfs.yaml
 // RUN: find %t/mcp -name "A-*.pcm" | count 1
 

diff  --git a/clang/test/VFS/real-path-found-first.m b/clang/test/VFS/real-path-found-first.m
index 8d7d21bf7832..0d9a6de589fd 100644
--- a/clang/test/VFS/real-path-found-first.m
+++ b/clang/test/VFS/real-path-found-first.m
@@ -7,7 +7,7 @@
 // RUN: rm -rf %t %t-cache %t.pch
 // RUN: mkdir -p %t/SomeFramework.framework/Modules
 // RUN: cat %S/Inputs/some_frame_module.map > %t/SomeFramework.framework/Modules/module.modulemap
-// RUN: sed -e "s at INPUT_DIR@%/S/Inputs at g" -e "s at OUT_DIR@%/t at g" %S/Inputs/vfsoverlay.yaml > %t.yaml
+// RUN: sed -e "s at INPUT_DIR@%{/S:regex_replacement}/Inputs at g" -e "s at OUT_DIR@%{/t:regex_replacement}@g" %S/Inputs/vfsoverlay.yaml > %t.yaml
 
 // Build
 // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t-cache -F %t \

diff  --git a/clang/test/VFS/relative-path.c b/clang/test/VFS/relative-path.c
index fc4ae151d87f..24313affc69d 100644
--- a/clang/test/VFS/relative-path.c
+++ b/clang/test/VFS/relative-path.c
@@ -1,6 +1,6 @@
 // RUN: mkdir -p %t
 // RUN: cd %t
-// RUN: sed -e "s at INPUT_DIR@%/S/Inputs at g" -e "s at OUT_DIR@%/t at g" %S/Inputs/vfsoverlay.yaml > %t.yaml
+// RUN: sed -e "s at INPUT_DIR@%{/S:regex_replacement}/Inputs at g" -e "s at OUT_DIR@%{/t:regex_replacement}@g" %S/Inputs/vfsoverlay.yaml > %t.yaml
 // RUN: %clang_cc1 -Werror -I . -ivfsoverlay %t.yaml -fsyntax-only %s
 
 #include "not_real.h"

diff  --git a/clang/test/VFS/test_nonmodular.c b/clang/test/VFS/test_nonmodular.c
index dbc1f622f203..faec0e3a5162 100644
--- a/clang/test/VFS/test_nonmodular.c
+++ b/clang/test/VFS/test_nonmodular.c
@@ -3,7 +3,7 @@
 // We can't have module.map inside Inputs/Nonmodular.
 // RUN: cp %S/Inputs/Nonmodular/Nonmodular.modulemap %t/outdir/module.modulemap
 //
-// RUN: sed -e "s at VDIR@%/t/vdir at g" -e "s at IN_DIR@%/S at g" -e "s at OUT_DIR@%/t/outdir at g" %S/Inputs/Nonmodular/nonmodular-headers.yaml > %t/vdir/nonmodular-headers.yaml
+// RUN: sed -e "s at VDIR@%{/t:regex_replacement}/vdir at g" -e "s at IN_DIR@%{/S:regex_replacement}@g" -e "s at OUT_DIR@%{/t:regex_replacement}/outdir at g" %S/Inputs/Nonmodular/nonmodular-headers.yaml > %t/vdir/nonmodular-headers.yaml
 // RUN: %clang_cc1 -fmodule-name=Nonmodular -fmodules -Wnon-modular-include-in-framework-module -verify -fimplicit-module-maps -fmodules-cache-path=%t/cache -ivfsoverlay %t/vdir/nonmodular-headers.yaml -I %S/Inputs -F %t/vdir -fsyntax-only %S/Inputs/Nonmodular/test.c
 
 // expected-no-diagnostics

diff  --git a/clang/test/VFS/umbrella-framework-import-skipnonexist.m b/clang/test/VFS/umbrella-framework-import-skipnonexist.m
index 6f536b40a911..a778e26af162 100644
--- a/clang/test/VFS/umbrella-framework-import-skipnonexist.m
+++ b/clang/test/VFS/umbrella-framework-import-skipnonexist.m
@@ -4,7 +4,7 @@
 // RUN: mkdir -p %t/vdir %t/outdir %t/cache
 // RUN: cp -R %S/Inputs/Bar.framework %t/outdir/
 //
-// RUN: sed -e "s at VDIR@%/t/vdir at g" -e "s at OUT_DIR@%/t/outdir at g" %S/Inputs/bar-headers.yaml > %t/vdir/bar-headers.yaml
+// RUN: sed -e "s at VDIR@%{/t:regex_replacement}/vdir at g" -e "s at OUT_DIR@%{/t:regex_replacement}/outdir at g" %S/Inputs/bar-headers.yaml > %t/vdir/bar-headers.yaml
 // RUN: rm -f %t/outdir/Bar.framework/Headers/B.h
 // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/cache -ivfsoverlay %t/vdir/bar-headers.yaml -F %t/vdir -fsyntax-only %s
 

diff  --git a/clang/test/VFS/vfsroot-include.c b/clang/test/VFS/vfsroot-include.c
index 2f3ff78bd6e9..2564004ea4b1 100644
--- a/clang/test/VFS/vfsroot-include.c
+++ b/clang/test/VFS/vfsroot-include.c
@@ -3,7 +3,7 @@
 
 // RUN: rm -rf %t
 // RUN: mkdir -p %t
-// RUN: sed -e "s at TEST_DIR@%/S at g" -e "s at OUT_DIR@%/t at g" %S/Inputs/vfsroot.yaml > %t.yaml
+// RUN: sed -e "s at TEST_DIR@%{/S:regex_replacement}@g" -e "s at OUT_DIR@%{/t:regex_replacement}@g" %S/Inputs/vfsroot.yaml > %t.yaml
 // RUN: not %clang_cc1 -Werror -ivfsoverlay %t.yaml -I %S/Inputs -I /direct-vfs-root-files -fsyntax-only /tests/vfsroot-include.c 2>&1 | FileCheck %s
 // The line above tests that the compiler input file is looked up through VFS.
 

diff  --git a/clang/test/VFS/vfsroot-module.m b/clang/test/VFS/vfsroot-module.m
index 979c5c281977..3ad3e19d4b37 100644
--- a/clang/test/VFS/vfsroot-module.m
+++ b/clang/test/VFS/vfsroot-module.m
@@ -3,7 +3,7 @@
 
 // RUN: rm -rf %t
 // RUN: mkdir -p %t
-// RUN: sed -e "s at TEST_DIR@%/S at g" -e "s at OUT_DIR@%/t at g" %S/Inputs/vfsroot.yaml > %t.yaml
+// RUN: sed -e "s at TEST_DIR@%{/S:regex_replacement}@g" -e "s at OUT_DIR@%{/t:regex_replacement}@g" %S/Inputs/vfsroot.yaml > %t.yaml
 // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fdisable-module-hash -fmodules-cache-path=%t/cache -ivfsoverlay %t.yaml -F %S/Inputs -fsyntax-only /tests/vfsroot-module.m
 
 // Test that a file missing from the VFS root is not found, even if it is

diff  --git a/clang/test/VFS/vfsroot-with-overlay.c b/clang/test/VFS/vfsroot-with-overlay.c
index 04a275ed1580..4a2c64cb8734 100644
--- a/clang/test/VFS/vfsroot-with-overlay.c
+++ b/clang/test/VFS/vfsroot-with-overlay.c
@@ -3,7 +3,7 @@
 
 // RUN: rm -rf %t
 // RUN: mkdir -p %t
-// RUN: sed -e "s at TEST_DIR@%/S at g" -e "s at OUT_DIR@%/t at g" %S/Inputs/vfsroot.yaml > %t.yaml
+// RUN: sed -e "s at TEST_DIR@%{/S:regex_replacement}@g" -e "s at OUT_DIR@%{/t:regex_replacement}@g" %S/Inputs/vfsroot.yaml > %t.yaml
 // RUN: sed -e "s at INPUT_DIR@/indirect-vfs-root-files at g" -e "s at OUT_DIR@/overlay-dir at g" %S/Inputs/vfsoverlay.yaml > %t/vfsoverlay.yaml
 // RUN: %clang_cc1 -Werror -ivfsoverlay %t.yaml -ivfsoverlay /direct-vfs-root-files/vfsoverlay.yaml -I /overlay-dir -fsyntax-only /tests/vfsroot-with-overlay.c
 

diff  --git a/llvm/utils/lit/lit/TestRunner.py b/llvm/utils/lit/lit/TestRunner.py
index 9f310a82d3b2..eec61f4b731c 100644
--- a/llvm/utils/lit/lit/TestRunner.py
+++ b/llvm/utils/lit/lit/TestRunner.py
@@ -1105,6 +1105,20 @@ def getDefaultSubstitutions(test, tmpDir, tmpBase, normalize_slashes=False):
             ('%/T', tmpDir.replace('\\', '/')),
             ])
 
+    # "%{/[STpst]:regex_replacement}" should be normalized like "%/[STpst]" but we're
+    # also in a regex replacement context of a s@@@ regex.
+    def regex_escape(s):
+        s = s.replace('@', '\@')
+        s = s.replace('&', '\&')
+        return s
+    substitutions.extend([
+            ('%{/s:regex_replacement}', regex_escape(sourcepath.replace('\\', '/'))),
+            ('%{/S:regex_replacement}', regex_escape(sourcedir.replace('\\', '/'))),
+            ('%{/p:regex_replacement}', regex_escape(sourcedir.replace('\\', '/'))),
+            ('%{/t:regex_replacement}', regex_escape(tmpBase.replace('\\', '/')) + '.tmp'),
+            ('%{/T:regex_replacement}', regex_escape(tmpDir.replace('\\', '/'))),
+            ])
+
     # "%:[STpst]" are normalized paths without colons and without a leading
     # slash.
     substitutions.extend([


        


More information about the cfe-commits mailing list