On Fri, Mar 02, 2018 at 08:58:34AM +0100, Richard Biener wrote: > On Fri, 2 Mar 2018, Jakub Jelinek wrote: > > > 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? > > Looks ok but I wonder if marking the call in the thunk with no-warning > would work as well?
No, expr.c doesn't test anything like that (and adding it might regress other things, TREE_NO_WARNING is way too overloaded now). I was also considering an alternative to add something like: struct cgraph_node *node = cgraph_node::get (current_function_decl); and add && (!node || !node->thunk.thunk_p) to the two conditions for error/warning attribute: if (fndecl && (attr = lookup_attribute ("error", DECL_ATTRIBUTES (fndecl))) != NULL) error ("%Kcall to %qs declared with attribute error: %s", exp, identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 1)), TREE_STRING_POINTER (TREE_VALUE (TREE_VALUE (attr)))); if (fndecl && (attr = lookup_attribute ("warning", DECL_ATTRIBUTES (fndecl))) != NULL) warning_at (tree_nonartificial_location (exp), 0, "%Kcall to %qs declared with attribute warning: %s", exp, identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 1)), TREE_STRING_POINTER (TREE_VALUE (TREE_VALUE (attr)))); I've tried to come up with a testcase where generic thunks are used for C++, but failed to do something that would trigger an invalid warning or error. Would you prefer just being silent in all thunks? That said, wonder about thunks (the non-ICF ones) from false-negative diagnostic point as well, if I have some method with error/warning attribute and call a thunk instead, wonder if we get the diagnostic or not, thunks likely don't have the attribute copied over to them. Jakub