------- Comment #2 from manu at gcc dot gnu dot org 2009-07-06 13:19 ------- The root cause is a combination of inline and copy-rename. Copy rename has the following code:
/* Never attempt to coalesce 2 user variables unless one is an inline variable. */ if (!ign1 && !ign2) { if (DECL_FROM_INLINE (root2)) ign2 = true; else if (DECL_FROM_INLINE (root1)) ign1 = true; else { if (debug) fprintf (debug, " : 2 different USER vars. No coalesce.\n"); return false; } } /* If both values have default defs, we can't coalesce. If only one has a tag, make sure that variable is the new root partition. */ if (gimple_default_def (cfun, root1)) { if (gimple_default_def (cfun, root2)) { if (debug) fprintf (debug, " : 2 default defs. No coalesce.\n"); return false; } else { ign2 = true; ign1 = false; } } else if (gimple_default_def (cfun, root2)) { ign1 = true; ign2 = false; } The net result is that when it combines sockt_rd with s42, it favours s42. This is the reason it prints s42. However, the location printed corresponds to the statement: if (sockt_rd < 0) return -1; Then, warn_uninit is not able to detect that this comes from some inlined thing. If we do this: - location = (context != NULL && gimple_has_location (context)) + location = (!DECL_FROM_INLINE (var) && context != NULL + && gimple_has_location (context)) ? gimple_location (context) - : DECL_SOURCE_LOCATION (var); + : DECL_SOURCE_LOCATION (DECL_ORIGIN (var)); Then we get the right location (line, column) but still the wrong function. I am not sure how to force the diagnostics machinery to display the correct function. -- manu at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |manu at gcc dot gnu dot org Status|UNCONFIRMED |NEW Ever Confirmed|0 |1 Last reconfirmed|0000-00-00 00:00:00 |2009-07-06 13:19:06 date| | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40635