On Fri, Jul 20, 2012 at 10:37:32AM +0200, Richard Guenther wrote: > On Thu, Jul 19, 2012 at 6:53 PM, Jakub Jelinek <ja...@redhat.com> wrote: > Hum. How hard would it be to merge the attributes?
IMHO hard and ugly. The thing is that you probably can do some hacks easily in handle_nonnull_attribute, so that multiple nonnull attributes on the same prototype get merged together (at the end of function when returning without *no_add_attrs = true; before it, do a = lookup_attribute ("nonnull", TYPE_ATTRIBUTES (type)); if (a != NULL) { merge stuff into a; *no_add_attrs = true; } ), but that handles just one of the cases, where multiple nonnull attributes appear on the same prototype. But you can (and with builtins.def usually do) have also void foo (void *, void *, void *) __attribute__((nonnull (1))); void foo (void *, void *, void *) __attribute__((nonnull (2))); and for that case no attribute hook is called, so either merge_attributes would need to special case this attribute (which would be a layering violation, as nonnull is just C/C++ attribute), or each FE would need in its merge_decls and similar call lookup_attribute ("nonnull", TYPE_ATTRIBUTES (...)); twice and do the merging manually. As there are just two users of the nonnull attribute, handling all of them there looked much shorter and easier to me. > > 2012-07-19 Jakub Jelinek <ja...@redhat.com> > > > > PR c++/28656 > > * tree-vrp.c (nonnull_arg_p): Handle all nonnull attributes instead > > of just the first one. > > > > * c-common.c (check_function_nonnull): Handle multiple nonnull > > attributes properly. > > > > * c-c++-common/pr28656.c: New test. Jakub