This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: [RFC] missing return warnings
- From: "Manuel López-Ibáñez" <lopezibanez at gmail dot com>
- To: "Jan Hubicka" <jh at suse dot cz>
- Cc: gcc at gcc dot gnu dot org, mark at codesourcery dot com
- Date: Thu, 6 Sep 2007 11:03:05 +0100
- Subject: Re: [RFC] missing return warnings
- References: <20070906070107.GQ30523@kam.mff.cuni.cz>
On 06/09/07, Jan Hubicka <jh@suse.cz> wrote:
> I wonder what we want to do here - I guess we can either make the
> warning unconditional and declare it as two indpendent things or we can
> just drop the feature since user will get properly warned on every
> function he actually uses.
>
> What would be preferred solution here?
My preferred solution would be that TREE_NO_WARNING did actually
prevent to emit a duplicate warning.
tree-cfg.c (execute_warn_function_return)
------------------------------------------------------------------
/* If we see "return;" in some basic block, then we do reach the end
without returning a value. */
else if (warn_return_type
&& !TREE_NO_WARNING (cfun->decl)
&& EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0
&& !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (cfun->decl))))
{
FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
{
tree last = last_stmt (e->src);
if (TREE_CODE (last) == RETURN_EXPR
&& TREE_OPERAND (last, 0) == NULL
&& !TREE_NO_WARNING (last))
{
#ifdef USE_MAPPED_LOCATION
location = EXPR_LOCATION (last);
if (location == UNKNOWN_LOCATION)
location = cfun->function_end_locus;
warning (0, "%Hcontrol reaches end of non-void function", &location);
#else
locus = EXPR_LOCUS (last);
if (!locus)
locus = &cfun->function_end_locus;
warning (0, "%Hcontrol reaches end of non-void function", locus);
#endif
TREE_NO_WARNING (cfun->decl) = 1;
break;
}
}
}
Why is that not so? That would also prevent the whole loop from being
executed at all. Do cfun->decl and fndecl point to different things?
If that is difficult then not getting a warning about a function that
is not used does not seem so tragic as long as the middle-end warns
for every case that the front-end would warn (assuming the function is
used). The warning in the middle-end does not depend on optimization
being enabled, does it?
Cheers,
Manuel.