Hi! I've investigated some more.
On 2020-11-03T13:31:53+0100, I wrote: > Help. Save the attached file as 'gcc/testsuite/c-c++-common/goacc/l_.c', > and then run: > > $ make check-gcc-c++ RUNTESTFLAGS=--all\ goacc.exp=l_.c > > As expected for '-std=c++98' testing, which comes first: > > PASS: c-c++-common/goacc/l_.c -std=c++98 (test for errors, line 14) > PASS: c-c++-common/goacc/l_.c -std=c++98 (test for warnings, line 11) > PASS: c-c++-common/goacc/l_.c -std=c++98 (test for excess errors) > WARNING: dg-line var l1 defined, but not used > WARNING: dg-line var l2 defined, but not used > WARNING: dg-line var l3 defined, but not used > > But then it goes on with '-std=c++14', etc. testing: > > UNRESOLVED: c-c++-common/goacc/l_.c -std=c++14 (test for errors, line > 14) > PASS: c-c++-common/goacc/l_.c -std=c++14 (test for warnings, line 11) > PASS: c-c++-common/goacc/l_.c -std=c++14 (test for excess errors) > WARNING: dg-line var l1 defined, but not used > WARNING: dg-line var l2 defined, but not used > WARNING: dg-line var l3 defined, but not used > UNRESOLVED: c-c++-common/goacc/l_.c -std=c++17 (test for errors, line > 14) > PASS: c-c++-common/goacc/l_.c -std=c++17 (test for warnings, line 11) > PASS: c-c++-common/goacc/l_.c -std=c++17 (test for excess errors) > WARNING: dg-line var l1 defined, but not used > WARNING: dg-line var l2 defined, but not used > WARNING: dg-line var l3 defined, but not used > UNRESOLVED: c-c++-common/goacc/l_.c -std=c++2a (test for errors, line > 14) > PASS: c-c++-common/goacc/l_.c -std=c++2a (test for warnings, line 11) > PASS: c-c++-common/goacc/l_.c -std=c++2a (test for excess errors) > WARNING: dg-line var l1 defined, but not used > WARNING: dg-line var l2 defined, but not used > WARNING: dg-line var l3 defined, but not used > > === g++ Summary === > > # of expected passes 9 > # of unresolved testcases 3 > > Why is suddenly the "test for errors, line 14" an UNRESOLVED? (The > compiler diagnostics are as expected. This testcase doesn't depend on > '-std=[...]' at all.) > > And now the "funny" thing: if I disable any of the 'dg-line' directives, > it works as expected, all-PASS. But note that "test for errors, line 14" > doesn't even use a 'dg-line'-captured line number. (It uses absoute line > numbers. Same issue visible when using relative ones, or when actually > using 'dg-line' for these.) > > > I reduced this from a much bigger testcase, and had originally found this > not with 'check-gcc-c++' but with 'check-gcc-c': things worked fine as > long as testing just a single testcase, but broke when testing several. > (Again the symptom was that the first testcase worked fine, but the > following ones had an unexpecte UNRESOLVED for the first 'dg-error' (only > for the first!).) Supposedly, 'check-gcc-c++' with a single testcase but > testing several variants is exhibiting the same problem. The problem is indeed related to the "WARNING: dg-line var [...] defined, but not used" diagnostics. These are produced via DejaGnu 'warning' calls, which increments 'warncnt', and once that reaches 'warning_threshold' (default per '/usr/share/dejagnu/framework.exp' is: 'set warning_threshold 3'), this triggers UNRESOLVED via '/usr/share/dejagnu/framework.exp:record_test'. That this UNRESOLVED appears for the *next* testcase, must be considered some kind of bug (improper use of 'warning'?), I suppose. The following works around that: --- gcc/testsuite/lib/gcc-dg.exp +++ gcc/testsuite/lib/gcc-dg.exp @@ -1008,6 +1008,8 @@ if { [info procs saved-dg-test] == [list] } { } else { regsub {^saved_linenr_} $varname "" org_varname warning "dg-line var $org_varname defined, but not used" + global warncnt + incr warncnt -1 } } unset save_linenr_varnames ..., or: --- gcc/testsuite/lib/gcc-dg.exp +++ gcc/testsuite/lib/gcc-dg.exp @@ -1007,7 +1007,7 @@ if { [info procs saved-dg-test] == [list] } { eval unset $varname_used } else { regsub {^saved_linenr_} $varname "" org_varname - warning "dg-line var $org_varname defined, but not used" + verbose "WARNING: dg-line var $org_varname defined, but not used" 0 } } unset save_linenr_varnames ..., or hopefully something less hacky. The question is, what quality/severity should the "dg-line var [...] defined, but not used" diagnostic have? For example, "FAIL": --- gcc/testsuite/lib/gcc-dg.exp +++ gcc/testsuite/lib/gcc-dg.exp @@ -1007,7 +1007,7 @@ if { [info procs saved-dg-test] == [list] } { eval unset $varname_used } else { regsub {^saved_linenr_} $varname "" org_varname - warning "dg-line var $org_varname defined, but not used" + fail "dg-line var $org_varname defined, but not used" } } unset save_linenr_varnames PASS: c-c++-common/goacc/l_.c -std=c++98 (test for errors, line 14) PASS: c-c++-common/goacc/l_.c -std=c++98 (test for warnings, line 11) PASS: c-c++-common/goacc/l_.c -std=c++98 (test for excess errors) FAIL: dg-line var l1 defined, but not used FAIL: dg-line var l2 defined, but not used FAIL: dg-line var l3 defined, but not used PASS: c-c++-common/goacc/l_.c -std=c++14 (test for errors, line 14) [...] ..., or "NOTE": --- gcc/testsuite/lib/gcc-dg.exp +++ gcc/testsuite/lib/gcc-dg.exp @@ -1007,7 +1007,7 @@ if { [info procs saved-dg-test] == [list] } { eval unset $varname_used } else { regsub {^saved_linenr_} $varname "" org_varname - warning "dg-line var $org_varname defined, but not used" + note "dg-line var $org_varname defined, but not used" } } unset save_linenr_varnames Running [...]/gcc/testsuite/g++.dg/goacc/goacc.exp ... PASS: c-c++-common/goacc/l_.c -std=c++98 (test for errors, line 14) PASS: c-c++-common/goacc/l_.c -std=c++98 (test for warnings, line 11) PASS: c-c++-common/goacc/l_.c -std=c++98 (test for excess errors) NOTE: dg-line var l1 defined, but not used NOTE: dg-line var l2 defined, but not used NOTE: dg-line var l3 defined, but not used PASS: c-c++-common/goacc/l_.c -std=c++14 (test for errors, line 14) [...] ..., or something else? Grüße Thomas ----------------- Mentor Graphics (Deutschland) GmbH, Arnulfstraße 201, 80634 München / Germany Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Alexander Walter