[libcxx-commits] [PATCH] D91311: Add new 'preferred_name' attribute.

Aaron Ballman via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Thu Nov 12 05:46:12 PST 2020


aaron.ballman added a comment.

I really like this attribute, thank you for working on this!



================
Comment at: clang/include/clang/Basic/Attr.td:2367
+def PreferredName : InheritableAttr {
+  let Spellings = [Clang<"preferred_name">];
+  let Subjects = SubjectList<[ClassTmpl]>;
----------------
This seems like one we should exempt from C code, WDYT? If you agree, you can change it to `Clang<"preferred_name", /*AllowInC*/ 0>`


================
Comment at: clang/include/clang/Basic/Attr.td:2369
+  let Subjects = SubjectList<[ClassTmpl]>;
+  let Args = [TypeArgument<"TypedefType">];
+  let Documentation = [PreferredNameDocs];
----------------
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)]]`


================
Comment at: clang/include/clang/Basic/AttrDocs.td:4398
+
+The preferred name must be a typedef declaration that refers to a
+specialization of the class template. In general this requires the template to
----------------
May want to be clear that this includes alias declarations as well as typedefs (the example helps though). Also, you should mention that the typedef cannot include qualifiers.


================
Comment at: clang/lib/AST/TypePrinter.cpp:1353
+  // Print the preferred name if we have one for this type.
+  for (PreferredNameAttr *PNA :
+       T->getDecl()->specific_attrs<PreferredNameAttr>()) {
----------------
`const auto *`?


================
Comment at: clang/lib/Sema/SemaDeclAttr.cpp:1394
+
+  if (!T->getAs<TypedefType>() || T.hasQualifiers()) {
+    S.Diag(AL.getLoc(), diag::err_attribute_preferred_name_arg_invalid)
----------------
Given that this is checking properties of the type used in the attribute, I wonder if it makes sense to note the original declaration. I left a note on a test case below about this.


================
Comment at: clang/lib/Sema/SemaTemplateInstantiateDecl.cpp:557
+  // template.
+  if (auto *PNA = dyn_cast<PreferredNameAttr>(A)) {
+    QualType T = PNA->getTypedefType();
----------------
Can you fix these two lint warnings?


================
Comment at: clang/test/SemaTemplate/attributes.cpp:79
+  template<typename T> struct [[clang::preferred_name(const X)]] C; // expected-error {{argument 'const preferred_name::X'}}
+  template<typename T> struct [[clang::preferred_name(Z)]] C; // expected-error {{argument 'preferred_name::Z' (aka 'const C<double>')}}
+  template<typename T> struct C {};
----------------
This looks like a pretty reasonable declaration but only fails because of an issue with the declaration of `Z` -- should we point out more explicitly that the qualifier on the alias declaration is the issue?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D91311



More information about the libcxx-commits mailing list