[PATCH] D12375: [PATCH] Relax parse ordering rules for attributes
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 27 14:34:02 PDT 2015
rsmith added inline comments.
================
Comment at: lib/Parse/ParseDeclCXX.cpp:3923
@@ +3922,3 @@
+
+void Parser::MaybeParseAttributes(unsigned WhichAttrKinds,
+ ParsedAttributesWithRange &Attrs,
----------------
Please provide an inlineable wrapper for this that checks if the current token is `[`, `__declspec`, or `__attribute__` before calling into this, as we do for the existing `MaybeParse*` functions.
================
Comment at: lib/Parse/ParseDeclCXX.cpp:3942-3946
@@ +3941,7 @@
+ MoreToParse |= MaybeParseCXX11Attributes(Attrs, End);
+ // If C++11 attributes are not allowed because other attributes have
+ // already been parsed, we should diagnose if such an attribute was
+ // parsed.
+ if (MoreToParse && !CXX11AttrAllowed)
+ Diag(AttrStartLoc, diag::warn_attribute_ordering);
+ }
----------------
I'm not convinced this is right. It seems like there are two different cases:
1) Some context accepts a sequence of attributes before other things, such as:
struct __attribute__((blah)) [[blah]] S;
There doesn't seem to be a principled reason to reject this.
2) Different attributes appear as different components of the grammar, such as:
[[before_declaration]] __attribute__((im_a_decl_specifier)) int n;
__attribute__((im_a_decl_specifier)) [[i_dont_go_here]] int n;
Only the second case should be rejected here. (And I think we should provide an error not just a warning if we don't like this case.)
I think the right thing to do is probably to always parse all attribute syntaxes (except for MS attributes, which are ambiguous with other constructs), and give a nicely-worded error if we see an unexpected syntax.
================
Comment at: lib/Parse/ParseDeclCXX.cpp:3956-3959
@@ +3955,6 @@
+ }
+ if (WhichAttrKinds & PAKM_Microsoft) {
+ MoreToParse |= MaybeParseMicrosoftAttributes(Attrs, End);
+ CXX11AttrAllowed = false;
+ }
+ } while (MoreToParse);
----------------
This seems wrong: given `[[foo]] [[bar]]`, we'll now parse the second one as an MS attribute in a context where both are allowed.
http://reviews.llvm.org/D12375
More information about the cfe-commits
mailing list