aaron.ballman added a subscriber: Endill.
aaron.ballman added inline comments.


================
Comment at: clang/lib/Sema/SemaInit.cpp:4263-4264
+      // CWG2311: T{ prvalue_of_type_T } is not eligible for copy elision
+      // Make this an elision if this won't call an initializer-list 
constructor
+      // (Always on an aggregate type or check constructors first)
+      CopyElisionPossible = true;
----------------



================
Comment at: clang/lib/Sema/SemaInit.cpp:4334
+      case OR_No_Viable_Function: // Possible if you try to initialize from a
+                                  // volatile prvalue
+      case OR_Ambiguous:
----------------



================
Comment at: clang/lib/Sema/SemaInit.cpp:4337
+        // This was never going to be an initializer-list constructor
+        // so it should be elided
+        ElideConstructor();
----------------



================
Comment at: clang/lib/Sema/SemaInit.cpp:4342
+        // If this deleted constructor was not an initializer-list constructor
+        // we should elide it
+        if (!S.isInitListConstructor(Best->Function)) {
----------------



================
Comment at: clang/lib/Sema/SemaInit.cpp:4249-4250
           InitializedEntity::EK_LambdaToBlockConversionBlockElement &&
-      UnwrappedArgs.size() == 1 && UnwrappedArgs[0]->isPRValue() &&
-      S.Context.hasSameUnqualifiedType(UnwrappedArgs[0]->getType(), DestType)) 
{
+      Args.size() == 1 && Args[0]->isPRValue() &&
+      S.Context.hasSameUnqualifiedType(Args[0]->getType(), DestType)) {
     // Convert qualifications if necessary.
----------------
MitalAshok wrote:
> MitalAshok wrote:
> > This change unfortunately exposes the still-open [[ 
> > https://wg21.link/CWG2311 | CWG2311 ]] but allows `T{ object_of_type_T }` 
> > to consider user declared constructors.
> > 
> > I am working on a separate fix for CWG2311 (Consider constructors as below, 
> > but then if the chosen constructor is not an initializer-list constructor, 
> > elide it).
> > 
> Fix will be here: https://reviews.llvm.org/D156062
> 
> `auto{ prvalue }` will elide a copy for aggregate types again. It will do so 
> after checking constructors for non-aggregate classes now.
As this was abandoned in favor of doing the fix here, the patch title, summary, 
and release notes should all be updated to talk about CWG2311.


================
Comment at: clang/test/CXX/drs/dr23xx.cpp:54
+void test() {
+  // Ensure none of these expressions try to call a move constructor
+  T a = T{T(0)};
----------------



================
Comment at: clang/test/CXX/drs/dr23xx.cpp:9
+namespace std {
+  __extension__ typedef __SIZE_TYPE__ size_t;
+
----------------
MitalAshok wrote:
> cor3ntin wrote:
> > 
> Wouldn't work in c++98 mode this file is being run in. I've copied this from 
> other tests in this directory. I guess I can put a `#if __cplusplus >= 
> 201103L` instead?
The current form seems fine to me.


================
Comment at: clang/test/CXX/drs/dr23xx.cpp:50
 
+namespace dr2311 {
+#if __cplusplus >= 201707L
----------------
MitalAshok wrote:
> cor3ntin wrote:
> > the dr status html page is generated automatically by leaving a magic 
> > comment here - and then running `clang/www/make_cxx_dr_status`
> CWG2311 is still open, but clang did support list-initialization elision 
> before this patch. The committee still needs to decide how exactly this 
> elision is going to work, which might be different from how this patch 
> implements it, so hesitant to mark this as done.
CC @Endill -- do we have a special marking for "issue still open in WG21, but 
we implement the current suggested resolution?"


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D156032

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

Reply via email to