On 06/09/07, Jan Hubicka <[EMAIL PROTECTED]> 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.