Dear Janis, I am having problems implementing your proposal.
The following testcase should fail with current mainline for every dg-bogus. It actually passes perfectly :-(. I have tried removing the dg-warning tests but then only the first dg-bogus fails, while the other dg-bogus pass. The results are also unexpected if you remove only one or two dg-warning. Any idea of what is going on ? Cheers, Manuel. /* { dg-do compile } */ /* { dg-options "-std=c99 -Woverflow" } */ #include <limits.h> /* Test for duplicated warnings. */ int g (void) { return - - - - -INT_MIN; /* { dg-warning "warning: integer overflow in expression" } */ /* { dg-bogus "integer overflow in expression.*integer overflow in expression" "duplicate" { target *-*-* } 10 } */ } int g1 (void) { return 2 - (0 * (INT_MAX + 1)); /* { dg-warning "warning: integer overflow in expression" } */ /* { dg-bogus "integer overflow in expression.*integer overflow in expression" "duplicate" { target *-*-* } 17 } */ } int g2 (void) { return ((INT_MAX + 1) * 0) - 2; /* { dg-warning "warning: integer overflow in expression" } */ /* { dg-bogus "integer overflow in expression.*integer overflow in expression" "duplicate" { target *-*-* } 24 } */ } On 01/12/06, Janis Johnson <[EMAIL PROTECTED]> wrote:
On Thu, Nov 30, 2006 at 07:25:47PM +0000, Manuel López-Ibáñez wrote: > Hi, > > PR19978 reports that some overflow warnings are emitted multiple > times. Like for example, > > test.c:6: warning: integer overflow in expression > test.c:6: warning: integer overflow in expression > test.c:6: warning: integer overflow in expression > > The current testsuite will match any number of those to a single { > dg-warning }. I don't know whether this is a known limitation, a bug > on the testsuite or it just needs some magic. As discussed on IRC, processing of dg-warning and dg-error is done in code that's part of the DejaGnu project, and it matches all regular expressions on the line. > How could I test that exactly one warning was emitted? Here's a way to treat duplicate messages as errors; the first test case fails because it has duplicate messages, the second passes. Janis /* { dg-do compile } */ #include <limits.h> int f (void) { return INT_MAX + 1 - INT_MAX; /* { dg-bogus "integer overflow in expression.*integer overflow in expression" "duplicate" } */ } /* { dg-do compile } */ #include <limits.h> int f (void) { ; /* { dg-bogus "control reaches end.*control reaches end" "duplicate" } */ }