diff --git a/llvm/test/Other/lit-quoting.txt b/llvm/test/Other/lit-quoting.txt --- a/llvm/test/Other/lit-quoting.txt +++ b/llvm/test/Other/lit-quoting.txt @@ -1,2 +1,20 @@ -RUN: echo "\"" | FileCheck %s -CHECK: {{^"$}} +RUN: echo "\"" | FileCheck %s --check-prefix=CHECK1 +RUN: echo '"' | FileCheck %s --check-prefix=CHECK1 +RUN: echo 'a[b\c' | FileCheck %s --check-prefix=CHECK2 +RUN: echo "a[b\\c" | FileCheck %s --check-prefix=CHECK2 +RUN: echo 'a\b\\c\\\\d' | FileCheck %s --check-prefix=CHECK3 +RUN: echo "a\\b\\\\c\\\\\\\\d" | FileCheck %s --check-prefix=CHECK3 +RUN: not not echo "\"" | FileCheck %s --check-prefix=CHECK1 +RUN: not not echo '"' | FileCheck %s --check-prefix=CHECK1 +RUN: not not echo 'a[b\c' | FileCheck %s --check-prefix=CHECK2 +RUN: not not echo "a[b\\c" | FileCheck %s --check-prefix=CHECK2 +RUN: not not echo 'a\b\\c\\\\d' | FileCheck %s --check-prefix=CHECK3 +RUN: not not echo "a\\b\\\\c\\\\\\\\d" | FileCheck %s --check-prefix=CHECK3 +CHECK1: {{^"$}} +CHECK2: {{^a\[b\\c$}} +CHECK3: {{^a\\b\\\\c\\\\\\\\d$}} + +On Windows, with MSYS based tools, the following commands fail though: +echo 'a[b\c\\d' | FileCheck %s --check-prefix=CHECK4 +echo "a[b\\c\\\\d" | FileCheck %s --check-prefix=CHECK4 +CHECK4: {{^a\[b\\c\\\\d$}} diff --git a/llvm/utils/lit/lit/TestRunner.py b/llvm/utils/lit/lit/TestRunner.py --- a/llvm/utils/lit/lit/TestRunner.py +++ b/llvm/utils/lit/lit/TestRunner.py @@ -191,7 +191,13 @@ We use the same algorithm from MSDN as CPython (http://msdn.microsoft.com/en-us/library/17w5ykft.aspx), but we treat more - characters as needing quoting, such as double quotes themselves. + characters as needing quoting, such as double quotes themselves, and square + brackets. + + For MSys based tools, this is very brittle though, because quoting an + argument makes the MSys based tool unescape backslashes where it shouldn't + (e.g. "a\b\\c\\\\d" becomes "a\b\c\\d" where it should stay as it was, + according to regular win32 command line parsing rules). """ result = [] needquote = False @@ -203,7 +209,7 @@ result.append(' ') # This logic differs from upstream list2cmdline. - needquote = (" " in arg) or ("\t" in arg) or ("\"" in arg) or not arg + needquote = (" " in arg) or ("\t" in arg) or ("\"" in arg) or ("[" in arg) or not arg if needquote: result.append('"')