aaronpuchert added inline comments.

================
Comment at: clang/lib/Sema/SemaStmt.cpp:3066
 
-  if (isCopyElisionCandidate(ReturnType, VD, CESK))
-    return VD;
-  return nullptr;
+static void downgradeNRVOResult(Sema::NRVOResult &Res, bool CanMove) {
+  Res.S = std::min(Res.S, CanMove ? Sema::NRVOResult::MoveEligible
----------------
Quuxplusone wrote:
> mizvekov wrote:
> > aaronpuchert wrote:
> > > mizvekov wrote:
> > > > mizvekov wrote:
> > > > > Quuxplusone wrote:
> > > > > > mizvekov wrote:
> > > > > > > rsmith wrote:
> > > > > > > > I find this name a little unclear (what do we mean by 
> > > > > > > > "downgrade"?). Can we call this something a bit more specific, 
> > > > > > > > such as `disallowCopyElision` or `disallowNRVO`?
> > > > > > > How about `demoteNRVOStatus`?
> > > > > > I'm with Richard here: if you mean "disallow copy elision," say so!
> > > > > > IMO this should be member functions of `NamedReturnInfo`, and it 
> > > > > > should just be
> > > > > > 
> > > > > >     void disallowCopyElision() {
> > > > > >         S &= ~CopyElidable;  // obviously this "should" work;
> > > > > >     }                    // ensure that your enum values actually 
> > > > > > make it work
> > > > > > 
> > > > > >     void disallowImplicitMove() {
> > > > > >         S = None;
> > > > > >     }
> > > > > > 
> > > > > > The way you use it below is equivalent to e.g.
> > > > > > 
> > > > > >   if (VD->isExceptionVariable()) {
> > > > > >     Info.disallowCopyElision();
> > > > > >     if (!hasCXX20)
> > > > > >       Info.disallowImplicitMove();
> > > > > >   }
> > > > > > 
> > > > > > which I think is a lot easier to puzzle out what's going on and how 
> > > > > > it corresponds to the standardese.
> > > > > @Quuxplusone But I did not mean "disallow copy elision", the function 
> > > > > will also disallow implicit move based on a parameter, so would be a 
> > > > > bit misleading.
> > > > > 
> > > > > That solution you proposed though is more repetitive and prone to 
> > > > > error: it does not enforce the invariant that you should always 
> > > > > disallow copy elision when disallowing implicit move.
> > > > > Even if you amend that to having one manipulator function which 
> > > > > enforces the invariant, you still have two bools totaling four 
> > > > > states, where only three states make sense.
> > > > > 
> > > > > I would consider a better name though, not necessarily happy with 
> > > > > this one either.
> > > > Also I did consider making this a method, but this function is more of 
> > > > an implementation detail that is better to hide anyway.
> > > You can have more aptly named functions without dropping the invariant. 
> > > I'd say you only need `disallowCopyElision` though, instead of 
> > > `disallowImplicitMove` you could just directly overwrite with `None`.
> > But the dominant use case here is wanting to choose either one based on the 
> > language mode. So the signature taking a bool is more convenient.
> Just to be clear, I don't see the use-case anywhere as wanting to "choose" 
> anything based on a parameter. As my code indicated, I see the logic here as 
> being simply "For exception variables [or whatever], disallow copy elision. 
> _Additionally_, pre-'20, disallow even implicit move for them." And so on. No 
> functions of boolean parameters, just straightforward English if-thens, based 
> on the English in the standard.
> I get that you're probably not going to write the straightforward code in the 
> end; but I just wanted to push a tiny bit harder to see if anyone else sees 
> what I see. :)
> 
Your argument makes sense to me, but the function is called 5 times with a 
runtime parameter, so it's going to be quite a bit more code.

> just straightforward English if-thens, based on the English in the standard.

Technically aren't we handling different standards at once here? So there is 
actually no language in any standard that contains these particular if-thens.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D99696

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

Reply via email to