<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 12 December 2016 at 16:16, Mike Aizatsky <span dir="ltr"><<a href="mailto:aizatsky@google.com" target="_blank">aizatsky@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Richard,<div><br></div><div>I'm not really sure since I don't have access to windows machine but this or <a href="http://llvm.org/viewvc/llvm-project?revision=289412&view=revision" class="m_8538426202314716646cremed" target="_blank">http://llvm.org/viewvc/<wbr>llvm-project?revision=289412&<wbr>view=revision</a> has broken sanitizer-windows bot. Sorry if this is a false alarm.</div></div></blockquote><div><br></div><div>Given that the code added here is not (yet) reachable, I'd be really surprised if this change is responsible. Can you get a proper backtrace from one of these crashes?</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><a href="http://lab.llvm.org:8011/builders/sanitizer-windows/builds/2786" target="_blank">http://lab.llvm.org:8011/<wbr>builders/sanitizer-windows/<wbr>builds/2786</a><br></div><div><br></div><div><div>FAILED: projects/compiler-rt/lib/<wbr>sanitizer_common/tests/<wbr>sanitizer_stacktrace_test.cc.<wbr>i386.o </div><div>cmd.exe /C "cd /D C:\b\slave\sanitizer-windows\<wbr>build\projects\compiler-rt\<wbr>lib\sanitizer_common\tests && C:\b\slave\sanitizer-windows\<wbr>build\.\bin\clang.exe -DWIN32 -D_WINDOWS -Wno-unknown-warning-option -fms-compatibility-version=19.<wbr>00.24215.1 -D_HAS_EXCEPTIONS=0 -Wno-undefined-inline -DGTEST_NO_LLVM_RAW_OSTREAM=1 -DGTEST_HAS_RTTI=0 -IC:/b/slave/sanitizer-<wbr>windows/llvm/utils/unittest/<wbr>googletest/include -IC:/b/slave/sanitizer-<wbr>windows/llvm/utils/unittest/<wbr>googletest -DGTEST_HAS_SEH=0 -Wno-deprecated-declarations -IC:/b/slave/sanitizer-<wbr>windows/llvm/projects/<wbr>compiler-rt/include -IC:/b/slave/sanitizer-<wbr>windows/llvm/projects/<wbr>compiler-rt/lib -IC:/b/slave/sanitizer-<wbr>windows/llvm/projects/<wbr>compiler-rt/lib/sanitizer_<wbr>common -fno-rtti -O2 -Werror=sign-compare -Wno-non-virtual-dtor -fno-exceptions -DGTEST_HAS_SEH=0 -gline-tables-only -gcodeview -c -o sanitizer_stacktrace_test.cc.<wbr>i386.o C:/b/slave/sanitizer-windows/<wbr>llvm/projects/compiler-rt/lib/<wbr>sanitizer_common/tests/<wbr>sanitizer_stacktrace_test.cc"</div><div>Assertion failed: (PtrWord & ~PointerBitMask) == 0 && "Pointer is not sufficiently aligned", file C:\b\slave\sanitizer-windows\<wbr>llvm\include\llvm/ADT/<wbr>PointerIntPair.h, line 160</div><div><br></div><div>Wrote crash dump file "C:\Users\buildbot\AppData\<wbr>Local\Temp\clang.exe-692761.<wbr>dmp"</div><div><br></div><div>#0 0x01f8dd87 (C:\b\slave\sanitizer-windows\<wbr>build\bin\clang.exe+0xd4dd87)</div><div><br></div><div>#1 0x70a64672 (C:\windows\SYSTEM32\ucrtbase.<wbr>DLL+0x84672)</div><div><br></div><div>#2 0x70a65cab (C:\windows\SYSTEM32\ucrtbase.<wbr>DLL+0x85cab)</div><div><br></div><div>#3 0x70a650e8 (C:\windows\SYSTEM32\ucrtbase.<wbr>DLL+0x850e8)</div><div><br></div><div>#4 0x70a65da6 (C:\windows\SYSTEM32\ucrtbase.<wbr>DLL+0x85da6)</div><div><br></div><div>#5 0x02ff860d (C:\b\slave\sanitizer-windows\<wbr>build\bin\clang.exe+0x1db860d)</div><div><br></div><div>clang.exe: error: clang frontend command failed due to signal (use -v to see invocation)</div><div><br></div><div>clang version 4.0.0 (trunk 289413)</div><div><br></div><div>Target: i686-pc-windows-msvc</div><div><br></div><div>Thread model: posix</div><div><br></div><div>InstalledDir: C:\b\slave\sanitizer-windows\<wbr>build\bin</div><div><br></div><div>clang.exe: note: diagnostic msg: PLEASE submit a bug report to <a href="http://llvm.org/bugs/" target="_blank">http://llvm.org/bugs/</a> and include the crash backtrace, preprocessed source, and associated run script.</div><div><br></div><div>clang.exe: note: diagnostic msg: </div><div><br></div><div>********************</div></div><div><br></div></div><div class="HOEnZb"><div class="h5"><br><div class="gmail_quote"><div dir="ltr">On Sun, Dec 11, 2016 at 7:03 PM Richard Smith via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rsmith<br class="m_8538426202314716646gmail_msg">
Date: Sun Dec 11 20:53:20 2016<br class="m_8538426202314716646gmail_msg">
New Revision: 289413<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=289413&view=rev" rel="noreferrer" class="m_8538426202314716646gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=289413&view=rev</a><br class="m_8538426202314716646gmail_msg">
Log:<br class="m_8538426202314716646gmail_msg">
Add two new AST nodes to represent initialization of an array in terms of<br class="m_8538426202314716646gmail_msg">
initialization of each array element:<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
 * ArrayInitLoopExpr is a prvalue of array type with two subexpressions:<br class="m_8538426202314716646gmail_msg">
   a common expression (an OpaqueValueExpr) that represents the up-front<br class="m_8538426202314716646gmail_msg">
   computation of the source of the initialization, and a subexpression<br class="m_8538426202314716646gmail_msg">
   representing a per-element initializer<br class="m_8538426202314716646gmail_msg">
 * ArrayInitIndexExpr is a prvalue of type size_t representing the current<br class="m_8538426202314716646gmail_msg">
   position in the loop<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
This will be used to replace the creation of explicit index variables in lambda<br class="m_8538426202314716646gmail_msg">
capture of arrays and copy/move construction of classes with array elements,<br class="m_8538426202314716646gmail_msg">
and also C++17 structured bindings of arrays by value (which inexplicably allow<br class="m_8538426202314716646gmail_msg">
copying an array by value, unlike all of C++'s other array declarations).<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
No uses of these nodes are introduced by this change, however.<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
Modified:<br class="m_8538426202314716646gmail_msg">
    cfe/trunk/include/clang/AST/<wbr>Expr.h<br class="m_8538426202314716646gmail_msg">
    cfe/trunk/include/clang/AST/<wbr>RecursiveASTVisitor.h<br class="m_8538426202314716646gmail_msg">
    cfe/trunk/include/clang/Basic/<wbr>StmtNodes.td<br class="m_8538426202314716646gmail_msg">
    cfe/trunk/include/clang/Sema/<wbr>Initialization.h<br class="m_8538426202314716646gmail_msg">
    cfe/trunk/include/clang/<wbr>Serialization/ASTBitCodes.h<br class="m_8538426202314716646gmail_msg">
    cfe/trunk/lib/AST/ASTDumper.<wbr>cpp<br class="m_8538426202314716646gmail_msg">
    cfe/trunk/lib/AST/Expr.cpp<br class="m_8538426202314716646gmail_msg">
    cfe/trunk/lib/AST/<wbr>ExprClassification.cpp<br class="m_8538426202314716646gmail_msg">
    cfe/trunk/lib/AST/<wbr>ExprConstant.cpp<br class="m_8538426202314716646gmail_msg">
    cfe/trunk/lib/AST/<wbr>ItaniumMangle.cpp<br class="m_8538426202314716646gmail_msg">
    cfe/trunk/lib/AST/StmtPrinter.<wbr>cpp<br class="m_8538426202314716646gmail_msg">
    cfe/trunk/lib/AST/StmtProfile.<wbr>cpp<br class="m_8538426202314716646gmail_msg">
    cfe/trunk/lib/CodeGen/<wbr>CGExprAgg.cpp<br class="m_8538426202314716646gmail_msg">
    cfe/trunk/lib/CodeGen/<wbr>CGExprScalar.cpp<br class="m_8538426202314716646gmail_msg">
    cfe/trunk/lib/CodeGen/<wbr>CodeGenFunction.h<br class="m_8538426202314716646gmail_msg">
    cfe/trunk/lib/Sema/<wbr>SemaExceptionSpec.cpp<br class="m_8538426202314716646gmail_msg">
    cfe/trunk/lib/Sema/SemaInit.<wbr>cpp<br class="m_8538426202314716646gmail_msg">
    cfe/trunk/lib/Sema/<wbr>TreeTransform.h<br class="m_8538426202314716646gmail_msg">
    cfe/trunk/lib/Serialization/<wbr>ASTReaderStmt.cpp<br class="m_8538426202314716646gmail_msg">
    cfe/trunk/lib/Serialization/<wbr>ASTWriterStmt.cpp<br class="m_8538426202314716646gmail_msg">
    cfe/trunk/lib/StaticAnalyzer/<wbr>Core/ExprEngine.cpp<br class="m_8538426202314716646gmail_msg">
    cfe/trunk/tools/libclang/<wbr>CXCursor.cpp<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
Modified: cfe/trunk/include/clang/AST/<wbr>Expr.h<br class="m_8538426202314716646gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Expr.h?rev=289413&r1=289412&r2=289413&view=diff" rel="noreferrer" class="m_8538426202314716646gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/AST/Expr.h?rev=289413&<wbr>r1=289412&r2=289413&view=diff</a><br class="m_8538426202314716646gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_8538426202314716646gmail_msg">
--- cfe/trunk/include/clang/AST/<wbr>Expr.h (original)<br class="m_8538426202314716646gmail_msg">
+++ cfe/trunk/include/clang/AST/<wbr>Expr.h Sun Dec 11 20:53:20 2016<br class="m_8538426202314716646gmail_msg">
@@ -4333,6 +4333,98 @@ public:<br class="m_8538426202314716646gmail_msg">
   }<br class="m_8538426202314716646gmail_msg">
 };<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
+/// \brief Represents a loop initializing the elements of an array.<br class="m_8538426202314716646gmail_msg">
+///<br class="m_8538426202314716646gmail_msg">
+/// The need to initialize the elements of an array occurs in a number of<br class="m_8538426202314716646gmail_msg">
+/// contexts:<br class="m_8538426202314716646gmail_msg">
+///<br class="m_8538426202314716646gmail_msg">
+///  * in the implicit copy/move constructor for a class with an array member<br class="m_8538426202314716646gmail_msg">
+///  * when a lambda-expression captures an array by value<br class="m_8538426202314716646gmail_msg">
+///  * when a decomposition declaration decomposes an array<br class="m_8538426202314716646gmail_msg">
+///<br class="m_8538426202314716646gmail_msg">
+/// There are two subexpressions: a common expression (the source array)<br class="m_8538426202314716646gmail_msg">
+/// that is evaluated once up-front, and a per-element initializer that<br class="m_8538426202314716646gmail_msg">
+/// runs once for each array element.<br class="m_8538426202314716646gmail_msg">
+///<br class="m_8538426202314716646gmail_msg">
+/// Within the per-element initializer, the common expression may be referenced<br class="m_8538426202314716646gmail_msg">
+/// via an OpaqueValueExpr, and the current index may be obtained via an<br class="m_8538426202314716646gmail_msg">
+/// ArrayInitIndexExpr.<br class="m_8538426202314716646gmail_msg">
+class ArrayInitLoopExpr : public Expr {<br class="m_8538426202314716646gmail_msg">
+  Stmt *SubExprs[2];<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  explicit ArrayInitLoopExpr(EmptyShell Empty)<br class="m_8538426202314716646gmail_msg">
+      : Expr(ArrayInitLoopExprClass, Empty), SubExprs{} {}<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+public:<br class="m_8538426202314716646gmail_msg">
+  explicit ArrayInitLoopExpr(QualType T, Expr *CommonInit, Expr *ElementInit)<br class="m_8538426202314716646gmail_msg">
+      : Expr(ArrayInitLoopExprClass, T, VK_RValue, OK_Ordinary, false,<br class="m_8538426202314716646gmail_msg">
+             CommonInit->isValueDependent(<wbr>) || ElementInit->isValueDependent(<wbr>),<br class="m_8538426202314716646gmail_msg">
+             T-><wbr>isInstantiationDependentType()<wbr>,<br class="m_8538426202314716646gmail_msg">
+             CommonInit-><wbr>containsUnexpandedParameterPac<wbr>k() ||<br class="m_8538426202314716646gmail_msg">
+                 ElementInit-><wbr>containsUnexpandedParameterPac<wbr>k()),<br class="m_8538426202314716646gmail_msg">
+        SubExprs{CommonInit, ElementInit} {}<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  /// Get the common subexpression shared by all initializations (the source<br class="m_8538426202314716646gmail_msg">
+  /// array).<br class="m_8538426202314716646gmail_msg">
+  OpaqueValueExpr *getCommonExpr() const {<br class="m_8538426202314716646gmail_msg">
+    return cast<OpaqueValueExpr>(<wbr>SubExprs[0]);<br class="m_8538426202314716646gmail_msg">
+  }<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  /// Get the initializer to use for each array element.<br class="m_8538426202314716646gmail_msg">
+  Expr *getSubExpr() const { return cast<Expr>(SubExprs[1]); }<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  llvm::APInt getArraySize() const {<br class="m_8538426202314716646gmail_msg">
+    return cast<ConstantArrayType>(<wbr>getType()-><wbr>castAsArrayTypeUnsafe())<br class="m_8538426202314716646gmail_msg">
+        ->getSize();<br class="m_8538426202314716646gmail_msg">
+  }<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  static bool classof(const Stmt *S) {<br class="m_8538426202314716646gmail_msg">
+    return S->getStmtClass() == ArrayInitLoopExprClass;<br class="m_8538426202314716646gmail_msg">
+  }<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  SourceLocation getLocStart() const LLVM_READONLY {<br class="m_8538426202314716646gmail_msg">
+    return getCommonExpr()->getLocStart()<wbr>;<br class="m_8538426202314716646gmail_msg">
+  }<br class="m_8538426202314716646gmail_msg">
+  SourceLocation getLocEnd() const LLVM_READONLY {<br class="m_8538426202314716646gmail_msg">
+    return getCommonExpr()->getLocEnd();<br class="m_8538426202314716646gmail_msg">
+  }<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  child_range children() {<br class="m_8538426202314716646gmail_msg">
+    return child_range(SubExprs, SubExprs + 2);<br class="m_8538426202314716646gmail_msg">
+  }<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  friend class ASTReader;<br class="m_8538426202314716646gmail_msg">
+  friend class ASTStmtReader;<br class="m_8538426202314716646gmail_msg">
+  friend class ASTStmtWriter;<br class="m_8538426202314716646gmail_msg">
+};<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+/// \brief Represents the index of the current element of an array being<br class="m_8538426202314716646gmail_msg">
+/// initialized by an ArrayInitLoopExpr. This can only appear within the<br class="m_8538426202314716646gmail_msg">
+/// subexpression of an ArrayInitLoopExpr.<br class="m_8538426202314716646gmail_msg">
+class ArrayInitIndexExpr : public Expr {<br class="m_8538426202314716646gmail_msg">
+  explicit ArrayInitIndexExpr(EmptyShell Empty)<br class="m_8538426202314716646gmail_msg">
+      : Expr(ArrayInitIndexExprClass, Empty) {}<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+public:<br class="m_8538426202314716646gmail_msg">
+  explicit ArrayInitIndexExpr(QualType T)<br class="m_8538426202314716646gmail_msg">
+      : Expr(ArrayInitIndexExprClass, T, VK_RValue, OK_Ordinary,<br class="m_8538426202314716646gmail_msg">
+             false, false, false, false) {}<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  static bool classof(const Stmt *S) {<br class="m_8538426202314716646gmail_msg">
+    return S->getStmtClass() == ArrayInitIndexExprClass;<br class="m_8538426202314716646gmail_msg">
+  }<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  SourceLocation getLocStart() const LLVM_READONLY { return SourceLocation(); }<br class="m_8538426202314716646gmail_msg">
+  SourceLocation getLocEnd() const LLVM_READONLY { return SourceLocation(); }<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  child_range children() {<br class="m_8538426202314716646gmail_msg">
+    return child_range(child_iterator(), child_iterator());<br class="m_8538426202314716646gmail_msg">
+  }<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  friend class ASTReader;<br class="m_8538426202314716646gmail_msg">
+  friend class ASTStmtReader;<br class="m_8538426202314716646gmail_msg">
+};<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
 /// \brief Represents an implicitly-generated value initialization of<br class="m_8538426202314716646gmail_msg">
 /// an object of a given type.<br class="m_8538426202314716646gmail_msg">
 ///<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
