On Tue, 2016-02-23 at 09:26 +0100, Jakub Jelinek wrote: > On Tue, Feb 23, 2016 at 08:55:40AM +0100, Mark Wielaard wrote: > > On Mon, 2016-02-22 at 19:20 -0800, H.J. Lu wrote: > > > It caused: > > > > > > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69911 > > > > Apologies. Apparently main_input_filename can be NULL. I am not entirely > > sure when that happens. Or how I failed to see that test failure. I > > think I didn't have java enabled, causing libffi to be skipped. > > > > I am testing this patch that skips the test in that case: > > Are you sure that is the problem?
No :) I was still bootstrapping. I did see it didn't solve the issue but hadn't understood why yet... > I think it doesn't hurt to check for non-NULL main_input_filename, perhaps > some non-c-family languages might not set it, and this is in generic code, > but at least on the gcc.target/i386/iamcu/test_passing_structs.c testcase and > on one > randomly selected libffi testcase I see the ICE from completely different > reason - what is NULL is DECL_SOURCE_FILE (decl). Thanks, that makes more sense than my first hypothesis. > We are not really going to warn about this anyway, e.g. because > it is DECL_ARTIFICIAL, but that is checked only in a much later > condition. So, I think you should check also for NULL DECL_SOURCE_FILE > (and treat it as possibly in a header). Unfortunately > DECL_SOURCE_FILE involves a function call, so you might want to cache > it in some automatic variable. > && (warn_unused_const_variable == 2 > || (main_input_filename != NULL > && (decl_file = DECL_SOURCE_FILE (decl)) != NULL > && filename_cmp (main_input_filename, > decl_file) == 0)))) That looks right. Now testing: diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 49f6c25..e9e1aab 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-02-23 Mark Wielaard <m...@redhat.com> + Jakub Jelinek <ja...@redhat.com> + + PR c/69911 + * cgraphunit.c (check_global_declaration): Check main_input_filename + and DECL_SOURCE_FILE are not NULL. + 2016-02-20 Mark Wielaard <m...@redhat.com> PR c/28901 diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index 27a073a..8b3fddc 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -917,6 +917,7 @@ walk_polymorphic_call_targets (hash_set<void *> *reachable_call_targets, static void check_global_declaration (symtab_node *snode) { + const char *decl_file; tree decl = snode->decl; /* Warn about any function declared static but not defined. We don't @@ -944,8 +945,10 @@ check_global_declaration (symtab_node *snode) || (((warn_unused_variable && ! TREE_READONLY (decl)) || (warn_unused_const_variable > 0 && TREE_READONLY (decl) && (warn_unused_const_variable == 2 - || filename_cmp (main_input_filename, - DECL_SOURCE_FILE (decl)) == 0))) + || (main_input_filename != NULL + && (decl_file = DECL_SOURCE_FILE (decl)) != NULL + && filename_cmp (main_input_filename, + decl_file) == 0)))) && TREE_CODE (decl) == VAR_DECL)) && ! DECL_IN_SYSTEM_HEADER (decl) && ! snode->referred_to_p (/*include_self=*/false)