Quuxplusone marked 3 inline comments as done.
Quuxplusone added inline comments.


================
Comment at: clang/lib/Sema/SemaStmt.cpp:3095
 
-  // ...non-volatile...
-  if (VD->getType().isVolatileQualified())
-    return false;
-
-  // C++20 [class.copy.elision]p3:
-  // ...rvalue reference to a non-volatile...
-  if (VD->getType()->isRValueReferenceType() &&
-      (!(CESK & CES_AllowRValueReferenceType) ||
-       VD->getType().getNonReferenceType().isVolatileQualified()))
+  if (VD->getType()->isObjectType()) {
+    // C++17 [class.copy.elision]p3:
----------------
mizvekov wrote:
> aaronpuchert wrote:
> > mizvekov wrote:
> > > Quuxplusone wrote:
> > > > mizvekov wrote:
> > > > > mizvekov wrote:
> > > > > > mizvekov wrote:
> > > > > > > A drive by fix here would be that we already have a VDType in 
> > > > > > > this context, might as well use it even though original for some 
> > > > > > > reason missed it in this part.
> > > > > > This whole block is also logically equivalent to the much simpler:
> > > > > > ```
> > > > > > if (VDType.isReferenceType()) {
> > > > > >     if (!(CESK & CES_AllowRValueReferenceType) || 
> > > > > > !VDType.isRValueReferenceType())
> > > > > >       return false;
> > > > > >     VDType = VDType.getNonReferenceType()
> > > > > > }
> > > > > > if (!VDType.isObjectType() || VDType.isVolatileQualified()) 
> > > > > >   return false;
> > > > > > ```
> > > > > > But you do have to adjust the comments there and adjust the rest to 
> > > > > > use VDType consistently :)
> > > > > > Also, I think it might be possible to even remove the 
> > > > > > `!VDType.isObjectType() || ` part from my suggestion above, because 
> > > > > > it might be the only option left if it is not a reference anyway.
> > > > > ```
> > > > >   bool isObjectType() const {
> > > > >     // C++ [basic.types]p8:
> > > > >     //   An object type is a (possibly cv-qualified) type that is not 
> > > > > a
> > > > >     //   function type, not a reference type, and not a void type.
> > > > >     return !isReferenceType() && !isFunctionType() && !isVoidType();
> > > > >   }
> > > > > ```
> > > > > So yeah I think you can just make my suggestion be:
> > > > > ```
> > > > > if (VDType.isReferenceType()) {
> > > > >     if (!(CESK & CES_AllowRValueReferenceType) || 
> > > > > !VDType.isRValueReferenceType())
> > > > >       return false;
> > > > >     VDType = VDType.getNonReferenceType()
> > > > > }
> > > > > if (VDType.isVolatileQualified()) 
> > > > >   return false;
> > > > > ```
> > > > > 
> > > > > 
> > > > Yeah but I //reaally// don't want to
> > > > (1) change the meaning of `VDType` in the middle of this function 
> > > > (mantra: "one name = one meaning")
> > > > (2) get "clever". I don't want to have to think about "Are there any 
> > > > types that are neither object types nor reference types?" (What about 
> > > > function types? What about block types? What about, I dunno, 
> > > > bit-fields?) I want the code to be //obviously correct//, and also to 
> > > > casewise match exactly what the standard says. It says object or rvalue 
> > > > reference type — let's write code that expresses that wording 
> > > > //exactly//.
> > > How about:
> > > ```
> > > QualType VDObjType = VDType;
> > > if (!VDType.isObjectType()) {
> > >     if (!(CESK & CES_AllowRValueReferenceType) || 
> > > !VDType.isRValueReferenceType())
> > >       return false;
> > >     VDObjType = VDType.getNonReferenceType();
> > > }
> > > if (VDObjType .isVolatileQualified()) 
> > >   return false;
> > > ```
> > > And then `s/VDType/VDObjType/` from here on.
> > > I think this expresses the meaning of the standard clearly.
> > That seems like a sensible simplification, the proposed code is indeed a 
> > bit repetitive. I'd go with the original suggestion plus the new variable:
> > 
> > ```
> > QualType VDNonRefType = VDType;
> > if (VDType.isReferenceType()) {
> >     if (!(CESK & CES_AllowRValueReferenceType) || 
> > !VDType.isRValueReferenceType())
> >       return false;
> >     VDNonRefType = VDType.getNonReferenceType()
> > }
> > if (!VDNonRefType.isObjectType() || VDNonRefType.isVolatileQualified()) 
> >   return false;
> > ```
> > 
> > or whatever name you find appropriate. Actually it's the type of the 
> > `DeclRefExpr`, isn't it? So maybe `DREType`?
> > 
> > The initialization might be a bit misleading, an alternative would be to 
> > not initialize and have an assignment `VDNonRefType = VDType` in the else 
> > branch instead.
> @aaronpuchert Yeah that combination is good to me also, and I liked the name 
> you suggested better. So +1 :)
> Actually it's the type of the `DeclRefExpr`, isn't it? So maybe `DREType`?

The fact that we don't know what it is gives me pause, re introducing it. ;) If 
I were going to introduce a local synonym for `VDType.getNonReferenceType()` on 
lines 3105-3108, I guess `VDReferencedType` would be the best name for it; but 
I don't think there's any reason to introduce another name here.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D98971

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

Reply via email to