On 5/29/21 9:31 PM, Jeff Law wrote:
>
>
> On 5/28/2021 6:38 AM, Bernd Edlinger wrote:
>> Hi,
>>
>> it turns out to be reproducible this way:
>>
>> COLUMNS=80 make check-gcc-c RUNTESTFLAGS="plugin.exp=diagnostic*"
>>
>> Running /home/ed/gnu/gcc-trunk/gcc/testsuite/gcc.dg/plugin/plugin.exp ...
>> FAIL: gcc.dg/plugin/diagnostic-test-expressions-1.c
>> -fplugin=./diagnostic_plugin_test_tree_expression_range.so 1 blank
>> line(s) in output
>> FAIL: gcc.dg/plugin/diagnostic-test-expressions-1.c
>> -fplugin=./diagnostic_plugin_test_tree_expression_range.so expected
>> multiline pattern lines 550-551 not found: "
>> __builtin_types_compatible_p \(long, int\) \+ f \(i\)\);.*\n
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\^~~~~~~\n"
>> FAIL: gcc.dg/plugin/diagnostic-test-expressions-1.c
>> -fplugin=./diagnostic_plugin_test_tree_expression_range.so (test for
>> excess errors)
>>
>> a lot more errors happen with COLUMNS=20.
>>
>> Tested on x86_64-pc-linux-gnu.
>> Is it OK for trunk?
>>
>>
>> Thanks
>> Bernd.
>>
>>
>> 2021-05-28 Bernd Edlinger <bernd.edlin...@hotmail.de>
>>
>> * gcc.dg/plugin/diagnostic_plugin_show_trees.c (plugin_init): Fix
>> caret_max_with.
>> * gcc.dg/plugin/diagnostic_plugin_test_inlining.c
>> (plugin_init): Likewise.
>> * gcc.dg/plugin/diagnostic_plugin_test_paths.c (plugin_init): Likewise.
>> * gcc.dg/plugin/diagnostic_plugin_test_string_literals.c
>> (plugin_init): Likewise.
>> * gcc.dg/plugin/diagnostic_plugin_test_tree_expression_range.c
>> (plugin_init): Likewise.
> So while you've got a patch here, you haven't indicated what the problem
> actually was. I'm guessing caret_max_width was uninitialized and thus we got
> random-ish values. Presumably those randomish-values are what caused tests
> to occasionally appear to truncate their output and fail?
>
> If that's the case, this is fine. If it's something deeper, please provide a
> bit of background to help in evaluating the patch.
>
Yes, the problem is just the function get_terminal_width in diagnostic.c, can
somehow learn the X-terminal's window dimensions where the make check is
started:
int
get_terminal_width (void)
{
const char * s = getenv ("COLUMNS");
if (s != NULL) {
int n = atoi (s);
if (n > 0)
return n;
}
#ifdef TIOCGWINSZ
struct winsize w;
w.ws_col = 0;
if (ioctl (0, TIOCGWINSZ, &w) == 0 && w.ws_col > 0)
return w.ws_col;
#endif
return INT_MAX;
}
and this is used to initialize context->caret_max_width in
diagnostic_set_caret_max_width,
and possibly also other places. This causes a small variation in the output that
is trips the test cases. It is just an extra newline in some cases, that I
have not
debugged why exactly this happens, but I assume this is intentional to make the
diagnostics spanning multiple lines better readable to a human.
Thanks,
Bernd.
> Thanks,
> jeff
>