Quuxplusone added a comment.

I'd like to see some indication in the code comments, in the commit message, 
and/or in cxx_status.html, explaining //what// parts of P1825 
<https://reviews.llvm.org/P1825> are implemented and what parts remain 
unimplemented after this patch. (My ideal would be to hold this patch up until 
it completely implements P1825 <https://reviews.llvm.org/P1825>. That way we 
minimize the number of minor divergences in implementation quality that people 
will have to memorize: Clang 10 does X, Clang 11 does Y, Clang 12 does Z... 
let's just jump straight from X to Z if at all humanly possible.)



================
Comment at: clang/lib/Sema/SemaStmt.cpp:3061
+  if (VD->getType().isVolatileQualified())
+    return false;
+
----------------
This looks like a severable bugfix, right? Clang's current behavior diverges 
from GCC's, when the named return variable is volatile-qualified. 
https://godbolt.org/z/5EfK99
Personally I think this should be a separate bugfix patch, with regression 
test, fast-tracked separately from any of the C++20 stuff.


================
Comment at: clang/lib/Sema/SemaStmt.cpp:3085
 ///
-/// This routine implements C++14 [class.copy]p32, which attempts to treat
-/// returned lvalues as rvalues in certain cases (to prefer move construction),
-/// then falls back to treating them as lvalues if that failed.
+/// This routine implements C++20 [class.copy.elision]p3:, which attempts to
+/// treat returned lvalues as rvalues in certain cases (to prefer move
----------------
You changed "p32" to "p3:" — I think you meant "p3" without the colon.


================
Comment at: clang/lib/Sema/SemaStmt.cpp:3190
+///           not need to be an rvalue reference to the returned object's type.
+///   C++20
+
----------------
FWIW, I really like the idea of this table, but I don't know how to read it in 
this format. Are the papers/issues listed //below// the relevant standard, or 
//above// it?

My understanding is that CWG1579 is a defect report against C++11 (so, 
`-std=c++11` mode //includes// the new behavior added in CWG1579), but for 
example `-std=c++17` mode definitely does not include the new behavior for 
rvalue references added in P1825.

Could you change e.g. "C++11" to "-std=c++11 mode includes the following 
patches:", for clarity?


================
Comment at: clang/lib/Sema/SemaStmt.cpp:3210
 
+    bool AffectedByCWG1579 = false;
     if (!NRVOCandidate) {
----------------
For the record, I am the person who added the diagnostic controlled by 
`AffectedByCWG1579`, and my opinion is that if removing that diagnostic would 
simplify the code, you should consider it. We should certainly remove it from 
Clang at //some// point — this year? next year? 2025? but it should 
//eventually// be removed.


================
Comment at: clang/lib/Sema/SemaStmt.cpp:3291
   // (again) now with the return value expression as written.
+  // TODO: C++20 considering the expression or operand as an lvalue
   if (Res.isInvalid())
----------------
FWIW, I don't understand this TODO comment. What's to do, here?


================
Comment at: clang/test/SemaCXX/implicit-move.cpp:21
+  NoNeedRvalueRef(const NoNeedRvalueRef &);
+  NoNeedRvalueRef(NoNeedRvalueRef &&);
+  NoNeedRvalueRef(Error);
----------------
if I understand correctly, you can (and should) remove the copy and move 
constructors from `NeedRvalueRef` and `NoNeedRvalueRef`.
Also, I strongly recommend renaming `NoNeedRvalueRef` to `NeedValue` (or 
something along those lines) — it's not that it doesn't need an rvalue ref, 
it's that it //does// need a //non//-ref.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D88220

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

Reply via email to