[PATCH] D37436: Initial implementation of C attributes (WG14 N2137)
Richard Smith - zygoloid via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Sep 11 16:21:01 PDT 2017
rsmith added a comment.
If this is just supposed to be an experiment to get feedback on the feature, then I don't think we should be treating it as a different attribute syntax at all. Rather, I think we just want to permit C++11 attributes to be parsed in other language modes. If/when this becomes part of some future C working draft, I think that's the time to have a separate attribute syntax with a distinct set of valid unqualified attribute names.
================
Comment at: include/clang/Basic/LangOptions.def:140
+LANGOPT(CAttributes , 1, 0, "'[[]]' attributes extension to C")
+
----------------
Can we give this a more general name, then enable it under `CPlusPlus` too? That's what we do for other similar features.
================
Comment at: include/clang/Driver/Options.td:607
+def fc_attributes : Flag<["-"], "fc-attributes">, Group<f_Group>,
+ Flags<[DriverOption, CC1Option]>, HelpText<"Enable '[[]]' attributes in C">;
----------------
Hmm. On reflection, if we're going to have a flag to enable C++11 attributes in other language modes, it should probably work in C++98 mode too, so calling this `-fc-attributes` is probably not the best idea. `-fc++11-attributes` might make sense, though.
================
Comment at: lib/Parse/ParseDecl.cpp:4219
+
+ // Attributes are prohibited in this location in C2x (and forward
+ // declarations are prohibited in C++).
----------------
I don't think we can reasonably say what C2x will do. Also, doesn't this reject valid code such as:
```
struct __attribute__((deprecated)) Foo;
```
?
================
Comment at: lib/Parse/ParseDeclCXX.cpp:3939-3940
SourceLocation *endLoc) {
- if (Tok.is(tok::kw_alignas)) {
+ bool CXXAttr = getLangOpts().CPlusPlus11;
+ if (CXXAttr && Tok.is(tok::kw_alignas)) {
Diag(Tok.getLocation(), diag::warn_cxx98_compat_alignas);
----------------
This change is unnecessary. `kw_alignas` is not produced by the lexer in modes where we should not parse it.
================
Comment at: lib/Parse/ParseDeclCXX.cpp:3947
+ assert(Tok.is(tok::l_square) && NextToken().is(tok::l_square) &&
+ "Not a standards-based attribute list");
----------------
`[[`... in C is not a standards-based attribute list. I'd revert this change too.
================
Comment at: lib/Parse/ParseDeclCXX.cpp:3956
IdentifierInfo *CommonScopeName = nullptr;
- if (Tok.is(tok::kw_using)) {
+ if (CXXAttr && Tok.is(tok::kw_using)) {
Diag(Tok.getLocation(), getLangOpts().CPlusPlus1z
----------------
Likewise.
https://reviews.llvm.org/D37436
More information about the cfe-commits
mailing list