This patch series improves the attribute checking infrastructure to make it easy to express mutual exclusivity between attributes, detect and drop conflicting attributes as they are being added to declarations, and help find sources of conflicts when they involve two distinct declarations of the same symbols.
The details are below. Thanks Martin The existing attribute handling infrastructure doesn't make it possible for an attribute handler to diagnose conflicts between attributes specified on distinct declarations of the same function or object. As a result, the handlers that make an effort to detect conflicts only diagnose them when they occur on the same declaration. Such conflicts are easy to spot during code review and so the diagnostics are of only marginal help. The hard-to-spot conflicts are those that are between attributes on distinct declarations, and those for the most part aren't detected. Marek made a nice improvement in this area last year in r236129 by detecting a small subset of these problems in c-common.c (now in c-warn.c). The diagnose_mismatched_attributes function detects conflicts between attribute always_inline and noinline. However, the function issues warnings only after the conflicting attributes have been applied to the declaration without removing any, so code that then makes use of the attributes and isn't prepared to deal with the conflict may work in surprising ways. To help solve the problem the patch adds to each attribute an optional array of "exclusions" or names of other attributes that a given attribute is mutually exclusive with. It then modifies the decl_attributes function to traverse the array and diagnose (and drop) each attribute on a newly seen declaration that is in conflict with an attribute already applied to it. When a conflict involves two declarations of the same symbols decl_attributes also points to the last known declarations to help find the source of the conflict. The patch only adds exclusions to the C and C++ front ends, but other than initializing the new exclusion pointer to NULL doesn't take advantage of this new feature in the back ends. I'd like to go and add exclusions to a small number of back ends as examples for maintainers to follow after this patch has been reviewed and approved. My hope is that the exclusions array will serve as a reminder to consider potential conflicts when new attributes are being added, and provide an easier mechanism to reject them than having to handcode it in each new handler.