> Hmm.  So for
> 
> int baz;
> int foo()
> {
>   int i;
>   goto skip;
> done:
>   return i;
> skip:
>   i = 1;
>   if (baz)
>     return baz;
>   /* ... */
>   goto done;
> } /* (*) */
> 
> we'd assign (*) to the return?  It might be better to record
> (in struct function?) the location of any actually existing
> return location and use that?  In fact, similar kludgy would
> be to simply not clear the GIMPLE_RETURN location
> but kludge it up right away?

As I mentioned, this leads to various diagnostics regressions.

> Can you explain how diagnostics regress when doing that?

For example gcc.dg/uninit-17.c:

/* { dg-do compile } */
/* { dg-options "-O -Wuninitialized" } */

typedef _Complex float C;
C foo(int cond)
{
  C f;
  __imag__ f = 0;
  if (cond)
    {
      __real__ f = 1;
      return f;
    }
  return f;     /* { dg-warning "may be used" "unconditional" } */
}

The warning is not emitted on the expected line, but on the final } line.
There are a couple of other similar cases in the C and C++ testsuites.

> Does coverage somehow treat the function end locus specially
> so you chose that?  Will it show the alternate returns as
> covered at all?  I presume stuff like cross-jumping or
> GIMPLE tail-merging also wrecks coverage info in similar
> ways (well, not by injecting random locations but by
> not covering taken paths).

Simple things first please. :-)  The function's end locus is sort of a kitchen 
sink, you cannot have wrong coverage info when you use it, but only a possibly 
incomplete info.

-- 
Eric Botcazou

Reply via email to