Hi! If we need to use thunks for ICF to functions with warning or error attribute, their expansion will warn or error. This patch just punts in those cases instead.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2018-03-02 Jakub Jelinek <ja...@redhat.com> PR ipa/84628 * ipa-icf.c (sem_function::merge): Don't create wrappers for functions with warning or error attributes. * gcc.dg/pr84628.c: New test. --- gcc/ipa-icf.c.jj 2018-01-04 12:37:25.365487352 +0100 +++ gcc/ipa-icf.c 2018-03-01 11:48:54.023107823 +0100 @@ -1213,6 +1213,15 @@ sem_function::merge (sem_item *alias_ite if (dump_file) fprintf (dump_file, "Wrappers are not created for noinline.\n"); } + /* Calls in the thunks would warn or error if we create a wrapper + for functions with warning or error attribute. */ + else if (lookup_attribute ("warning", DECL_ATTRIBUTES (original->decl)) + || lookup_attribute ("error", DECL_ATTRIBUTES (original->decl))) + { + if (dump_file) + fprintf (dump_file, "Wrappers are not created for error/warning " + "attribute.\n"); + } else create_wrapper = true; --- gcc/testsuite/gcc.dg/pr84628.c.jj 2018-03-01 11:30:39.121021498 +0100 +++ gcc/testsuite/gcc.dg/pr84628.c 2018-03-01 11:28:41.383127588 +0100 @@ -0,0 +1,8 @@ +/* PR ipa/84628 */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +int f0 (void); +__attribute__((error ("err"))) void f1 (void) { f0 (); f0 (); } +__attribute__((error ("err"))) void f2 (void) { f0 (); f0 (); } +/* { dg-bogus "declared with attribute error" "" { target *-*-* } 0 } */ Jakub