<div dir="ltr"><div dir="ltr">Various tests in `clang/test/Analysis/` invoke `diff` with a non-portable `-I` option. I do not believe that a requirement for a `diff` utility that supports such an extension is intended by the community. I believe that replacing `diff -I` with `diff` on files that have been normalized using `grep -v` is a reasonable solution. A minor detail is that the output being checked is produced without a newline at the end of the file. As part of the proposed solution, the file is rehabilitated as a text file (as required by `grep`) by adding such a newline. The same is done for the reference expected files that are missing a newline at the end of the file. The solution is sketched out below for feedback.<br></div><div dir="ltr"><br></div><div dir="ltr">The normalization is in many cases encoded in a lit substitution `%diff_plist`. A sample application of the proposed change would look like the following. See further below for additional rationale on the particulars.<br><br>Replace the RUN line:<br><font size="2"><span style="font-family:monospace,monospace">-// RUN: cat %t.plist | %diff_plist %S/Inputs/expected-plists/</span></font><font size="2"><span style="font-family:monospace,monospace">unix-fns.c.plist -<br>+// RUN: %normalize_plist <%S/Inputs/expected-plists/</span></font><font size="2"><span style="font-family:monospace,monospace">unix-fns.c.plist >%t.expected.sed.plist && echo >>%t.plist && %normalize_plist <%t.plist | diff -u %t.expected.sed.plist -</span></font><br><br>Replace the lit substitution:<br><span style="font-family:monospace,monospace">-# Diff command used by Clang Analyzer tests (when comparing .plist files<br>+# Filtering command used by Clang Analyzer tests (when comparing .plist files<br> # with reference output)<br>-config.substitutions.append((</span><span style="font-family:monospace,monospace">'%diff_plist',<br>- 'diff -u -w -I "<string>/" -I "<string>.:" -I "version"'))<br>+config.substitutions.append((</span><span style="font-family:monospace,monospace">'%normalize_plist',<br>+ "grep -Ev '%s|%s|%s'" %<br>+ ('^[[:space:]]*<string>.* version .*</string>$',<br>+ '^[[:space:]]*<string>/.*</</span><span style="font-family:monospace,monospace">string>$',<br>+ '^[[:space:]]*<string>.:.*</</span><span style="font-family:monospace,monospace">string>$')))</span><br><br>Why not use more `RUN` lines?<br>The output being checked is line-number sensitive. Keeping the same number of `RUN` lines minimizes unnecessary noise and risk of errors.<br><br>Why not use `sed`?<br>`sed` can be used to normalize the lines that are expected to vary; however, the some of the expected-output files have these lines omitted.<br>The `grep` replacement is more compatible
with the behaviour of `diff -I`. The filtered files are nevertheless named with "sed" for the connotation that substitution took place.<br><br>Why remove `-w` from `diff`?<br>It appears that the `-w` option was being used for its effect (in some implementations) of ignoring the difference between a file that ends with a newline and one which does not. Following normalization of both files to end in a newline, this is no longer necessary. Since the effect is non-portable, keeping the option (and thus allowing the non-portable effect to occur, and perhaps become relied upon during development) is potentially harmful.<br><br>Why not add the newline via `cat`?<br>The newline can be added (in this context) using `echo | cat file -` as opposed to using `echo >>file`; however, the `lit` implementation of `cat` does not operate as expected on the standard input.<br></div></div>