<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">Done. Thanks!<div><br></div><div>-bw</div><div><br><div style=""><div>On Jul 24, 2014, at 7:02 PM, Richard Smith <<a href="mailto:richard@metafoo.co.uk">richard@metafoo.co.uk</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div dir="ltr">This fixes a wrong-code regression, and is a good candidate for the branch.</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Jul 24, 2014 at 6:12 PM, Richard Smith <span dir="ltr"><<a href="mailto:richard-llvm@metafoo.co.uk" target="_blank">richard-llvm@metafoo.co.uk</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rsmith<br>
Date: Thu Jul 24 20:12:44 2014<br>
New Revision: 213913<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=213913&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=213913&view=rev</a><br>
Log:<br>
PR20445: Properly transform the initializer in a CXXNewExpr rather than running<br>
it through the normal TreeTransform logic for Exprs (which will strip off<br>
implicit parts of the initialization and never re-create them).<br>
<br>
Modified:<br>
    cfe/trunk/lib/Sema/SemaExprCXX.cpp<br>
    cfe/trunk/lib/Sema/TreeTransform.h<br>
    cfe/trunk/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist.cpp<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=213913&r1=213912&r2=213913&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=213913&r1=213912&r2=213913&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Thu Jul 24 20:12:44 2014<br>
@@ -1184,14 +1184,6 @@ Sema::BuildCXXNew(SourceRange Range, boo<br>
     NumInits = List->getNumExprs();<br>
   }<br>
<br>
-  // Determine whether we've already built the initializer.<br>
-  bool HaveCompleteInit = false;<br>
-  if (Initializer && isa<CXXConstructExpr>(Initializer) &&<br>
-      !isa<CXXTemporaryObjectExpr>(Initializer))<br>
-    HaveCompleteInit = true;<br>
-  else if (Initializer && isa<ImplicitValueInitExpr>(Initializer))<br>
-    HaveCompleteInit = true;<br>
-<br>
   // C++11 [dcl.spec.auto]p6. Deduce the type which 'auto' stands in for.<br>
   if (TypeMayContainAuto && AllocType->isUndeducedType()) {<br>
     if (initStyle == CXXNewExpr::NoInit || NumInits == 0)<br>
@@ -1481,8 +1473,7 @@ Sema::BuildCXXNew(SourceRange Range, boo<br>
   // do it now.<br>
   if (!AllocType->isDependentType() &&<br>
       !Expr::hasAnyTypeDependentArguments(<br>
-        llvm::makeArrayRef(Inits, NumInits)) &&<br>
-      !HaveCompleteInit) {<br>
+          llvm::makeArrayRef(Inits, NumInits))) {<br>
     // C++11 [expr.new]p15:<br>
     //   A new-expression that creates an object of type T initializes that<br>
     //   object as follows:<br>
<br>
Modified: cfe/trunk/lib/Sema/TreeTransform.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=213913&r1=213912&r2=213913&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=213913&r1=213912&r2=213913&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Sema/TreeTransform.h (original)<br>
+++ cfe/trunk/lib/Sema/TreeTransform.h Thu Jul 24 20:12:44 2014<br>
@@ -344,7 +344,7 @@ public:<br>
   /// TransformExpr or TransformExprs.<br>
   ///<br>
   /// \returns the transformed initializer.<br>
-  ExprResult TransformInitializer(Expr *Init, bool CXXDirectInit);<br>
+  ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);<br>
<br>
   /// \brief Transform the given list of expressions.<br>
   ///<br>
@@ -2858,7 +2858,7 @@ ExprResult TreeTransform<Derived>::Trans<br>
<br>
 template<typename Derived><br>
 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,<br>
-                                                        bool CXXDirectInit) {<br>
+                                                        bool NotCopyInit) {<br>
   // Initializers are instantiated like expressions, except that various outer<br>
   // layers are stripped.<br>
   if (!Init)<br>
@@ -2878,13 +2878,13 @@ ExprResult TreeTransform<Derived>::Trans<br>
<br>
   if (CXXStdInitializerListExpr *ILE =<br>
           dyn_cast<CXXStdInitializerListExpr>(Init))<br>
-    return TransformInitializer(ILE->getSubExpr(), CXXDirectInit);<br>
+    return TransformInitializer(ILE->getSubExpr(), NotCopyInit);<br>
<br>
-  // If this is not a direct-initializer, we only need to reconstruct<br>
+  // If this is copy-initialization, we only need to reconstruct<br>
   // InitListExprs. Other forms of copy-initialization will be a no-op if<br>
   // the initializer is already the right type.<br>
   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);<br>
-  if (!CXXDirectInit && !(Construct && Construct->isListInitialization()))<br>
+  if (!NotCopyInit && !(Construct && Construct->isListInitialization()))<br>
     return getDerived().TransformExpr(Init);<br>
<br>
   // Revert value-initialization back to empty parens.<br>
@@ -2907,12 +2907,12 @@ ExprResult TreeTransform<Derived>::Trans<br>
   // If the initialization implicitly converted an initializer list to a<br>
   // std::initializer_list object, unwrap the std::initializer_list too.<br>
   if (Construct && Construct->isStdInitListInitialization())<br>
-    return TransformInitializer(Construct->getArg(0), CXXDirectInit);<br>
+    return TransformInitializer(Construct->getArg(0), NotCopyInit);<br>
<br>
   SmallVector<Expr*, 8> NewArgs;<br>
   bool ArgChanged = false;<br>
   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),<br>
-                     /*IsCall*/true, NewArgs, &ArgChanged))<br>
+                                  /*IsCall*/true, NewArgs, &ArgChanged))<br>
     return ExprError();<br>
<br>
   // If this was list initialization, revert to list form.<br>
@@ -8179,7 +8179,7 @@ TreeTransform<Derived>::TransformCXXNewE<br>
   Expr *OldInit = E->getInitializer();<br>
   ExprResult NewInit;<br>
   if (OldInit)<br>
-    NewInit = getDerived().TransformExpr(OldInit);<br>
+    NewInit = getDerived().TransformInitializer(OldInit, true);<br>
   if (NewInit.isInvalid())<br>
     return ExprError();<br>
<br>
<br>
Modified: cfe/trunk/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist.cpp?rev=213913&r1=213912&r2=213913&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist.cpp?rev=213913&r1=213912&r2=213913&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist.cpp (original)<br>
+++ cfe/trunk/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist.cpp Thu Jul 24 20:12:44 2014<br>
@@ -455,3 +455,13 @@ namespace ArrayOfInitList {<br>
   };<br>
   S x[1] = {};<br>
 }<br>
+<br>
+namespace PR20445 {<br>
+  struct vector { vector(std::initializer_list<int>); };<br>
+  struct MyClass { explicit MyClass(const vector &v); };<br>
+  template<int x> void f() { new MyClass({42, 43}); }<br>
+  template void f<0>();<br>
+  // CHECK-LABEL: define {{.*}} @_ZN7PR204451fILi0EEEvv(<br>
+  // CHECK: call void @_ZN7PR204456vectorC1ESt16initializer_listIiE(<br>
+  // CHECK: call void @_ZN7PR204457MyClassC1ERKNS_6vectorE(<br>
+}<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>
</blockquote></div><br></div></body></html>