Modified: cfe/trunk/include/clang/AST/<wbr>RecursiveASTVisitor.h<br class="m_8538426202314716646gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=289413&r1=289412&r2=289413&view=diff" rel="noreferrer" class="m_8538426202314716646gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/AST/RecursiveASTVisitor.<wbr>h?rev=289413&r1=289412&r2=<wbr>289413&view=diff</a><br class="m_8538426202314716646gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_8538426202314716646gmail_msg">
--- cfe/trunk/include/clang/AST/<wbr>RecursiveASTVisitor.h (original)<br class="m_8538426202314716646gmail_msg">
+++ cfe/trunk/include/clang/AST/<wbr>RecursiveASTVisitor.h Sun Dec 11 20:53:20 2016<br class="m_8538426202314716646gmail_msg">
@@ -2399,6 +2399,8 @@ DEF_TRAVERSE_STMT(<wbr>ExtVectorElementExpr,<br class="m_8538426202314716646gmail_msg">
 DEF_TRAVERSE_STMT(<wbr>GNUNullExpr, {})<br class="m_8538426202314716646gmail_msg">
 DEF_TRAVERSE_STMT(<wbr>ImplicitValueInitExpr, {})<br class="m_8538426202314716646gmail_msg">
 DEF_TRAVERSE_STMT(NoInitExpr, {})<br class="m_8538426202314716646gmail_msg">
+DEF_TRAVERSE_STMT(<wbr>ArrayInitLoopExpr, {})<br class="m_8538426202314716646gmail_msg">
+DEF_TRAVERSE_STMT(<wbr>ArrayInitIndexExpr, {})<br class="m_8538426202314716646gmail_msg">
 DEF_TRAVERSE_STMT(<wbr>ObjCBoolLiteralExpr, {})<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
 DEF_TRAVERSE_STMT(<wbr>ObjCEncodeExpr, {<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
Modified: cfe/trunk/include/clang/Basic/<wbr>StmtNodes.td<br class="m_8538426202314716646gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/StmtNodes.td?rev=289413&r1=289412&r2=289413&view=diff" rel="noreferrer" class="m_8538426202314716646gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/Basic/StmtNodes.td?rev=<wbr>289413&r1=289412&r2=289413&<wbr>view=diff</a><br class="m_8538426202314716646gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_8538426202314716646gmail_msg">
--- cfe/trunk/include/clang/Basic/<wbr>StmtNodes.td (original)<br class="m_8538426202314716646gmail_msg">
+++ cfe/trunk/include/clang/Basic/<wbr>StmtNodes.td Sun Dec 11 20:53:20 2016<br class="m_8538426202314716646gmail_msg">
@@ -85,6 +85,8 @@ def DesignatedInitExpr : DStmt<Expr>;<br class="m_8538426202314716646gmail_msg">
 def DesignatedInitUpdateExpr : DStmt<Expr>;<br class="m_8538426202314716646gmail_msg">
 def ImplicitValueInitExpr : DStmt<Expr>;<br class="m_8538426202314716646gmail_msg">
 def NoInitExpr : DStmt<Expr>;<br class="m_8538426202314716646gmail_msg">
+def ArrayInitLoopExpr : DStmt<Expr>;<br class="m_8538426202314716646gmail_msg">
+def ArrayInitIndexExpr : DStmt<Expr>;<br class="m_8538426202314716646gmail_msg">
 def ParenListExpr : DStmt<Expr>;<br class="m_8538426202314716646gmail_msg">
 def VAArgExpr : DStmt<Expr>;<br class="m_8538426202314716646gmail_msg">
 def GenericSelectionExpr : DStmt<Expr>;<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
Modified: cfe/trunk/include/clang/Sema/<wbr>Initialization.h<br class="m_8538426202314716646gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Initialization.h?rev=289413&r1=289412&r2=289413&view=diff" rel="noreferrer" class="m_8538426202314716646gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/Sema/Initialization.h?<wbr>rev=289413&r1=289412&r2=<wbr>289413&view=diff</a><br class="m_8538426202314716646gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_8538426202314716646gmail_msg">
--- cfe/trunk/include/clang/Sema/<wbr>Initialization.h (original)<br class="m_8538426202314716646gmail_msg">
+++ cfe/trunk/include/clang/Sema/<wbr>Initialization.h Sun Dec 11 20:53:20 2016<br class="m_8538426202314716646gmail_msg">
@@ -120,6 +120,16 @@ private:<br class="m_8538426202314716646gmail_msg">
     bool NRVO;<br class="m_8538426202314716646gmail_msg">
   };<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
+  struct VD {<br class="m_8538426202314716646gmail_msg">
+    /// \brief The VarDecl, FieldDecl, or BindingDecl being initialized.<br class="m_8538426202314716646gmail_msg">
+    ValueDecl *VariableOrMember;<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+    /// \brief When Kind == EK_Member, whether this is an implicit member<br class="m_8538426202314716646gmail_msg">
+    /// initialization in a copy or move constructor. These can perform array<br class="m_8538426202314716646gmail_msg">
+    /// copies.<br class="m_8538426202314716646gmail_msg">
+    bool IsImplicitFieldInit;<br class="m_8538426202314716646gmail_msg">
+  };<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
   struct C {<br class="m_8538426202314716646gmail_msg">
     /// \brief The name of the variable being captured by an EK_LambdaCapture.<br class="m_8538426202314716646gmail_msg">
     IdentifierInfo *VarID;<br class="m_8538426202314716646gmail_msg">
@@ -129,9 +139,8 @@ private:<br class="m_8538426202314716646gmail_msg">
   };<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
   union {<br class="m_8538426202314716646gmail_msg">
-    /// \brief When Kind == EK_Variable, EK_Member or EK_Binding, the VarDecl,<br class="m_8538426202314716646gmail_msg">
-    /// FieldDecl or BindingDecl, respectively.<br class="m_8538426202314716646gmail_msg">
-    ValueDecl *VariableOrMember;<br class="m_8538426202314716646gmail_msg">
+    /// \brief When Kind == EK_Variable, EK_Member or EK_Binding, the variable.<br class="m_8538426202314716646gmail_msg">
+    VD Variable;<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
     /// \brief When Kind == EK_RelatedResult, the ObjectiveC method where<br class="m_8538426202314716646gmail_msg">
     /// result type was implicitly changed to accommodate ARC semantics.<br class="m_8538426202314716646gmail_msg">
@@ -165,7 +174,7 @@ private:<br class="m_8538426202314716646gmail_msg">
   /// \brief Create the initialization entity for a variable.<br class="m_8538426202314716646gmail_msg">
   InitializedEntity(VarDecl *Var, EntityKind EK = EK_Variable)<br class="m_8538426202314716646gmail_msg">
     : Kind(EK), Parent(nullptr), Type(Var->getType()),<br class="m_8538426202314716646gmail_msg">
-      ManglingNumber(0), VariableOrMember(Var) { }<br class="m_8538426202314716646gmail_msg">
+      ManglingNumber(0), Variable{Var, false} { }<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
   /// \brief Create the initialization entity for the result of a<br class="m_8538426202314716646gmail_msg">
   /// function, throwing an object, performing an explicit cast, or<br class="m_8538426202314716646gmail_msg">
@@ -179,9 +188,11 @@ private:<br class="m_8538426202314716646gmail_msg">
   }<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
   /// \brief Create the initialization entity for a member subobject.<br class="m_8538426202314716646gmail_msg">
-  InitializedEntity(FieldDecl *Member, const InitializedEntity *Parent)<br class="m_8538426202314716646gmail_msg">
+  InitializedEntity(FieldDecl *Member, const InitializedEntity *Parent,<br class="m_8538426202314716646gmail_msg">
+                    bool Implicit)<br class="m_8538426202314716646gmail_msg">
     : Kind(EK_Member), Parent(Parent), Type(Member->getType()),<br class="m_8538426202314716646gmail_msg">
-      ManglingNumber(0), VariableOrMember(Member) { }<br class="m_8538426202314716646gmail_msg">
+      ManglingNumber(0), Variable{Member, Implicit} {<br class="m_8538426202314716646gmail_msg">
+  }<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
   /// \brief Create the initialization entity for an array element.<br class="m_8538426202314716646gmail_msg">
   InitializedEntity(ASTContext &Context, unsigned Index,<br class="m_8538426202314716646gmail_msg">
@@ -299,15 +310,17 @@ public:<br class="m_8538426202314716646gmail_msg">
   /// \brief Create the initialization entity for a member subobject.<br class="m_8538426202314716646gmail_msg">
   static InitializedEntity<br class="m_8538426202314716646gmail_msg">
   InitializeMember(FieldDecl *Member,<br class="m_8538426202314716646gmail_msg">
-                   const InitializedEntity *Parent = nullptr) {<br class="m_8538426202314716646gmail_msg">
-    return InitializedEntity(Member, Parent);<br class="m_8538426202314716646gmail_msg">
+                   const InitializedEntity *Parent = nullptr,<br class="m_8538426202314716646gmail_msg">
+                   bool Implicit = false) {<br class="m_8538426202314716646gmail_msg">
+    return InitializedEntity(Member, Parent, Implicit);<br class="m_8538426202314716646gmail_msg">
   }<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
   /// \brief Create the initialization entity for a member subobject.<br class="m_8538426202314716646gmail_msg">
   static InitializedEntity<br class="m_8538426202314716646gmail_msg">
   InitializeMember(<wbr>IndirectFieldDecl *Member,<br class="m_8538426202314716646gmail_msg">
-                   const InitializedEntity *Parent = nullptr) {<br class="m_8538426202314716646gmail_msg">
-    return InitializedEntity(Member-><wbr>getAnonField(), Parent);<br class="m_8538426202314716646gmail_msg">
+                   const InitializedEntity *Parent = nullptr,<br class="m_8538426202314716646gmail_msg">
+                   bool Implicit = false) {<br class="m_8538426202314716646gmail_msg">
+    return InitializedEntity(Member-><wbr>getAnonField(), Parent, Implicit);<br class="m_8538426202314716646gmail_msg">
   }<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
   /// \brief Create the initialization entity for an array element.<br class="m_8538426202314716646gmail_msg">
@@ -401,6 +414,12 @@ public:<br class="m_8538426202314716646gmail_msg">
                                       getType()-><wbr>getAsArrayTypeUnsafe());<br class="m_8538426202314716646gmail_msg">
   }<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
+  /// \brief Is this the implicit initialization of a member of a class from<br class="m_8538426202314716646gmail_msg">
+  /// a defaulted constructor?<br class="m_8538426202314716646gmail_msg">
+  bool isImplicitMemberInitializer() const {<br class="m_8538426202314716646gmail_msg">
+    return getKind() == EK_Member && Variable.IsImplicitFieldInit;<br class="m_8538426202314716646gmail_msg">
+  }<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
   /// \brief Determine the location of the 'return' keyword when initializing<br class="m_8538426202314716646gmail_msg">
   /// the result of a function call.<br class="m_8538426202314716646gmail_msg">
   SourceLocation getReturnLoc() const {<br class="m_8538426202314716646gmail_msg">
@@ -708,6 +727,10 @@ public:<br class="m_8538426202314716646gmail_msg">
     /// \brief An initialization that "converts" an Objective-C object<br class="m_8538426202314716646gmail_msg">
     /// (not a point to an object) to another Objective-C object type.<br class="m_8538426202314716646gmail_msg">
     SK_ObjCObjectConversion,<br class="m_8538426202314716646gmail_msg">
+    /// \brief Array indexing for initialization by elementwise copy.<br class="m_8538426202314716646gmail_msg">
+    SK_ArrayLoopIndex,<br class="m_8538426202314716646gmail_msg">
+    /// \brief Array initialization by elementwise copy.<br class="m_8538426202314716646gmail_msg">
+    SK_ArrayLoopInit,<br class="m_8538426202314716646gmail_msg">
     /// \brief Array initialization (from an array rvalue).<br class="m_8538426202314716646gmail_msg">
     /// This is a GNU C extension.<br class="m_8538426202314716646gmail_msg">
     SK_ArrayInit,<br class="m_8538426202314716646gmail_msg">
@@ -1096,6 +1119,9 @@ public:<br class="m_8538426202314716646gmail_msg">
   /// always a no-op.<br class="m_8538426202314716646gmail_msg">
   void AddObjCObjectConversionStep(<wbr>QualType T);<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
+  /// \brief Add an array initialization loop step.<br class="m_8538426202314716646gmail_msg">
+  void AddArrayInitLoopStep(QualType T, QualType EltTy);<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
   /// \brief Add an array initialization step.<br class="m_8538426202314716646gmail_msg">
   void AddArrayInitStep(QualType T);<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
Modified: cfe/trunk/include/clang/<wbr>Serialization/ASTBitCodes.h<br class="m_8538426202314716646gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTBitCodes.h?rev=289413&r1=289412&r2=289413&view=diff" rel="noreferrer" class="m_8538426202314716646gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/Serialization/<wbr>ASTBitCodes.h?rev=289413&r1=<wbr>289412&r2=289413&view=diff</a><br class="m_8538426202314716646gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_8538426202314716646gmail_msg">
--- cfe/trunk/include/clang/<wbr>Serialization/ASTBitCodes.h (original)<br class="m_8538426202314716646gmail_msg">
+++ cfe/trunk/include/clang/<wbr>Serialization/ASTBitCodes.h Sun Dec 11 20:53:20 2016<br class="m_8538426202314716646gmail_msg">
@@ -1292,10 +1292,14 @@ namespace clang {<br class="m_8538426202314716646gmail_msg">
       EXPR_DESIGNATED_INIT,<br class="m_8538426202314716646gmail_msg">
       /// \brief A DesignatedInitUpdateExpr record.<br class="m_8538426202314716646gmail_msg">
       EXPR_DESIGNATED_INIT_UPDATE,<br class="m_8538426202314716646gmail_msg">
-      /// \brief An ImplicitValueInitExpr record.<br class="m_8538426202314716646gmail_msg">
-      EXPR_IMPLICIT_VALUE_INIT,<br class="m_8538426202314716646gmail_msg">
       /// \brief An NoInitExpr record.<br class="m_8538426202314716646gmail_msg">
       EXPR_NO_INIT,<br class="m_8538426202314716646gmail_msg">
+      /// \brief An ArrayInitLoopExpr record.<br class="m_8538426202314716646gmail_msg">
+      EXPR_ARRAY_INIT_LOOP,<br class="m_8538426202314716646gmail_msg">
+      /// \brief An ArrayInitIndexExpr record.<br class="m_8538426202314716646gmail_msg">
+      EXPR_ARRAY_INIT_INDEX,<br class="m_8538426202314716646gmail_msg">
+      /// \brief An ImplicitValueInitExpr record.<br class="m_8538426202314716646gmail_msg">
+      EXPR_IMPLICIT_VALUE_INIT,<br class="m_8538426202314716646gmail_msg">
       /// \brief A VAArgExpr record.<br class="m_8538426202314716646gmail_msg">
       EXPR_VA_ARG,<br class="m_8538426202314716646gmail_msg">
       /// \brief An AddrLabelExpr record.<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
Modified: cfe/trunk/lib/AST/ASTDumper.<wbr>cpp<br class="m_8538426202314716646gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTDumper.cpp?rev=289413&r1=289412&r2=289413&view=diff" rel="noreferrer" class="m_8538426202314716646gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/AST/<wbr>ASTDumper.cpp?rev=289413&r1=<wbr>289412&r2=289413&view=diff</a><br class="m_8538426202314716646gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_8538426202314716646gmail_msg">
--- cfe/trunk/lib/AST/ASTDumper.<wbr>cpp (original)<br class="m_8538426202314716646gmail_msg">
+++ cfe/trunk/lib/AST/ASTDumper.<wbr>cpp Sun Dec 11 20:53:20 2016<br class="m_8538426202314716646gmail_msg">
@@ -517,6 +517,8 @@ namespace  {<br class="m_8538426202314716646gmail_msg">
     void VisitFloatingLiteral(const FloatingLiteral *Node);<br class="m_8538426202314716646gmail_msg">
     void VisitStringLiteral(const StringLiteral *Str);<br class="m_8538426202314716646gmail_msg">
     void VisitInitListExpr(const InitListExpr *ILE);<br class="m_8538426202314716646gmail_msg">
+    void VisitArrayInitLoopExpr(const ArrayInitLoopExpr *ILE);<br class="m_8538426202314716646gmail_msg">
+    void VisitArrayInitIndexExpr(const ArrayInitIndexExpr *ILE);<br class="m_8538426202314716646gmail_msg">
     void VisitUnaryOperator(const UnaryOperator *Node);<br class="m_8538426202314716646gmail_msg">
     void VisitUnaryExprOrTypeTraitExpr(<wbr>const UnaryExprOrTypeTraitExpr *Node);<br class="m_8538426202314716646gmail_msg">
     void VisitMemberExpr(const MemberExpr *Node);<br class="m_8538426202314716646gmail_msg">
@@ -2024,6 +2026,14 @@ void ASTDumper::VisitInitListExpr(<wbr>const<br class="m_8538426202314716646gmail_msg">
   }<br class="m_8538426202314716646gmail_msg">
 }<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
+void ASTDumper::<wbr>VisitArrayInitLoopExpr(const ArrayInitLoopExpr *E) {<br class="m_8538426202314716646gmail_msg">
+  VisitExpr(E);<br class="m_8538426202314716646gmail_msg">
+}<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+void ASTDumper::<wbr>VisitArrayInitIndexExpr(const ArrayInitIndexExpr *E) {<br class="m_8538426202314716646gmail_msg">
+  VisitExpr(E);<br class="m_8538426202314716646gmail_msg">
+}<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
 void ASTDumper::VisitUnaryOperator(<wbr>const UnaryOperator *Node) {<br class="m_8538426202314716646gmail_msg">
   VisitExpr(Node);<br class="m_8538426202314716646gmail_msg">
   OS << " " << (Node->isPostfix() ? "postfix" : "prefix")<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
Modified: cfe/trunk/lib/AST/Expr.cpp<br class="m_8538426202314716646gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Expr.cpp?rev=289413&r1=289412&r2=289413&view=diff" rel="noreferrer" class="m_8538426202314716646gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/AST/<wbr>Expr.cpp?rev=289413&r1=289412&<wbr>r2=289413&view=diff</a><br class="m_8538426202314716646gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_8538426202314716646gmail_msg">
--- cfe/trunk/lib/AST/Expr.cpp (original)<br class="m_8538426202314716646gmail_msg">
+++ cfe/trunk/lib/AST/Expr.cpp Sun Dec 11 20:53:20 2016<br class="m_8538426202314716646gmail_msg">
@@ -2899,6 +2899,7 @@ bool Expr::HasSideEffects(const ASTConte<br class="m_8538426202314716646gmail_msg">
   case UnaryExprOrTypeTraitExprClass:<br class="m_8538426202314716646gmail_msg">
   case AddrLabelExprClass:<br class="m_8538426202314716646gmail_msg">
   case GNUNullExprClass:<br class="m_8538426202314716646gmail_msg">
+  case ArrayInitIndexExprClass:<br class="m_8538426202314716646gmail_msg">
   case NoInitExprClass:<br class="m_8538426202314716646gmail_msg">
   case CXXBoolLiteralExprClass:<br class="m_8538426202314716646gmail_msg">
   case CXXNullPtrLiteralExprClass:<br class="m_8538426202314716646gmail_msg">
@@ -2975,6 +2976,7 @@ bool Expr::HasSideEffects(const ASTConte<br class="m_8538426202314716646gmail_msg">
   case ExtVectorElementExprClass:<br class="m_8538426202314716646gmail_msg">
   case DesignatedInitExprClass:<br class="m_8538426202314716646gmail_msg">
   case DesignatedInitUpdateExprClass:<br class="m_8538426202314716646gmail_msg">
+  case ArrayInitLoopExprClass:<br class="m_8538426202314716646gmail_msg">
   case ParenListExprClass:<br class="m_8538426202314716646gmail_msg">
   case CXXPseudoDestructorExprClass:<br class="m_8538426202314716646gmail_msg">
   case CXXStdInitializerListExprClass<wbr>:<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
Modified: cfe/trunk/lib/AST/<wbr>ExprClassification.cpp<br class="m_8538426202314716646gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprClassification.cpp?rev=289413&r1=289412&r2=289413&view=diff" rel="noreferrer" class="m_8538426202314716646gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/AST/<wbr>ExprClassification.cpp?rev=<wbr>289413&r1=289412&r2=289413&<wbr>view=diff</a><br class="m_8538426202314716646gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_8538426202314716646gmail_msg">
--- cfe/trunk/lib/AST/<wbr>ExprClassification.cpp (original)<br class="m_8538426202314716646gmail_msg">
+++ cfe/trunk/lib/AST/<wbr>ExprClassification.cpp Sun Dec 11 20:53:20 2016<br class="m_8538426202314716646gmail_msg">
@@ -185,6 +185,8 @@ static Cl::Kinds ClassifyInternal(ASTCon<br class="m_8538426202314716646gmail_msg">
   case Expr::<wbr>ObjCIndirectCopyRestoreExprCla<wbr>ss:<br class="m_8538426202314716646gmail_msg">
   case Expr::AtomicExprClass:<br class="m_8538426202314716646gmail_msg">
   case Expr::CXXFoldExprClass:<br class="m_8538426202314716646gmail_msg">
+  case Expr::ArrayInitLoopExprClass:<br class="m_8538426202314716646gmail_msg">
+  case Expr::ArrayInitIndexExprClass:<br class="m_8538426202314716646gmail_msg">
   case Expr::NoInitExprClass:<br class="m_8538426202314716646gmail_msg">
   case Expr::<wbr>DesignatedInitUpdateExprClass:<br class="m_8538426202314716646gmail_msg">
   case Expr::CoyieldExprClass:<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
Modified: cfe/trunk/lib/AST/<wbr>ExprConstant.cpp<br class="m_8538426202314716646gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=289413&r1=289412&r2=289413&view=diff" rel="noreferrer" class="m_8538426202314716646gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/AST/<wbr>ExprConstant.cpp?rev=289413&<wbr>r1=289412&r2=289413&view=diff</a><br class="m_8538426202314716646gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_8538426202314716646gmail_msg">
--- cfe/trunk/lib/AST/<wbr>ExprConstant.cpp (original)<br class="m_8538426202314716646gmail_msg">
+++ cfe/trunk/lib/AST/<wbr>ExprConstant.cpp Sun Dec 11 20:53:20 2016<br class="m_8538426202314716646gmail_msg">
@@ -469,6 +469,10 @@ namespace {<br class="m_8538426202314716646gmail_msg">
     /// declaration whose initializer is being evaluated, if any.<br class="m_8538426202314716646gmail_msg">
     APValue *EvaluatingDeclValue;<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
+    /// The current array initialization index, if we're performing array<br class="m_8538426202314716646gmail_msg">
+    /// initialization.<br class="m_8538426202314716646gmail_msg">
+    uint64_t ArrayInitIndex = -1;<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
     /// HasActiveDiagnostic - Was the previous diagnostic stored? If so, further<br class="m_8538426202314716646gmail_msg">
     /// notes attached to it will also be stored, otherwise they will not be.<br class="m_8538426202314716646gmail_msg">
     bool HasActiveDiagnostic;<br class="m_8538426202314716646gmail_msg">
@@ -803,6 +807,20 @@ namespace {<br class="m_8538426202314716646gmail_msg">
     bool allowInvalidBaseExpr() const {<br class="m_8538426202314716646gmail_msg">
       return EvalMode == EM_DesignatorFold;<br class="m_8538426202314716646gmail_msg">
     }<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+    class ArrayInitLoopIndex {<br class="m_8538426202314716646gmail_msg">
+      EvalInfo &Info;<br class="m_8538426202314716646gmail_msg">
+      uint64_t OuterIndex;<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+    public:<br class="m_8538426202314716646gmail_msg">
+      ArrayInitLoopIndex(EvalInfo &Info)<br class="m_8538426202314716646gmail_msg">
+          : Info(Info), OuterIndex(Info.<wbr>ArrayInitIndex) {<br class="m_8538426202314716646gmail_msg">
+        Info.ArrayInitIndex = 0;<br class="m_8538426202314716646gmail_msg">
+      }<br class="m_8538426202314716646gmail_msg">
+      ~ArrayInitLoopIndex() { Info.ArrayInitIndex = OuterIndex; }<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+      operator uint64_t&() { return Info.ArrayInitIndex; }<br class="m_8538426202314716646gmail_msg">
+    };<br class="m_8538426202314716646gmail_msg">
   };<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
   /// Object used to treat all foldable expressions as constant expressions.<br class="m_8538426202314716646gmail_msg">
@@ -6190,6 +6208,7 @@ namespace {<br class="m_8538426202314716646gmail_msg">
       return handleCallExpr(E, Result, &This);<br class="m_8538426202314716646gmail_msg">
     }<br class="m_8538426202314716646gmail_msg">
     bool VisitInitListExpr(const InitListExpr *E);<br class="m_8538426202314716646gmail_msg">
+    bool VisitArrayInitLoopExpr(const ArrayInitLoopExpr *E);<br class="m_8538426202314716646gmail_msg">
     bool VisitCXXConstructExpr(const CXXConstructExpr *E);<br class="m_8538426202314716646gmail_msg">
     bool VisitCXXConstructExpr(const CXXConstructExpr *E,<br class="m_8538426202314716646gmail_msg">
                                const LValue &Subobject,<br class="m_8538426202314716646gmail_msg">
@@ -6272,6 +6291,35 @@ bool ArrayExprEvaluator::<wbr>VisitInitListEx<br class="m_8538426202314716646gmail_msg">
                          FillerExpr) && Success;<br class="m_8538426202314716646gmail_msg">
 }<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
+bool ArrayExprEvaluator::<wbr>VisitArrayInitLoopExpr(const ArrayInitLoopExpr *E) {<br class="m_8538426202314716646gmail_msg">
+  if (E->getCommonExpr() &&<br class="m_8538426202314716646gmail_msg">
+      !Evaluate(Info.CurrentCall-><wbr>createTemporary(E-><wbr>getCommonExpr(), false),<br class="m_8538426202314716646gmail_msg">
+                Info, E->getCommonExpr()-><wbr>getSourceExpr()))<br class="m_8538426202314716646gmail_msg">
+    return false;<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  auto *CAT = cast<ConstantArrayType>(E-><wbr>getType()-><wbr>castAsArrayTypeUnsafe());<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  uint64_t Elements = CAT->getSize().getZExtValue();<br class="m_8538426202314716646gmail_msg">
+  Result = APValue(APValue::UninitArray()<wbr>, Elements, Elements);<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  LValue Subobject = This;<br class="m_8538426202314716646gmail_msg">
+  Subobject.addArray(Info, E, CAT);<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  bool Success = true;<br class="m_8538426202314716646gmail_msg">
+  for (EvalInfo::ArrayInitLoopIndex Index(Info); Index != Elements; ++Index) {<br class="m_8538426202314716646gmail_msg">
+    if (!EvaluateInPlace(Result.<wbr>getArrayInitializedElt(Index),<br class="m_8538426202314716646gmail_msg">
+                         Info, Subobject, E->getSubExpr()) ||<br class="m_8538426202314716646gmail_msg">
+        !HandleLValueArrayAdjustment(<wbr>Info, E, Subobject,<br class="m_8538426202314716646gmail_msg">
+                                     CAT->getElementType(), 1)) {<br class="m_8538426202314716646gmail_msg">
+      if (!Info.noteFailure())<br class="m_8538426202314716646gmail_msg">
+        return false;<br class="m_8538426202314716646gmail_msg">
+      Success = false;<br class="m_8538426202314716646gmail_msg">
+    }<br class="m_8538426202314716646gmail_msg">
+  }<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  return Success;<br class="m_8538426202314716646gmail_msg">
+}<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
 bool ArrayExprEvaluator::<wbr>VisitCXXConstructExpr(const CXXConstructExpr *E) {<br class="m_8538426202314716646gmail_msg">
   return VisitCXXConstructExpr(E, This, &Result, E->getType());<br class="m_8538426202314716646gmail_msg">
 }<br class="m_8538426202314716646gmail_msg">
@@ -6427,6 +6475,16 @@ public:<br class="m_8538426202314716646gmail_msg">
   bool VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *E) {<br class="m_8538426202314716646gmail_msg">
     return Success(E->getValue(), E);<br class="m_8538426202314716646gmail_msg">
   }<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  bool VisitArrayInitIndexExpr(const ArrayInitIndexExpr *E) {<br class="m_8538426202314716646gmail_msg">
+    if (Info.ArrayInitIndex == uint64_t(-1)) {<br class="m_8538426202314716646gmail_msg">
+      // We were asked to evaluate this subexpression independent of the<br class="m_8538426202314716646gmail_msg">
+      // enclosing ArrayInitLoopExpr. We can't do that.<br class="m_8538426202314716646gmail_msg">
+      Info.FFDiag(E);<br class="m_8538426202314716646gmail_msg">
+      return false;<br class="m_8538426202314716646gmail_msg">
+    }<br class="m_8538426202314716646gmail_msg">
+    return Success(Info.ArrayInitIndex, E);<br class="m_8538426202314716646gmail_msg">
+  }<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
   // Note, GNU defines __null as an integer, not a pointer.<br class="m_8538426202314716646gmail_msg">
   bool VisitGNUNullExpr(const GNUNullExpr *E) {<br class="m_8538426202314716646gmail_msg">
@@ -9590,6 +9648,8 @@ static ICEDiag CheckICE(const Expr* E, c<br class="m_8538426202314716646gmail_msg">
   case Expr::<wbr>CompoundLiteralExprClass:<br class="m_8538426202314716646gmail_msg">
   case Expr::<wbr>ExtVectorElementExprClass:<br class="m_8538426202314716646gmail_msg">
   case Expr::DesignatedInitExprClass:<br class="m_8538426202314716646gmail_msg">
+  case Expr::ArrayInitLoopExprClass:<br class="m_8538426202314716646gmail_msg">
+  case Expr::ArrayInitIndexExprClass:<br class="m_8538426202314716646gmail_msg">
   case Expr::NoInitExprClass:<br class="m_8538426202314716646gmail_msg">
   case Expr::<wbr>DesignatedInitUpdateExprClass:<br class="m_8538426202314716646gmail_msg">
   case Expr::<wbr>ImplicitValueInitExprClass:<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
Modified: cfe/trunk/lib/AST/<wbr>ItaniumMangle.cpp<br class="m_8538426202314716646gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ItaniumMangle.cpp?rev=289413&r1=289412&r2=289413&view=diff" rel="noreferrer" class="m_8538426202314716646gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/AST/<wbr>ItaniumMangle.cpp?rev=289413&<wbr>r1=289412&r2=289413&view=diff</a><br class="m_8538426202314716646gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_8538426202314716646gmail_msg">
--- cfe/trunk/lib/AST/<wbr>ItaniumMangle.cpp (original)<br class="m_8538426202314716646gmail_msg">
+++ cfe/trunk/lib/AST/<wbr>ItaniumMangle.cpp Sun Dec 11 20:53:20 2016<br class="m_8538426202314716646gmail_msg">
@@ -3301,6 +3301,8 @@ recurse:<br class="m_8538426202314716646gmail_msg">
   case Expr::AddrLabelExprClass:<br class="m_8538426202314716646gmail_msg">
   case Expr::<wbr>DesignatedInitUpdateExprClass:<br class="m_8538426202314716646gmail_msg">
   case Expr::<wbr>ImplicitValueInitExprClass:<br class="m_8538426202314716646gmail_msg">
+  case Expr::ArrayInitLoopExprClass:<br class="m_8538426202314716646gmail_msg">
+  case Expr::ArrayInitIndexExprClass:<br class="m_8538426202314716646gmail_msg">
   case Expr::NoInitExprClass:<br class="m_8538426202314716646gmail_msg">
   case Expr::ParenListExprClass:<br class="m_8538426202314716646gmail_msg">
   case Expr::LambdaExprClass:<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
Modified: cfe/trunk/lib/AST/StmtPrinter.<wbr>cpp<br class="m_8538426202314716646gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtPrinter.cpp?rev=289413&r1=289412&r2=289413&view=diff" rel="noreferrer" class="m_8538426202314716646gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/AST/<wbr>StmtPrinter.cpp?rev=289413&r1=<wbr>289412&r2=289413&view=diff</a><br class="m_8538426202314716646gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_8538426202314716646gmail_msg">
--- cfe/trunk/lib/AST/StmtPrinter.<wbr>cpp (original)<br class="m_8538426202314716646gmail_msg">
+++ cfe/trunk/lib/AST/StmtPrinter.<wbr>cpp Sun Dec 11 20:53:20 2016<br class="m_8538426202314716646gmail_msg">
@@ -1705,6 +1705,18 @@ void StmtPrinter::<wbr>VisitInitListExpr(Init<br class="m_8538426202314716646gmail_msg">
   OS << "}";<br class="m_8538426202314716646gmail_msg">
 }<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
+void StmtPrinter::<wbr>VisitArrayInitLoopExpr(<wbr>ArrayInitLoopExpr *Node) {<br class="m_8538426202314716646gmail_msg">
+  // There's no way to express this expression in any of our supported<br class="m_8538426202314716646gmail_msg">
+  // languages, so just emit something terse and (hopefully) clear.<br class="m_8538426202314716646gmail_msg">
+  OS << "{";<br class="m_8538426202314716646gmail_msg">
+  PrintExpr(Node->getSubExpr());<br class="m_8538426202314716646gmail_msg">
+  OS << "}";<br class="m_8538426202314716646gmail_msg">
+}<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+void StmtPrinter::<wbr>VisitArrayInitIndexExpr(<wbr>ArrayInitIndexExpr *Node) {<br class="m_8538426202314716646gmail_msg">
+  OS << "*";<br class="m_8538426202314716646gmail_msg">
+}<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
 void StmtPrinter::<wbr>VisitParenListExpr(<wbr>ParenListExpr* Node) {<br class="m_8538426202314716646gmail_msg">
   OS << "(";<br class="m_8538426202314716646gmail_msg">
   for (unsigned i = 0, e = Node->getNumExprs(); i != e; ++i) {<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
Modified: cfe/trunk/lib/AST/StmtProfile.<wbr>cpp<br class="m_8538426202314716646gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtProfile.cpp?rev=289413&r1=289412&r2=289413&view=diff" rel="noreferrer" class="m_8538426202314716646gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/AST/<wbr>StmtProfile.cpp?rev=289413&r1=<wbr>289412&r2=289413&view=diff</a><br class="m_8538426202314716646gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_8538426202314716646gmail_msg">
--- cfe/trunk/lib/AST/StmtProfile.<wbr>cpp (original)<br class="m_8538426202314716646gmail_msg">
+++ cfe/trunk/lib/AST/StmtProfile.<wbr>cpp Sun Dec 11 20:53:20 2016<br class="m_8538426202314716646gmail_msg">
@@ -972,6 +972,14 @@ void StmtProfiler::<wbr>VisitDesignatedInitUp<br class="m_8538426202314716646gmail_msg">
                    "initializer");<br class="m_8538426202314716646gmail_msg">
 }<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
+void StmtProfiler::<wbr>VisitArrayInitLoopExpr(const ArrayInitLoopExpr *S) {<br class="m_8538426202314716646gmail_msg">
+  VisitExpr(S);<br class="m_8538426202314716646gmail_msg">
+}<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+void StmtProfiler::<wbr>VisitArrayInitIndexExpr(const ArrayInitIndexExpr *S) {<br class="m_8538426202314716646gmail_msg">
+  VisitExpr(S);<br class="m_8538426202314716646gmail_msg">
+}<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
 void StmtProfiler::VisitNoInitExpr(<wbr>const NoInitExpr *S) {<br class="m_8538426202314716646gmail_msg">
   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");<br class="m_8538426202314716646gmail_msg">
 }<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
Modified: cfe/trunk/lib/CodeGen/<wbr>CGExprAgg.cpp<br class="m_8538426202314716646gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprAgg.cpp?rev=289413&r1=289412&r2=289413&view=diff" rel="noreferrer" class="m_8538426202314716646gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/CodeGen/<wbr>CGExprAgg.cpp?rev=289413&r1=<wbr>289412&r2=289413&view=diff</a><br class="m_8538426202314716646gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_8538426202314716646gmail_msg">
--- cfe/trunk/lib/CodeGen/<wbr>CGExprAgg.cpp (original)<br class="m_8538426202314716646gmail_msg">
+++ cfe/trunk/lib/CodeGen/<wbr>CGExprAgg.cpp Sun Dec 11 20:53:20 2016<br class="m_8538426202314716646gmail_msg">
@@ -164,6 +164,7 @@ public:<br class="m_8538426202314716646gmail_msg">
   void VisitAbstractConditionalOperat<wbr>or(const AbstractConditionalOperator *CO);<br class="m_8538426202314716646gmail_msg">
   void VisitChooseExpr(const ChooseExpr *CE);<br class="m_8538426202314716646gmail_msg">
   void VisitInitListExpr(InitListExpr *E);<br class="m_8538426202314716646gmail_msg">
+  void VisitArrayInitLoopExpr(const ArrayInitLoopExpr *E);<br class="m_8538426202314716646gmail_msg">
   void VisitImplicitValueInitExpr(<wbr>ImplicitValueInitExpr *E);<br class="m_8538426202314716646gmail_msg">
   void VisitNoInitExpr(NoInitExpr *E) { } // Do nothing.<br class="m_8538426202314716646gmail_msg">
   void VisitCXXDefaultArgExpr(<wbr>CXXDefaultArgExpr *DAE) {<br class="m_8538426202314716646gmail_msg">
@@ -1308,6 +1309,85 @@ void AggExprEmitter::<wbr>VisitInitListExpr(I<br class="m_8538426202314716646gmail_msg">
     cleanupDominator-><wbr>eraseFromParent();<br class="m_8538426202314716646gmail_msg">
 }<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
+void AggExprEmitter::<wbr>VisitArrayInitLoopExpr(const ArrayInitLoopExpr *E) {<br class="m_8538426202314716646gmail_msg">
+  // Emit the common subexpression.<br class="m_8538426202314716646gmail_msg">
+  CodeGenFunction::<wbr>OpaqueValueMapping binding(CGF, E->getCommonExpr());<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  Address destPtr = EnsureSlot(E->getType()).<wbr>getAddress();<br class="m_8538426202314716646gmail_msg">
+  uint64_t numElements = E->getArraySize().<wbr>getZExtValue();<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  if (!numElements)<br class="m_8538426202314716646gmail_msg">
+    return;<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  // FIXME: Dig through nested ArrayInitLoopExprs to find the overall array<br class="m_8538426202314716646gmail_msg">
+  // size, and only emit a single loop for a multidimensional array.<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  // destPtr is an array*. Construct an elementType* by drilling down a level.<br class="m_8538426202314716646gmail_msg">
+  llvm::Value *zero = llvm::ConstantInt::get(CGF.<wbr>SizeTy, 0);<br class="m_8538426202314716646gmail_msg">
+  llvm::Value *indices[] = {zero, zero};<br class="m_8538426202314716646gmail_msg">
+  llvm::Value *begin = Builder.CreateInBoundsGEP(<wbr>destPtr.getPointer(), indices,<br class="m_8538426202314716646gmail_msg">
+                                                 "arrayinit.begin");<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  QualType elementType = E->getSubExpr()->getType();<br class="m_8538426202314716646gmail_msg">
+  CharUnits elementSize = CGF.getContext().<wbr>getTypeSizeInChars(<wbr>elementType);<br class="m_8538426202314716646gmail_msg">
+  CharUnits elementAlign =<br class="m_8538426202314716646gmail_msg">
+      destPtr.getAlignment().<wbr>alignmentOfArrayElement(<wbr>elementSize);<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  // Prepare for a cleanup.<br class="m_8538426202314716646gmail_msg">
+  QualType::DestructionKind dtorKind = elementType.isDestructedType()<wbr>;<br class="m_8538426202314716646gmail_msg">
+  Address endOfInit = Address::invalid();<br class="m_8538426202314716646gmail_msg">
+  EHScopeStack::stable_iterator cleanup;<br class="m_8538426202314716646gmail_msg">
+  llvm::Instruction *cleanupDominator = nullptr;<br class="m_8538426202314716646gmail_msg">
+  if (CGF.needsEHCleanup(dtorKind)) {<br class="m_8538426202314716646gmail_msg">
+    endOfInit = CGF.CreateTempAlloca(begin-><wbr>getType(), CGF.getPointerAlign(),<br class="m_8538426202314716646gmail_msg">
+                                     "arrayinit.endOfInit");<br class="m_8538426202314716646gmail_msg">
+    CGF.<wbr>pushIrregularPartialArrayClean<wbr>up(begin, endOfInit, elementType,<br class="m_8538426202314716646gmail_msg">
+                                         elementAlign,<br class="m_8538426202314716646gmail_msg">
+                                         CGF.getDestroyer(dtorKind));<br class="m_8538426202314716646gmail_msg">
+    cleanup = CGF.EHStack.stable_begin();<br class="m_8538426202314716646gmail_msg">
+  } else {<br class="m_8538426202314716646gmail_msg">
+    dtorKind = QualType::DK_none;<br class="m_8538426202314716646gmail_msg">
+  }<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  llvm::BasicBlock *entryBB = Builder.GetInsertBlock();<br class="m_8538426202314716646gmail_msg">
+  llvm::BasicBlock *bodyBB = CGF.createBasicBlock("<wbr>arrayinit.body");<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  // Jump into the body.<br class="m_8538426202314716646gmail_msg">
+  CGF.EmitBlock(bodyBB);<br class="m_8538426202314716646gmail_msg">
+  llvm::PHINode *index =<br class="m_8538426202314716646gmail_msg">
+      Builder.CreatePHI(zero-><wbr>getType(), 2, "arrayinit.index");<br class="m_8538426202314716646gmail_msg">
+  index->addIncoming(zero, entryBB);<br class="m_8538426202314716646gmail_msg">
+  llvm::Value *element = Builder.CreateInBoundsGEP(<wbr>begin, index);<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  // Tell the EH cleanup that we finished with the last element.<br class="m_8538426202314716646gmail_msg">
+  if (endOfInit.isValid()) Builder.CreateStore(element, endOfInit);<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  // Emit the actual filler expression.<br class="m_8538426202314716646gmail_msg">
+  {<br class="m_8538426202314716646gmail_msg">
+    CodeGenFunction::<wbr>ArrayInitLoopExprScope Scope(CGF, index);<br class="m_8538426202314716646gmail_msg">
+    LValue elementLV =<br class="m_8538426202314716646gmail_msg">
+        CGF.MakeAddrLValue(Address(<wbr>element, elementAlign), elementType);<br class="m_8538426202314716646gmail_msg">
+    EmitInitializationToLValue(E-><wbr>getSubExpr(), elementLV);<br class="m_8538426202314716646gmail_msg">
+  }<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  // Move on to the next element.<br class="m_8538426202314716646gmail_msg">
+  llvm::Value *nextIndex = Builder.CreateNUWAdd(<br class="m_8538426202314716646gmail_msg">
+      index, llvm::ConstantInt::get(CGF.<wbr>SizeTy, 1), "arrayinit.next");<br class="m_8538426202314716646gmail_msg">
+  index->addIncoming(nextIndex, Builder.GetInsertBlock());<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  // Leave the loop if we're done.<br class="m_8538426202314716646gmail_msg">
+  llvm::Value *done = Builder.CreateICmpEQ(<br class="m_8538426202314716646gmail_msg">
+      nextIndex, llvm::ConstantInt::get(CGF.<wbr>SizeTy, numElements),<br class="m_8538426202314716646gmail_msg">
+      "arrayinit.done");<br class="m_8538426202314716646gmail_msg">
+  llvm::BasicBlock *endBB = CGF.createBasicBlock("<wbr>arrayinit.end");<br class="m_8538426202314716646gmail_msg">
+  Builder.CreateCondBr(done, endBB, bodyBB);<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  CGF.EmitBlock(endBB);<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  // Leave the partial-array cleanup if we entered one.<br class="m_8538426202314716646gmail_msg">
+  if (dtorKind) CGF.DeactivateCleanupBlock(<wbr>cleanup, cleanupDominator);<br class="m_8538426202314716646gmail_msg">
+}<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
 void AggExprEmitter::<wbr>VisitDesignatedInitUpdateExpr(<wbr>DesignatedInitUpdateExpr *E) {<br class="m_8538426202314716646gmail_msg">
   AggValueSlot Dest = EnsureSlot(E->getType());<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
Modified: cfe/trunk/lib/CodeGen/<wbr>CGExprScalar.cpp<br class="m_8538426202314716646gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprScalar.cpp?rev=289413&r1=289412&r2=289413&view=diff" rel="noreferrer" class="m_8538426202314716646gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/CodeGen/<wbr>CGExprScalar.cpp?rev=289413&<wbr>r1=289412&r2=289413&view=diff</a><br class="m_8538426202314716646gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_8538426202314716646gmail_msg">
--- cfe/trunk/lib/CodeGen/<wbr>CGExprScalar.cpp (original)<br class="m_8538426202314716646gmail_msg">
+++ cfe/trunk/lib/CodeGen/<wbr>CGExprScalar.cpp Sun Dec 11 20:53:20 2016<br class="m_8538426202314716646gmail_msg">
@@ -311,6 +311,12 @@ public:<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
   Value *VisitInitListExpr(<wbr>InitListExpr *E);<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
+  Value *VisitArrayInitIndexExpr(<wbr>ArrayInitIndexExpr *E) {<br class="m_8538426202314716646gmail_msg">
+    assert(CGF.getArrayInitIndex() &&<br class="m_8538426202314716646gmail_msg">
+           "ArrayInitIndexExpr not inside an ArrayInitLoopExpr?");<br class="m_8538426202314716646gmail_msg">
+    return CGF.getArrayInitIndex();<br class="m_8538426202314716646gmail_msg">
+  }<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
   Value *VisitImplicitValueInitExpr(<wbr>const ImplicitValueInitExpr *E) {<br class="m_8538426202314716646gmail_msg">
     return EmitNullValue(E->getType());<br class="m_8538426202314716646gmail_msg">
   }<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
Modified: cfe/trunk/lib/CodeGen/<wbr>CodeGenFunction.h<br class="m_8538426202314716646gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=289413&r1=289412&r2=289413&view=diff" rel="noreferrer" class="m_8538426202314716646gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/CodeGen/<wbr>CodeGenFunction.h?rev=289413&<wbr>r1=289412&r2=289413&view=diff</a><br class="m_8538426202314716646gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_8538426202314716646gmail_msg">
--- cfe/trunk/lib/CodeGen/<wbr>CodeGenFunction.h (original)<br class="m_8538426202314716646gmail_msg">
+++ cfe/trunk/lib/CodeGen/<wbr>CodeGenFunction.h Sun Dec 11 20:53:20 2016<br class="m_8538426202314716646gmail_msg">
@@ -918,6 +918,17 @@ public:<br class="m_8538426202314716646gmail_msg">
                                           e->getCommon());<br class="m_8538426202314716646gmail_msg">
     }<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
+    /// Build the opaque value mapping for an OpaqueValueExpr whose source<br class="m_8538426202314716646gmail_msg">
+    /// expression is set to the expression the OVE represents.<br class="m_8538426202314716646gmail_msg">
+    OpaqueValueMapping(<wbr>CodeGenFunction &CGF, const OpaqueValueExpr *OV)<br class="m_8538426202314716646gmail_msg">
+        : CGF(CGF) {<br class="m_8538426202314716646gmail_msg">
+      if (OV) {<br class="m_8538426202314716646gmail_msg">
+        assert(OV->getSourceExpr() && "wrong form of OpaqueValueMapping used "<br class="m_8538426202314716646gmail_msg">
+                                      "for OVE with no source expression");<br class="m_8538426202314716646gmail_msg">
+        Data = OpaqueValueMappingData::bind(<wbr>CGF, OV, OV->getSourceExpr());<br class="m_8538426202314716646gmail_msg">
+      }<br class="m_8538426202314716646gmail_msg">
+    }<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
     OpaqueValueMapping(<wbr>CodeGenFunction &CGF,<br class="m_8538426202314716646gmail_msg">
                        const OpaqueValueExpr *opaqueValue,<br class="m_8538426202314716646gmail_msg">
                        LValue lvalue)<br class="m_8538426202314716646gmail_msg">
@@ -1183,6 +1194,23 @@ public:<br class="m_8538426202314716646gmail_msg">
     CharUnits OldCXXThisAlignment;<br class="m_8538426202314716646gmail_msg">
   };<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
+  /// The scope of an ArrayInitLoopExpr. Within this scope, the value of the<br class="m_8538426202314716646gmail_msg">
+  /// current loop index is overridden.<br class="m_8538426202314716646gmail_msg">
+  class ArrayInitLoopExprScope {<br class="m_8538426202314716646gmail_msg">
+  public:<br class="m_8538426202314716646gmail_msg">
+    ArrayInitLoopExprScope(<wbr>CodeGenFunction &CGF, llvm::Value *Index)<br class="m_8538426202314716646gmail_msg">
+      : CGF(CGF), OldArrayInitIndex(CGF.<wbr>ArrayInitIndex) {<br class="m_8538426202314716646gmail_msg">
+      CGF.ArrayInitIndex = Index;<br class="m_8538426202314716646gmail_msg">
+    }<br class="m_8538426202314716646gmail_msg">
+    ~ArrayInitLoopExprScope() {<br class="m_8538426202314716646gmail_msg">
+      CGF.ArrayInitIndex = OldArrayInitIndex;<br class="m_8538426202314716646gmail_msg">
+    }<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  private:<br class="m_8538426202314716646gmail_msg">
+    CodeGenFunction &CGF;<br class="m_8538426202314716646gmail_msg">
+    llvm::Value *OldArrayInitIndex;<br class="m_8538426202314716646gmail_msg">
+  };<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
   class InlinedInheritingConstructorSc<wbr>ope {<br class="m_8538426202314716646gmail_msg">
   public:<br class="m_8538426202314716646gmail_msg">
     <wbr>InlinedInheritingConstructorSc<wbr>ope(CodeGenFunction &CGF, GlobalDecl GD)<br class="m_8538426202314716646gmail_msg">
@@ -1251,6 +1279,10 @@ private:<br class="m_8538426202314716646gmail_msg">
   /// this expression.<br class="m_8538426202314716646gmail_msg">
   Address CXXDefaultInitExprThis = Address::invalid();<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
+  /// The current array initialization index when evaluating an<br class="m_8538426202314716646gmail_msg">
+  /// ArrayInitIndexExpr within an ArrayInitLoopExpr.<br class="m_8538426202314716646gmail_msg">
+  llvm::Value *ArrayInitIndex = nullptr;<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
   /// The values of function arguments to use when evaluating<br class="m_8538426202314716646gmail_msg">
   /// CXXInheritedCtorInitExprs within this context.<br class="m_8538426202314716646gmail_msg">
   CallArgList CXXInheritedCtorInitExprArgs;<br class="m_8538426202314716646gmail_msg">
@@ -1953,6 +1985,9 @@ public:<br class="m_8538426202314716646gmail_msg">
     return it->second;<br class="m_8538426202314716646gmail_msg">
   }<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
+  /// Get the index of the current ArrayInitLoopExpr, if any.<br class="m_8538426202314716646gmail_msg">
+  llvm::Value *getArrayInitIndex() { return ArrayInitIndex; }<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
   /// getAccessedFieldNo - Given an encoded value and a result number, return<br class="m_8538426202314716646gmail_msg">
   /// the input field number being accessed.<br class="m_8538426202314716646gmail_msg">
   static unsigned getAccessedFieldNo(unsigned Idx, const llvm::Constant *Elts);<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
Modified: cfe/trunk/lib/Sema/<wbr>SemaExceptionSpec.cpp<br class="m_8538426202314716646gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExceptionSpec.cpp?rev=289413&r1=289412&r2=289413&view=diff" rel="noreferrer" class="m_8538426202314716646gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Sema/<wbr>SemaExceptionSpec.cpp?rev=<wbr>289413&r1=289412&r2=289413&<wbr>view=diff</a><br class="m_8538426202314716646gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_8538426202314716646gmail_msg">
--- cfe/trunk/lib/Sema/<wbr>SemaExceptionSpec.cpp (original)<br class="m_8538426202314716646gmail_msg">
+++ cfe/trunk/lib/Sema/<wbr>SemaExceptionSpec.cpp Sun Dec 11 20:53:20 2016<br class="m_8538426202314716646gmail_msg">
@@ -1166,6 +1166,7 @@ CanThrowResult Sema::canThrow(const Expr<br class="m_8538426202314716646gmail_msg">
   case Expr::ExprWithCleanupsClass:<br class="m_8538426202314716646gmail_msg">
   case Expr::<wbr>ExtVectorElementExprClass:<br class="m_8538426202314716646gmail_msg">
   case Expr::InitListExprClass:<br class="m_8538426202314716646gmail_msg">
+  case Expr::ArrayInitLoopExprClass:<br class="m_8538426202314716646gmail_msg">
   case Expr::MemberExprClass:<br class="m_8538426202314716646gmail_msg">
   case Expr::ObjCIsaExprClass:<br class="m_8538426202314716646gmail_msg">
   case Expr::ObjCIvarRefExprClass:<br class="m_8538426202314716646gmail_msg">
@@ -1259,6 +1260,7 @@ CanThrowResult Sema::canThrow(const Expr<br class="m_8538426202314716646gmail_msg">
   case Expr::ImaginaryLiteralClass:<br class="m_8538426202314716646gmail_msg">
   case Expr::<wbr>ImplicitValueInitExprClass:<br class="m_8538426202314716646gmail_msg">
   case Expr::IntegerLiteralClass:<br class="m_8538426202314716646gmail_msg">
+  case Expr::ArrayInitIndexExprClass:<br class="m_8538426202314716646gmail_msg">
   case Expr::NoInitExprClass:<br class="m_8538426202314716646gmail_msg">
   case Expr::ObjCEncodeExprClass:<br class="m_8538426202314716646gmail_msg">
   case Expr::ObjCStringLiteralClass:<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
Modified: cfe/trunk/lib/Sema/SemaInit.<wbr>cpp<br class="m_8538426202314716646gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaInit.cpp?rev=289413&r1=289412&r2=289413&view=diff" rel="noreferrer" class="m_8538426202314716646gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Sema/<wbr>SemaInit.cpp?rev=289413&r1=<wbr>289412&r2=289413&view=diff</a><br class="m_8538426202314716646gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_8538426202314716646gmail_msg">
--- cfe/trunk/lib/Sema/SemaInit.<wbr>cpp (original)<br class="m_8538426202314716646gmail_msg">
+++ cfe/trunk/lib/Sema/SemaInit.<wbr>cpp Sun Dec 11 20:53:20 2016<br class="m_8538426202314716646gmail_msg">
@@ -2910,7 +2910,7 @@ DeclarationName InitializedEntity::getNa<br class="m_8538426202314716646gmail_msg">
   case EK_Variable:<br class="m_8538426202314716646gmail_msg">
   case EK_Member:<br class="m_8538426202314716646gmail_msg">
   case EK_Binding:<br class="m_8538426202314716646gmail_msg">
-    return VariableOrMember->getDeclName(<wbr>);<br class="m_8538426202314716646gmail_msg">
+    return Variable.VariableOrMember-><wbr>getDeclName();<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
   case EK_LambdaCapture:<br class="m_8538426202314716646gmail_msg">
     return DeclarationName(Capture.VarID)<wbr>;<br class="m_8538426202314716646gmail_msg">
@@ -2938,7 +2938,7 @@ ValueDecl *InitializedEntity::getDecl()<br class="m_8538426202314716646gmail_msg">
   case EK_Variable:<br class="m_8538426202314716646gmail_msg">
   case EK_Member:<br class="m_8538426202314716646gmail_msg">
   case EK_Binding:<br class="m_8538426202314716646gmail_msg">
-    return VariableOrMember;<br class="m_8538426202314716646gmail_msg">
+    return Variable.VariableOrMember;<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
   case EK_Parameter:<br class="m_8538426202314716646gmail_msg">
   case EK_Parameter_CF_Audited:<br class="m_8538426202314716646gmail_msg">
@@ -3065,6 +3065,8 @@ void InitializationSequence::Step::<wbr>Destr<br class="m_8538426202314716646gmail_msg">
   case SK_CAssignment:<br class="m_8538426202314716646gmail_msg">
   case SK_StringInit:<br class="m_8538426202314716646gmail_msg">
   case SK_ObjCObjectConversion:<br class="m_8538426202314716646gmail_msg">
+  case SK_ArrayLoopIndex:<br class="m_8538426202314716646gmail_msg">
+  case SK_ArrayLoopInit:<br class="m_8538426202314716646gmail_msg">
   case SK_ArrayInit:<br class="m_8538426202314716646gmail_msg">
   case SK_ParenthesizedArrayInit:<br class="m_8538426202314716646gmail_msg">
   case SK_PassByIndirectCopyRestore:<br class="m_8538426202314716646gmail_msg">
@@ -3307,6 +3309,17 @@ void InitializationSequence::<wbr>AddArrayIni<br class="m_8538426202314716646gmail_msg">
   Steps.push_back(S);<br class="m_8538426202314716646gmail_msg">
 }<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
+void InitializationSequence::<wbr>AddArrayInitLoopStep(QualType T, QualType EltT) {<br class="m_8538426202314716646gmail_msg">
+  Step S;<br class="m_8538426202314716646gmail_msg">
+  S.Kind = SK_ArrayLoopIndex;<br class="m_8538426202314716646gmail_msg">
+  S.Type = EltT;<br class="m_8538426202314716646gmail_msg">
+  Steps.insert(Steps.begin(), S);<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  S.Kind = SK_ArrayLoopInit;<br class="m_8538426202314716646gmail_msg">
+  S.Type = T;<br class="m_8538426202314716646gmail_msg">
+  Steps.push_back(S);<br class="m_8538426202314716646gmail_msg">
+}<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
 void InitializationSequence::<wbr>AddParenthesizedArrayInitStep(<wbr>QualType T) {<br class="m_8538426202314716646gmail_msg">
   Step S;<br class="m_8538426202314716646gmail_msg">
   S.Kind = SK_ParenthesizedArrayInit;<br class="m_8538426202314716646gmail_msg">
@@ -3552,6 +3565,9 @@ ResolveConstructorOverload(<wbr>Sema &S, Sour<br class="m_8538426202314716646gmail_msg">
 /// \brief Attempt initialization by constructor (C++ [dcl.init]), which<br class="m_8538426202314716646gmail_msg">
 /// enumerates the constructors of the initialized entity and performs overload<br class="m_8538426202314716646gmail_msg">
 /// resolution to select the best.<br class="m_8538426202314716646gmail_msg">
+/// \param DestType       The destination class type.<br class="m_8538426202314716646gmail_msg">
+/// \param DestArrayType  The destination type, which is either DestType or<br class="m_8538426202314716646gmail_msg">
+///                       a (possibly multidimensional) array of DestType.<br class="m_8538426202314716646gmail_msg">
 /// \param IsListInit     Is this list-initialization?<br class="m_8538426202314716646gmail_msg">
 /// \param IsInitListCopy Is this non-list-initialization resulting from a<br class="m_8538426202314716646gmail_msg">
 ///                       list-initialization from {x} where x is the same<br class="m_8538426202314716646gmail_msg">
@@ -3560,6 +3576,7 @@ static void TryConstructorInitialization<br class="m_8538426202314716646gmail_msg">
                                          const InitializedEntity &Entity,<br class="m_8538426202314716646gmail_msg">
                                          const InitializationKind &Kind,<br class="m_8538426202314716646gmail_msg">
                                          MultiExprArg Args, QualType DestType,<br class="m_8538426202314716646gmail_msg">
+                                         QualType DestArrayType,<br class="m_8538426202314716646gmail_msg">
                                          InitializationSequence &Sequence,<br class="m_8538426202314716646gmail_msg">
                                          bool IsListInit = false,<br class="m_8538426202314716646gmail_msg">
                                          bool IsInitListCopy = false) {<br class="m_8538426202314716646gmail_msg">
@@ -3703,7 +3720,7 @@ static void TryConstructorInitialization<br class="m_8538426202314716646gmail_msg">
   // subsumed by the initialization.<br class="m_8538426202314716646gmail_msg">
   bool HadMultipleCandidates = (CandidateSet.size() > 1);<br class="m_8538426202314716646gmail_msg">
   Sequence.<wbr>AddConstructorInitializationSt<wbr>ep(<br class="m_8538426202314716646gmail_msg">
-      Best->FoundDecl, CtorDecl, DestType, HadMultipleCandidates,<br class="m_8538426202314716646gmail_msg">
+      Best->FoundDecl, CtorDecl, DestArrayType, HadMultipleCandidates,<br class="m_8538426202314716646gmail_msg">
       IsListInit | IsInitListCopy, AsInitializerList);<br class="m_8538426202314716646gmail_msg">
 }<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
@@ -3871,8 +3888,9 @@ static void TryListInitialization(Sema &<br class="m_8538426202314716646gmail_msg">
           S.IsDerivedFrom(InitList-><wbr>getLocStart(), InitType, DestType)) {<br class="m_8538426202314716646gmail_msg">
         Expr *InitListAsExpr = InitList;<br class="m_8538426202314716646gmail_msg">
         TryConstructorInitialization(<wbr>S, Entity, Kind, InitListAsExpr, DestType,<br class="m_8538426202314716646gmail_msg">
-                                     Sequence, /*InitListSyntax*/ false,<br class="m_8538426202314716646gmail_msg">
-                                     /*IsInitListCopy*/ true);<br class="m_8538426202314716646gmail_msg">
+                                     DestType, Sequence,<br class="m_8538426202314716646gmail_msg">
+                                     /*InitListSyntax*/false,<br class="m_8538426202314716646gmail_msg">
+                                     /*IsInitListCopy*/true);<br class="m_8538426202314716646gmail_msg">
         return;<br class="m_8538426202314716646gmail_msg">
       }<br class="m_8538426202314716646gmail_msg">
     }<br class="m_8538426202314716646gmail_msg">
@@ -3927,7 +3945,7 @@ static void TryListInitialization(Sema &<br class="m_8538426202314716646gmail_msg">
       //   - Otherwise, if T is a class type, constructors are considered.<br class="m_8538426202314716646gmail_msg">
       Expr *InitListAsExpr = InitList;<br class="m_8538426202314716646gmail_msg">
       TryConstructorInitialization(<wbr>S, Entity, Kind, InitListAsExpr, DestType,<br class="m_8538426202314716646gmail_msg">
-                                   Sequence, /*InitListSyntax*/ true);<br class="m_8538426202314716646gmail_msg">
+                                   DestType, Sequence, /*InitListSyntax*/true);<br class="m_8538426202314716646gmail_msg">
     } else<br class="m_8538426202314716646gmail_msg">
       Sequence.SetFailed(<wbr>InitializationSequence::FK_<wbr>InitListBadDestinationType);<br class="m_8538426202314716646gmail_msg">
     return;<br class="m_8538426202314716646gmail_msg">
@@ -4580,8 +4598,10 @@ static void TryValueInitialization(Sema<br class="m_8538426202314716646gmail_msg">
       MultiExprArg Args(&InitListAsExpr, InitList ? 1 : 0);<br class="m_8538426202314716646gmail_msg">
       bool InitListSyntax = InitList;<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
-      return TryConstructorInitialization(<wbr>S, Entity, Kind, Args, T, Sequence,<br class="m_8538426202314716646gmail_msg">
-                                          InitListSyntax);<br class="m_8538426202314716646gmail_msg">
+      // FIXME: Instead of creating a CXXConstructExpr of non-array type here,<br class="m_8538426202314716646gmail_msg">
+      // wrap a class-typed CXXConstructExpr in an ArrayInitLoopExpr.<br class="m_8538426202314716646gmail_msg">
+      return TryConstructorInitialization(<br class="m_8538426202314716646gmail_msg">
+          S, Entity, Kind, Args, T, Entity.getType(), Sequence, InitListSyntax);<br class="m_8538426202314716646gmail_msg">
     }<br class="m_8538426202314716646gmail_msg">
   }<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
@@ -4604,7 +4624,8 @@ static void TryDefaultInitialization(Sem<br class="m_8538426202314716646gmail_msg">
   //       constructor for T is called (and the initialization is ill-formed if<br class="m_8538426202314716646gmail_msg">
   //       T has no accessible default constructor);<br class="m_8538426202314716646gmail_msg">
   if (DestType->isRecordType() && S.getLangOpts().CPlusPlus) {<br class="m_8538426202314716646gmail_msg">
-    TryConstructorInitialization(<wbr>S, Entity, Kind, None, DestType, Sequence);<br class="m_8538426202314716646gmail_msg">
+    TryConstructorInitialization(<wbr>S, Entity, Kind, None, DestType,<br class="m_8538426202314716646gmail_msg">
+                                 Entity.getType(), Sequence);<br class="m_8538426202314716646gmail_msg">
     return;<br class="m_8538426202314716646gmail_msg">
   }<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
@@ -5030,6 +5051,42 @@ static bool isExprAnUnaddressableFunctio<br class="m_8538426202314716646gmail_msg">
       cast<FunctionDecl>(DRE-><wbr>getDecl()));<br class="m_8538426202314716646gmail_msg">
 }<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
+/// Determine whether we can perform an elementwise array copy for this kind<br class="m_8538426202314716646gmail_msg">
+/// of entity.<br class="m_8538426202314716646gmail_msg">
+static bool canPerformArrayCopy(const InitializedEntity &Entity) {<br class="m_8538426202314716646gmail_msg">
+  switch (Entity.getKind()) {<br class="m_8538426202314716646gmail_msg">
+  case InitializedEntity::EK_<wbr>LambdaCapture:<br class="m_8538426202314716646gmail_msg">
+    // C++ [expr.prim.lambda]p24:<br class="m_8538426202314716646gmail_msg">
+    //   For array members, the array elements are direct-initialized in<br class="m_8538426202314716646gmail_msg">
+    //   increasing subscript order.<br class="m_8538426202314716646gmail_msg">
+    return true;<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  case InitializedEntity::EK_<wbr>Variable:<br class="m_8538426202314716646gmail_msg">
+    // C++ [dcl.decomp]p1:<br class="m_8538426202314716646gmail_msg">
+    //   [...] each element is copy-initialized or direct-initialized from the<br class="m_8538426202314716646gmail_msg">
+    //   corresponding element of the assignment-expression [...]<br class="m_8538426202314716646gmail_msg">
+    return isa<DecompositionDecl>(Entity.<wbr>getDecl());<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  case InitializedEntity::EK_Member:<br class="m_8538426202314716646gmail_msg">
+    // C++ [class.copy.ctor]p14:<br class="m_8538426202314716646gmail_msg">
+    //   - if the member is an array, each element is direct-initialized with<br class="m_8538426202314716646gmail_msg">
+    //     the corresponding subobject of x<br class="m_8538426202314716646gmail_msg">
+    return Entity.<wbr>isImplicitMemberInitializer();<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  case InitializedEntity::EK_<wbr>ArrayElement:<br class="m_8538426202314716646gmail_msg">
+    // All the above cases are intended to apply recursively, even though none<br class="m_8538426202314716646gmail_msg">
+    // of them actually say that.<br class="m_8538426202314716646gmail_msg">
+    if (auto *E = Entity.getParent())<br class="m_8538426202314716646gmail_msg">
+      return canPerformArrayCopy(*E);<br class="m_8538426202314716646gmail_msg">
+    break;<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  default:<br class="m_8538426202314716646gmail_msg">
+    break;<br class="m_8538426202314716646gmail_msg">
+  }<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+  return false;<br class="m_8538426202314716646gmail_msg">
+}<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
 void InitializationSequence::<wbr>InitializeFrom(Sema &S,<br class="m_8538426202314716646gmail_msg">
                                             const InitializedEntity &Entity,<br class="m_8538426202314716646gmail_msg">
                                             const InitializationKind &Kind,<br class="m_8538426202314716646gmail_msg">
@@ -5152,6 +5209,34 @@ void InitializationSequence::<wbr>InitializeF<br class="m_8538426202314716646gmail_msg">
       }<br class="m_8538426202314716646gmail_msg">
     }<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
+    // Some kinds of initialization permit an array to be initialized from<br class="m_8538426202314716646gmail_msg">
+    // another array of the same type, and perform elementwise initialization.<br class="m_8538426202314716646gmail_msg">
+    if (Initializer && isa<ConstantArrayType>(DestAT) &&<br class="m_8538426202314716646gmail_msg">
+        S.Context.<wbr>hasSameUnqualifiedType(<wbr>Initializer->getType(),<br class="m_8538426202314716646gmail_msg">
+                                         Entity.getType()) &&<br class="m_8538426202314716646gmail_msg">
+        canPerformArrayCopy(Entity)) {<br class="m_8538426202314716646gmail_msg">
+      // If source is a prvalue, use it directly.<br class="m_8538426202314716646gmail_msg">
+      if (Initializer->getValueKind() == VK_RValue) {<br class="m_8538426202314716646gmail_msg">
+        // FIXME: This produces a bogus extwarn<br class="m_8538426202314716646gmail_msg">
+        AddArrayInitStep(DestType);<br class="m_8538426202314716646gmail_msg">
+        return;<br class="m_8538426202314716646gmail_msg">
+      }<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+      // Emit element-at-a-time copy loop.<br class="m_8538426202314716646gmail_msg">
+      InitializedEntity Element =<br class="m_8538426202314716646gmail_msg">
+          InitializedEntity::<wbr>InitializeElement(S.Context, 0, Entity);<br class="m_8538426202314716646gmail_msg">
+      QualType InitEltT =<br class="m_8538426202314716646gmail_msg">
+          Context.getAsArrayType(<wbr>Initializer->getType())-><wbr>getElementType();<br class="m_8538426202314716646gmail_msg">
+      OpaqueValueExpr OVE(SourceLocation(), InitEltT,<br class="m_8538426202314716646gmail_msg">
+                          Initializer->getValueKind());<br class="m_8538426202314716646gmail_msg">
+      Expr *OVEAsExpr = &OVE;<br class="m_8538426202314716646gmail_msg">
+      InitializeFrom(S, Element, Kind, OVEAsExpr, TopLevelOfInitList,<br class="m_8538426202314716646gmail_msg">
+                     TreatUnavailableAsInvalid);<br class="m_8538426202314716646gmail_msg">
+      if (!Failed())<br class="m_8538426202314716646gmail_msg">
+        AddArrayInitLoopStep(Entity.<wbr>getType(), InitEltT);<br class="m_8538426202314716646gmail_msg">
+      return;<br class="m_8538426202314716646gmail_msg">
+    }<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
     // Note: as an GNU C extension, we allow initialization of an<br class="m_8538426202314716646gmail_msg">
     // array from a compound literal that creates an array of the same<br class="m_8538426202314716646gmail_msg">
     // type, so long as the initializer has no side effects.<br class="m_8538426202314716646gmail_msg">
@@ -5225,7 +5310,7 @@ void InitializationSequence::<wbr>InitializeF<br class="m_8538426202314716646gmail_msg">
          (Context.<wbr>hasSameUnqualifiedType(<wbr>SourceType, DestType) ||<br class="m_8538426202314716646gmail_msg">
           S.IsDerivedFrom(Initializer-><wbr>getLocStart(), SourceType, DestType))))<br class="m_8538426202314716646gmail_msg">
       TryConstructorInitialization(<wbr>S, Entity, Kind, Args,<br class="m_8538426202314716646gmail_msg">
-                                   DestType, *this);<br class="m_8538426202314716646gmail_msg">
+                                   DestType, DestType, *this);<br class="m_8538426202314716646gmail_msg">
     //     - Otherwise (i.e., for the remaining copy-initialization cases),<br class="m_8538426202314716646gmail_msg">
     //       user-defined conversion sequences that can convert from the source<br class="m_8538426202314716646gmail_msg">
     //       type to the destination type or (when a conversion function is<br class="m_8538426202314716646gmail_msg">
