On Thu, Mar 8, 2018 at 1:01 PM, Jakub Jelinek <ja...@redhat.com> wrote: > The C FE just warns and doesn't override builtins, but C++ FE > on say int __builtin_trap (); will override the builtin, so later > builtin_decl_explicit will return the bogus user function which e.g. > doesn't have any merged attributes, can have different arguments or > return type etc. > > This patch prevents that; generally the builtins we want to override > are the DECL_ANTICIPATED which we handle properly earlier. > > The testcase in the PR ICEs not because of the argument mismatch (there is > none in this case) or return value mismatch (because nothing cares about the > return value), but because the new decl lacks noreturn attribute and GCC > relies on builtin_decl_explicit (BUILT_IN_TRAP) to be really noreturn. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? > Or shall we error on these, or ignore the name checks and just > if (DECL_BUILT_IN (olddecl)) return NULL_TREE;, something else?
Seems like returning NULL_TREE means that we overload the built-in, which also seems undesirable; what if we return olddecl unmodified? It would also be good to improve the diagnostic to say that we're ignoring the declaration. Perhaps as a permerror. Jason