rsmith added inline comments.

================
Comment at: clang/include/clang/Basic/Attr.td:2367
+def PreferredName : InheritableAttr {
+  let Spellings = [Clang<"preferred_name">];
+  let Subjects = SubjectList<[ClassTmpl]>;
----------------
aaron.ballman wrote:
> This seems like one we should exempt from C code, WDYT? If you agree, you can 
> change it to `Clang<"preferred_name", /*AllowInC*/ 0>`
Done. For my information, what difference does this make? The `Subjects` list 
already means that it can't ever be applied in C -- does this effectively 
exclude it from `__has_c_attribute` (and maybe change the diagnostic on use), 
or does it go deeper than that?


================
Comment at: clang/include/clang/Basic/Attr.td:2369
+  let Subjects = SubjectList<[ClassTmpl]>;
+  let Args = [TypeArgument<"TypedefType">];
+  let Documentation = [PreferredNameDocs];
----------------
aaron.ballman wrote:
> Would it make sense for this to be a variadic parameter of type arguments 
> (with a constraint that at least one type be named)? This way you can write: 
> `[[clang::preferred_name(string, wstring)]]` instead of 
> `[[clang::preferred_name(string), clang::preferred_name(wstring)]]`
I did think a little bit about that, and I don't mind going in that direction. 
I have only very weak justifications for the current approach:

* I think we would want to allow the attribute to be repeated and accumulate 
regardless (see the `<iosfwd>` + `<string>` example for `std::basic_string` in 
libc++), and I would prefer to not have two different syntaxes for the same 
thing.
* The separate attributes give us some room for extensibility in the future, by 
adding new optional arguments, though I don't have a great example for such a 
possible extension.
* Implementation simplicity: when instantiating a template with 
`preferred_name(X)`, we either drop the attribute or retain it depending on 
whether the name is `X`, and if there were multiple names, we'd need to do 
something more sophisticated. (Also the trivial simplicity of only iterating 
over one list of types, rather than a list of lists.)
* I expect users of this attribute to be very rare (libc++, maybe a couple of 
types in Abseil, maybe a handful of types in boost, probably not much else), so 
optimizing for them may not be worth any added complexity, and I wouldn't 
expect any significant difference in parse time / memory usage / etc from the 
combined model versus the separate model.

On balance I weakly prefer the one-type-per-attribute model, but I'm happy to 
let you make the call.


================
Comment at: clang/include/clang/Basic/Attr.td:2372
+  let InheritEvenIfAlreadyPresent = 1;
+  let MeaningfulToClassTemplateDefinition = 1;
+  let TemplateDependent = 1;
----------------
Incidentally, this flag appears to be backwards? If set to `1`, we instantiate 
the attribute with the declaration; if set to `0` we instantiate only with the 
definition.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D91311/new/

https://reviews.llvm.org/D91311

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to