@@ -5842,7 +5927,7 @@ PerformConstructorInitializati<wbr>on(Sema &S<br class="m_8538426202314716646gmail_msg">
     // If the entity allows NRVO, mark the construction as elidable<br class="m_8538426202314716646gmail_msg">
     // unconditionally.<br class="m_8538426202314716646gmail_msg">
     if (Entity.allowsNRVO())<br class="m_8538426202314716646gmail_msg">
-      CurInit = S.BuildCXXConstructExpr(Loc, Entity.getType(),<br class="m_8538426202314716646gmail_msg">
+      CurInit = S.BuildCXXConstructExpr(Loc, Step.Type,<br class="m_8538426202314716646gmail_msg">
                                         Step.Function.FoundDecl,<br class="m_8538426202314716646gmail_msg">
                                         Constructor, /*Elidable=*/true,<br class="m_8538426202314716646gmail_msg">
                                         ConstructorArgs,<br class="m_8538426202314716646gmail_msg">
@@ -5853,7 +5938,7 @@ PerformConstructorInitializati<wbr>on(Sema &S<br class="m_8538426202314716646gmail_msg">
                                         ConstructKind,<br class="m_8538426202314716646gmail_msg">
                                         ParenOrBraceRange);<br class="m_8538426202314716646gmail_msg">
     else<br class="m_8538426202314716646gmail_msg">
-      CurInit = S.BuildCXXConstructExpr(Loc, Entity.getType(),<br class="m_8538426202314716646gmail_msg">
+      CurInit = S.BuildCXXConstructExpr(Loc, Step.Type,<br class="m_8538426202314716646gmail_msg">
                                         Step.Function.FoundDecl,<br class="m_8538426202314716646gmail_msg">
                                         Constructor,<br class="m_8538426202314716646gmail_msg">
                                         ConstructorArgs,<br class="m_8538426202314716646gmail_msg">
@@ -6403,6 +6488,7 @@ InitializationSequence::<wbr>Perform(Sema &S,<br class="m_8538426202314716646gmail_msg">
                                      Entity.getType();<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
   ExprResult CurInit((Expr *)nullptr);<br class="m_8538426202314716646gmail_msg">
+  SmallVector<Expr*, 4> ArrayLoopCommonExprs;<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
   // For initialization steps that start with a single initializer,<br class="m_8538426202314716646gmail_msg">
   // grab the only argument out the Args and place it into the "current"<br class="m_8538426202314716646gmail_msg">
@@ -6430,6 +6516,8 @@ InitializationSequence::<wbr>Perform(Sema &S,<br class="m_8538426202314716646gmail_msg">
   case SK_CAssignment:<br class="m_8538426202314716646gmail_msg">
   case SK_StringInit:<br class="m_8538426202314716646gmail_msg">
   case SK_ObjCObjectConversion:<br class="m_8538426202314716646gmail_msg">
+  case SK_ArrayLoopIndex:<br class="m_8538426202314716646gmail_msg">
+  case SK_ArrayLoopInit:<br class="m_8538426202314716646gmail_msg">
   case SK_ArrayInit:<br class="m_8538426202314716646gmail_msg">
   case SK_ParenthesizedArrayInit:<br class="m_8538426202314716646gmail_msg">
   case SK_PassByIndirectCopyRestore:<br class="m_8538426202314716646gmail_msg">
@@ -6813,13 +6901,15 @@ InitializationSequence::<wbr>Perform(Sema &S,<br class="m_8538426202314716646gmail_msg">
       bool UseTemporary = Entity.getType()-><wbr>isReferenceType();<br class="m_8538426202314716646gmail_msg">
       bool IsStdInitListInit =<br class="m_8538426202314716646gmail_msg">
           Step->Kind == SK_<wbr>StdInitializerListConstructorC<wbr>all;<br class="m_8538426202314716646gmail_msg">
+      Expr *Source = CurInit.get();<br class="m_8538426202314716646gmail_msg">
       CurInit = PerformConstructorInitializati<wbr>on(<br class="m_8538426202314716646gmail_msg">
-          S, UseTemporary ? TempEntity : Entity, Kind, Args, *Step,<br class="m_8538426202314716646gmail_msg">
+          S, UseTemporary ? TempEntity : Entity, Kind,<br class="m_8538426202314716646gmail_msg">
+          Source ? MultiExprArg(Source) : Args, *Step,<br class="m_8538426202314716646gmail_msg">
           <wbr>ConstructorInitRequiresZeroIni<wbr>t,<br class="m_8538426202314716646gmail_msg">
-          /*IsListInitialization*/<wbr>IsStdInitListInit,<br class="m_8538426202314716646gmail_msg">
-          /*IsStdInitListInitialization*<wbr>/IsStdInitListInit,<br class="m_8538426202314716646gmail_msg">
-          /*LBraceLoc*/SourceLocation(),<br class="m_8538426202314716646gmail_msg">
-          /*RBraceLoc*/SourceLocation())<wbr>;<br class="m_8538426202314716646gmail_msg">
+          /*IsListInitialization*/ IsStdInitListInit,<br class="m_8538426202314716646gmail_msg">
+          /*IsStdInitListInitialization*<wbr>/ IsStdInitListInit,<br class="m_8538426202314716646gmail_msg">
+          /*LBraceLoc*/ SourceLocation(),<br class="m_8538426202314716646gmail_msg">
+          /*RBraceLoc*/ SourceLocation());<br class="m_8538426202314716646gmail_msg">
       break;<br class="m_8538426202314716646gmail_msg">
     }<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
@@ -6898,6 +6988,28 @@ InitializationSequence::<wbr>Perform(Sema &S,<br class="m_8538426202314716646gmail_msg">
                           CurInit.get()->getValueKind()<wbr>);<br class="m_8538426202314716646gmail_msg">
       break;<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
+    case SK_ArrayLoopIndex: {<br class="m_8538426202314716646gmail_msg">
+      Expr *Cur = CurInit.get();<br class="m_8538426202314716646gmail_msg">
+      Expr *BaseExpr = new (S.Context)<br class="m_8538426202314716646gmail_msg">
+          OpaqueValueExpr(Cur-><wbr>getExprLoc(), Cur->getType(),<br class="m_8538426202314716646gmail_msg">
+                          Cur->getValueKind(), Cur->getObjectKind(), Cur);<br class="m_8538426202314716646gmail_msg">
+      Expr *IndexExpr =<br class="m_8538426202314716646gmail_msg">
+          new (S.Context) ArrayInitIndexExpr(S.Context.<wbr>getSizeType());<br class="m_8538426202314716646gmail_msg">
+      CurInit = S.<wbr>CreateBuiltinArraySubscriptExp<wbr>r(<br class="m_8538426202314716646gmail_msg">
+          BaseExpr, Kind.getLocation(), IndexExpr, Kind.getLocation());<br class="m_8538426202314716646gmail_msg">
+      ArrayLoopCommonExprs.push_<wbr>back(BaseExpr);<br class="m_8538426202314716646gmail_msg">
+      break;<br class="m_8538426202314716646gmail_msg">
+    }<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+    case SK_ArrayLoopInit: {<br class="m_8538426202314716646gmail_msg">
+      assert(!ArrayLoopCommonExprs.<wbr>empty() &&<br class="m_8538426202314716646gmail_msg">
+             "mismatched SK_ArrayLoopIndex and SK_ArrayLoopInit");<br class="m_8538426202314716646gmail_msg">
+      Expr *Common = ArrayLoopCommonExprs.pop_back_<wbr>val();<br class="m_8538426202314716646gmail_msg">
+      CurInit = new (S.Context) ArrayInitLoopExpr(Step->Type, Common,<br class="m_8538426202314716646gmail_msg">
+                                                  CurInit.get());<br class="m_8538426202314716646gmail_msg">
+      break;<br class="m_8538426202314716646gmail_msg">
+    }<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
     case SK_ArrayInit:<br class="m_8538426202314716646gmail_msg">
       // Okay: we checked everything before creating this step. Note that<br class="m_8538426202314716646gmail_msg">
       // this is a GNU extension.<br class="m_8538426202314716646gmail_msg">
@@ -7851,6 +7963,14 @@ void InitializationSequence::dump(<wbr>raw_os<br class="m_8538426202314716646gmail_msg">
       OS << "Objective-C object conversion";<br class="m_8538426202314716646gmail_msg">
       break;<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
+    case SK_ArrayLoopIndex:<br class="m_8538426202314716646gmail_msg">
+      OS << "indexing for array initialization loop";<br class="m_8538426202314716646gmail_msg">
+      break;<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+    case SK_ArrayLoopInit:<br class="m_8538426202314716646gmail_msg">
+      OS << "array initialization loop";<br class="m_8538426202314716646gmail_msg">
+      break;<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
     case SK_ArrayInit:<br class="m_8538426202314716646gmail_msg">
       OS << "array initialization";<br class="m_8538426202314716646gmail_msg">
       break;<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
Modified: cfe/trunk/lib/Sema/<wbr>TreeTransform.h<br class="m_8538426202314716646gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=289413&r1=289412&r2=289413&view=diff" rel="noreferrer" class="m_8538426202314716646gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Sema/<wbr>TreeTransform.h?rev=289413&r1=<wbr>289412&r2=289413&view=diff</a><br class="m_8538426202314716646gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_8538426202314716646gmail_msg">
--- cfe/trunk/lib/Sema/<wbr>TreeTransform.h (original)<br class="m_8538426202314716646gmail_msg">
+++ cfe/trunk/lib/Sema/<wbr>TreeTransform.h Sun Dec 11 20:53:20 2016<br class="m_8538426202314716646gmail_msg">
@@ -3221,6 +3221,9 @@ ExprResult TreeTransform<Derived>::Trans<br class="m_8538426202314716646gmail_msg">
   if (ExprWithCleanups *ExprTemp = dyn_cast<ExprWithCleanups>(<wbr>Init))<br class="m_8538426202314716646gmail_msg">
     Init = ExprTemp->getSubExpr();<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
+  if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(<wbr>Init))<br class="m_8538426202314716646gmail_msg">
+    Init = AIL->getCommonExpr();<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
   if (MaterializeTemporaryExpr *MTE = dyn_cast<<wbr>MaterializeTemporaryExpr>(<wbr>Init))<br class="m_8538426202314716646gmail_msg">
     Init = MTE->GetTemporaryExpr();<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
@@ -9045,6 +9048,20 @@ TreeTransform<Derived>::<wbr>TransformNoInitE<br class="m_8538426202314716646gmail_msg">
   return ExprError();<br class="m_8538426202314716646gmail_msg">
 }<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
+template<typename Derived><br class="m_8538426202314716646gmail_msg">
+ExprResult<br class="m_8538426202314716646gmail_msg">
+TreeTransform<Derived>::<wbr>TransformArrayInitLoopExpr(<wbr>ArrayInitLoopExpr *E) {<br class="m_8538426202314716646gmail_msg">
+  llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");<br class="m_8538426202314716646gmail_msg">
+  return ExprError();<br class="m_8538426202314716646gmail_msg">
+}<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+template<typename Derived><br class="m_8538426202314716646gmail_msg">
+ExprResult<br class="m_8538426202314716646gmail_msg">
+TreeTransform<Derived>::<wbr>TransformArrayInitIndexExpr(<wbr>ArrayInitIndexExpr *E) {<br class="m_8538426202314716646gmail_msg">
+  llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");<br class="m_8538426202314716646gmail_msg">
+  return ExprError();<br class="m_8538426202314716646gmail_msg">
+}<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
 template<typename Derived><br class="m_8538426202314716646gmail_msg">
 ExprResult<br class="m_8538426202314716646gmail_msg">
 TreeTransform<Derived>::<wbr>TransformImplicitValueInitExpr<wbr>(<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
Modified: cfe/trunk/lib/Serialization/<wbr>ASTReaderStmt.cpp<br class="m_8538426202314716646gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderStmt.cpp?rev=289413&r1=289412&r2=289413&view=diff" rel="noreferrer" class="m_8538426202314716646gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/<wbr>Serialization/ASTReaderStmt.<wbr>cpp?rev=289413&r1=289412&r2=<wbr>289413&view=diff</a><br class="m_8538426202314716646gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_8538426202314716646gmail_msg">
--- cfe/trunk/lib/Serialization/<wbr>ASTReaderStmt.cpp (original)<br class="m_8538426202314716646gmail_msg">
+++ cfe/trunk/lib/Serialization/<wbr>ASTReaderStmt.cpp Sun Dec 11 20:53:20 2016<br class="m_8538426202314716646gmail_msg">
@@ -845,6 +845,16 @@ void ASTStmtReader::<wbr>VisitNoInitExpr(NoIn<br class="m_8538426202314716646gmail_msg">
   VisitExpr(E);<br class="m_8538426202314716646gmail_msg">
 }<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
+void ASTStmtReader::<wbr>VisitArrayInitLoopExpr(<wbr>ArrayInitLoopExpr *E) {<br class="m_8538426202314716646gmail_msg">
+  VisitExpr(E);<br class="m_8538426202314716646gmail_msg">
+  E->SubExprs[0] = Reader.ReadSubExpr();<br class="m_8538426202314716646gmail_msg">
+  E->SubExprs[1] = Reader.ReadSubExpr();<br class="m_8538426202314716646gmail_msg">
+}<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+void ASTStmtReader::<wbr>VisitArrayInitIndexExpr(<wbr>ArrayInitIndexExpr *E) {<br class="m_8538426202314716646gmail_msg">
+  VisitExpr(E);<br class="m_8538426202314716646gmail_msg">
+}<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
 void ASTStmtReader::<wbr>VisitImplicitValueInitExpr(<wbr>ImplicitValueInitExpr *E) {<br class="m_8538426202314716646gmail_msg">
   VisitExpr(E);<br class="m_8538426202314716646gmail_msg">
 }<br class="m_8538426202314716646gmail_msg">
@@ -3231,6 +3241,14 @@ Stmt *ASTReader::<wbr>ReadStmtFromStream(Modu<br class="m_8538426202314716646gmail_msg">
       S = new (Context) NoInitExpr(Empty);<br class="m_8538426202314716646gmail_msg">
       break;<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
+    case EXPR_ARRAY_INIT_LOOP:<br class="m_8538426202314716646gmail_msg">
+      S = new (Context) ArrayInitLoopExpr(Empty);<br class="m_8538426202314716646gmail_msg">
+      break;<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+    case EXPR_ARRAY_INIT_INDEX:<br class="m_8538426202314716646gmail_msg">
+      S = new (Context) ArrayInitIndexExpr(Empty);<br class="m_8538426202314716646gmail_msg">
+      break;<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
     case EXPR_VA_ARG:<br class="m_8538426202314716646gmail_msg">
       S = new (Context) VAArgExpr(Empty);<br class="m_8538426202314716646gmail_msg">
       break;<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
Modified: cfe/trunk/lib/Serialization/<wbr>ASTWriterStmt.cpp<br class="m_8538426202314716646gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterStmt.cpp?rev=289413&r1=289412&r2=289413&view=diff" rel="noreferrer" class="m_8538426202314716646gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/<wbr>Serialization/ASTWriterStmt.<wbr>cpp?rev=289413&r1=289412&r2=<wbr>289413&view=diff</a><br class="m_8538426202314716646gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_8538426202314716646gmail_msg">
--- cfe/trunk/lib/Serialization/<wbr>ASTWriterStmt.cpp (original)<br class="m_8538426202314716646gmail_msg">
+++ cfe/trunk/lib/Serialization/<wbr>ASTWriterStmt.cpp Sun Dec 11 20:53:20 2016<br class="m_8538426202314716646gmail_msg">
@@ -792,6 +792,18 @@ void ASTStmtWriter::<wbr>VisitNoInitExpr(NoIn<br class="m_8538426202314716646gmail_msg">
   Code = serialization::EXPR_NO_INIT;<br class="m_8538426202314716646gmail_msg">
 }<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
+void ASTStmtWriter::<wbr>VisitArrayInitLoopExpr(<wbr>ArrayInitLoopExpr *E) {<br class="m_8538426202314716646gmail_msg">
+  VisitExpr(E);<br class="m_8538426202314716646gmail_msg">
+  Record.AddStmt(E->SubExprs[0])<wbr>;<br class="m_8538426202314716646gmail_msg">
+  Record.AddStmt(E->SubExprs[1])<wbr>;<br class="m_8538426202314716646gmail_msg">
+  Code = serialization::EXPR_ARRAY_<wbr>INIT_LOOP;<br class="m_8538426202314716646gmail_msg">
+}<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
+void ASTStmtWriter::<wbr>VisitArrayInitIndexExpr(<wbr>ArrayInitIndexExpr *E) {<br class="m_8538426202314716646gmail_msg">
+  VisitExpr(E);<br class="m_8538426202314716646gmail_msg">
+  Code = serialization::EXPR_ARRAY_<wbr>INIT_INDEX;<br class="m_8538426202314716646gmail_msg">
+}<br class="m_8538426202314716646gmail_msg">
+<br class="m_8538426202314716646gmail_msg">
 void ASTStmtWriter::<wbr>VisitImplicitValueInitExpr(<wbr>ImplicitValueInitExpr *E) {<br class="m_8538426202314716646gmail_msg">
   VisitExpr(E);<br class="m_8538426202314716646gmail_msg">
   Code = serialization::EXPR_IMPLICIT_<wbr>VALUE_INIT;<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
Modified: cfe/trunk/lib/StaticAnalyzer/<wbr>Core/ExprEngine.cpp<br class="m_8538426202314716646gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp?rev=289413&r1=289412&r2=289413&view=diff" rel="noreferrer" class="m_8538426202314716646gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/<wbr>StaticAnalyzer/Core/<wbr>ExprEngine.cpp?rev=289413&r1=<wbr>289412&r2=289413&view=diff</a><br class="m_8538426202314716646gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_8538426202314716646gmail_msg">
--- cfe/trunk/lib/StaticAnalyzer/<wbr>Core/ExprEngine.cpp (original)<br class="m_8538426202314716646gmail_msg">
+++ cfe/trunk/lib/StaticAnalyzer/<wbr>Core/ExprEngine.cpp Sun Dec 11 20:53:20 2016<br class="m_8538426202314716646gmail_msg">
@@ -905,6 +905,8 @@ void ExprEngine::Visit(const Stmt *S, Ex<br class="m_8538426202314716646gmail_msg">
     // Cases not handled yet; but will handle some day.<br class="m_8538426202314716646gmail_msg">
     case Stmt::DesignatedInitExprClass:<br class="m_8538426202314716646gmail_msg">
     case Stmt::<wbr>DesignatedInitUpdateExprClass:<br class="m_8538426202314716646gmail_msg">
+    case Stmt::ArrayInitLoopExprClass:<br class="m_8538426202314716646gmail_msg">
+    case Stmt::ArrayInitIndexExprClass:<br class="m_8538426202314716646gmail_msg">
     case Stmt::<wbr>ExtVectorElementExprClass:<br class="m_8538426202314716646gmail_msg">
     case Stmt::ImaginaryLiteralClass:<br class="m_8538426202314716646gmail_msg">
     case Stmt::ObjCAtCatchStmtClass:<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
Modified: cfe/trunk/tools/libclang/<wbr>CXCursor.cpp<br class="m_8538426202314716646gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CXCursor.cpp?rev=289413&r1=289412&r2=289413&view=diff" rel="noreferrer" class="m_8538426202314716646gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/tools/<wbr>libclang/CXCursor.cpp?rev=<wbr>289413&r1=289412&r2=289413&<wbr>view=diff</a><br class="m_8538426202314716646gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_8538426202314716646gmail_msg">
--- cfe/trunk/tools/libclang/<wbr>CXCursor.cpp (original)<br class="m_8538426202314716646gmail_msg">
+++ cfe/trunk/tools/libclang/<wbr>CXCursor.cpp Sun Dec 11 20:53:20 2016<br class="m_8538426202314716646gmail_msg">
@@ -243,6 +243,8 @@ CXCursor cxcursor::MakeCXCursor(const St<br class="m_8538426202314716646gmail_msg">
   case Stmt::ChooseExprClass:<br class="m_8538426202314716646gmail_msg">
   case Stmt::DesignatedInitExprClass:<br class="m_8538426202314716646gmail_msg">
   case Stmt::<wbr>DesignatedInitUpdateExprClass:<br class="m_8538426202314716646gmail_msg">
+  case Stmt::ArrayInitLoopExprClass:<br class="m_8538426202314716646gmail_msg">
+  case Stmt::ArrayInitIndexExprClass:<br class="m_8538426202314716646gmail_msg">
   case Stmt::ExprWithCleanupsClass:<br class="m_8538426202314716646gmail_msg">
   case Stmt::<wbr>ExpressionTraitExprClass:<br class="m_8538426202314716646gmail_msg">
   case Stmt::<wbr>ExtVectorElementExprClass:<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
<br class="m_8538426202314716646gmail_msg">
______________________________<wbr>_________________<br class="m_8538426202314716646gmail_msg">
cfe-commits mailing list<br class="m_8538426202314716646gmail_msg">
<a href="mailto:cfe-commits@lists.llvm.org" class="m_8538426202314716646gmail_msg" target="_blank">cfe-commits@lists.llvm.org</a><br class="m_8538426202314716646gmail_msg">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" class="m_8538426202314716646gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br class="m_8538426202314716646gmail_msg">
</blockquote></div></div></div><span class="HOEnZb"><font color="#888888"><div dir="ltr">-- <br></div><div data-smartmail="gmail_signature"><div dir="ltr">Mike<br>Sent from phone</div></div>
</font></span></blockquote></div><br></div></div>