Currently when ASSERT_STREQ or ASSERT_STREQ_AT fail we print both strings to stderr. However it can be hard to figure out the problem (e.g. for 1-character differences in long strings).
Extend the output by writing out the strings to tempfiles and invoking "diff -up" on them when we have such a selftest failure, to (I hope) simplify debugging. Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu. OK for trunk? gcc/ChangeLog: * selftest.cc (selftest::print_diff): New function. (selftest::assert_streq): Call it when we have non-equal non-null strings. Signed-off-by: David Malcolm <dmalc...@redhat.com> --- gcc/selftest.cc | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/gcc/selftest.cc b/gcc/selftest.cc index 6438d86a6aa0..f58c0631908e 100644 --- a/gcc/selftest.cc +++ b/gcc/selftest.cc @@ -63,6 +63,26 @@ fail_formatted (const location &loc, const char *fmt, ...) abort (); } +/* Invoke "diff" to print the difference between VAL1 and VAL2 + on stdout. */ + +static void +print_diff (const location &loc, const char *val1, const char *val2) +{ + temp_source_file tmpfile1 (loc, ".txt", val1); + temp_source_file tmpfile2 (loc, ".txt", val2); + const char *args[] = {"diff", + "-up", + tmpfile1.get_filename (), + tmpfile2.get_filename (), + NULL}; + int exit_status = 0; + int err = 0; + pex_one (PEX_SEARCH | PEX_LAST, + args[0], CONST_CAST (char **, args), + NULL, NULL, NULL, &exit_status, &err); +} + /* Implementation detail of ASSERT_STREQ. Compare val1 and val2 with strcmp. They ought to be non-NULL; fail gracefully if either or both are NULL. */ @@ -89,8 +109,12 @@ assert_streq (const location &loc, if (strcmp (val1, val2) == 0) pass (loc, "ASSERT_STREQ"); else - fail_formatted (loc, "ASSERT_STREQ (%s, %s)\n val1=\"%s\"\n val2=\"%s\"\n", - desc_val1, desc_val2, val1, val2); + { + print_diff (loc, val1, val2); + fail_formatted + (loc, "ASSERT_STREQ (%s, %s)\n val1=\"%s\"\n val2=\"%s\"\n", + desc_val1, desc_val2, val1, val2); + } } } -- 2.26.3