ayzhao marked 4 inline comments as done.
ayzhao added inline comments.

================
Comment at: clang/lib/Parse/ParseDecl.cpp:5592
+bool Parser::isConstructorDeclarator(bool IsUnqualified, bool DeductionGuide,
+                                     bool IsFriend) {
   TentativeParsingAction TPA(*this);
----------------
aaron.ballman wrote:
> erichkeane wrote:
> > aaron.ballman wrote:
> > > erichkeane wrote:
> > > > aaron.ballman wrote:
> > > > > shafik wrote:
> > > > > > Instead of adding yet another `bool` flag maybe we can consider 
> > > > > > using something like `enum isFriend : bool {No, Yes}`.
> > > > > > 
> > > > > > I am sure @aaron.ballman will want to chime in here as well.
> > > > > Heh, so this is where I get worried about the scalability of using 
> > > > > enums for these. We really want to use three different enums here, 
> > > > > but do we really want to *add* three different enums? I'm unconvinced.
> > > > > 
> > > > > However, if we can come up with some template magic to allow for 
> > > > > named bool parameters as a generic interface, that would be valuable 
> > > > > to use.
> > > > I prefer enums over bools TBH, even if we end up with a million of then 
> > > > somewhere.
> > > > 
> > > > That said, what about:
> > > > 
> > > > https://godbolt.org/z/Kz6jdjobj
> > > > 
> > > > ```
> > > > template<typename SpecificThing>
> > > > class Is {
> > > >     Is(bool v) : value(v){}
> > > >   public:
> > > >   bool value;
> > > >   static const Is Yes() { return Is{true};}
> > > >   static const Is No() { return Is{false};}
> > > > 
> > > >   operator bool() { return value; }
> > > > };
> > > > 
> > > > class Friend{}; // #1
> > > >  
> > > > void foo(Is<Friend> f) {
> > > >     if (f) {
> > > >         ///...
> > > >     }
> > > > }
> > > > 
> > > > void baz() {
> > > >     foo(Is<Friend>::Yes());
> > > > }
> > > > ```
> > > > 
> > > > Adding a 'new' thing is as simple as just adding #1 for anything we 
> > > > care about.  We might want to put them in a namespace of some sort, but 
> > > > perhaps not awful?
> > > Yeah, this is along the lines of what I was thinking of! However, I'm 
> > > still concerned about that approach because it involves adding a new type 
> > > for every situation we have a bool. Empty classes to use as a tag 
> > > definitely works, but I was hoping we could use a string literal rather 
> > > than a tag type so that we don't have the extra compile time overhead of 
> > > adding hundreds of new empty classes. e.g.,
> > > ```
> > > void foo(Is<"Friend"> f) {
> > >   if (f) {
> > >      // ...
> > >   }
> > > }
> > > 
> > > void baz() {
> > >   foo(Is<"Friend">::Yes); // Yay
> > >   foo(Is<"Enemy">::Yes); // Error for type mismatch with Is<"Friend">
> > > }
> > > ```
> > > However, that might require compiling with C++20 (I don't recall), so it 
> > > may not be a viable idea.
> > Yeah, referring to stringliterals is troublesome in C++17.  However, we 
> > COULD do that like:
> > 
> > ```
> > void foo(Is<"Friend"_Is> f) {
> >   if (f) {
> >      // ...
> >   }
> > }
> > 
> > void baz() {
> >   foo(Is<"Friend"_Is>::Yes); // Yay
> >   foo(Is<"Enemy"_Is>::Yes); // Error for type mismatch with Is<"Friend">
> > }```
> > 
> > by making operator _Is return an integer_sequence.
> That's a really neat idea! If you want to work it up into something that 
> could be plausible to add to ADT, I think it's worth an RFC to add the 
> interface. I'm guessing the diagnostic behavior of that would be kind of 
> gross, but once we move to C++20 we'd be able to use string literal template 
> arguments directly and get better diagnostic behavior. The critical part is 
> that the code is readable and we get diagnostics when passing an argument to 
> the wrong parameter.
I added a `FriendSpecified` enum for now.

I'm going to mark the comment chain as done so that they don't unnecessarily 
block the review.

I agree with the idea of a generic type to represent boolean arguments, but I 
think it would be out of scope of this patch and that Discourse would be a more 
appropriate place to discuss this.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D53847

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

Reply via email to