aaron.ballman added inline comments.

================
Comment at: libcxx/include/regex:2520
+    _LIBCPP_PREFERRED_NAME(wregex)
+    basic_regex
 {
----------------
rsmith wrote:
> Quuxplusone wrote:
> > Why does this attribute go on the class template? Shouldn't it be an 
> > attribute on the typedef, so that you don't have to repeat yourself? I 
> > mean, I'd much rather see
> > 
> >     template<class T> class BasicFoo { };
> >     using [[preferred]] Foo = BasicFoo<A>;
> >     using [[preferred]] WFoo = BasicFoo<B>;
> > 
> > than
> > 
> >     template<class> class BasicFoo;
> >     using Foo = BasicFoo<A>;
> >     using WFoo = BasicFoo<B>;
> >     template<class T> class [[preferred(Foo, WFoo)]] BasicFoo { };
> > 
> > The latter repeats every identifier one extra time, compared to the former.
> > 
> > And then, in fact, couldn't you go one step further and say that typedefs 
> > in the same scope as the class template itself should //always// implicitly 
> > have this attribute? Even if the attribute doesn't appear in the source 
> > code, we still want to print `basic_regex<char>` as `regex`, right? It 
> > shouldn't cost any additional work for the compiler to figure that out.
> I don't think we want arbitrary typedefs to be able to declare themselves to 
> be names for the class template after the fact: this is a decision that the 
> (author of the) template itself should be making, not a decision for the 
> (author of the) typedef. Also, we need the information when looking at the 
> class template, not when looking at the typedef, so attaching it to the 
> typedef would require us to internally attach it to the class template 
> instead anyway, and generally it's undesirable and problematic to mutate an 
> existing declaration -- it's much cleaner to introduce new properties of a 
> declaration by redeclaring it. It's certainly not ideal that this results in 
> extra forward declarations in some cases, but given that this attribute is 
> only expected to be written a few dozen times in total, it doesn't seem worth 
> worrying about too much.
> 
> I don't think we want typedefs to automatically get this behavior, even if 
> they're in the same namespace. I think it would be problematic if, for 
> example:
> 
> ```
> namespace absl {
>   template<typename T> struct basic_string_view;
>   using format_arg = basic_string_view<char>;
>   std::string format(format_arg, ...);
> }
> ```
> 
> ... resulted in `absl::string_view` sometimes displaying as the (to a user) 
> unrelated type `absl::format_arg` depending on (presumably) `#include` order, 
> and I don't think we want to be in the business of inventing heuristics to 
> pick the "right" typedef.
> I don't think we want arbitrary typedefs to be able to declare themselves to 
> be names for the class template after the fact: this is a decision that the 
> (author of the) template itself should be making, not a decision for the 
> (author of the) typedef. 

+1




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