<div dir="rtl"><div dir="ltr">Hi,</div><div dir="ltr"><br></div><div dir="ltr">The Visual C++ library in debug mode complains that "vector iterator not dereferencable" about</div><div dir="ltr"><br></div><div dir="ltr"><font face="monospace, monospace"><span style="font-size:12.8000001907349px">+  CGF.EmitCallArgs(Args, FPT, &*ArgVec.begin(), &*ArgVec.end(), CD,</span><br style="font-size:12.8000001907349px"><span style="font-size:12.8000001907349px">+                   IsCopy ? 1 : 0);</span><br style="font-size:12.8000001907349px"></font></div><div dir="ltr"><span style="font-size:12.8000001907349px"><br></span></div><div dir="ltr"><span style="font-size:12.8000001907349px">when running </span> Clang :: CodeGenCXX/dllexport.cpp & Clang :: CodeGenCXX/microsoft-abi-throw.cpp tests.</div><div dir="ltr"><br></div><div dir="ltr">Dereferencing <span style="font-size:12.8000001907349px">ArgVec.end() is undefined behaviour and so is d</span>ereferencing <span style="font-size:12.8000001907349px">ArgVec.begin() when the ArgVec is empty. </span><br></div><div dir="ltr"><span style="font-size:12.8000001907349px"><br></span></div><div dir="ltr"><span style="font-size:12.8000001907349px">Modifying the call to </span></div><div dir="ltr"><span style="font-size:12.8000001907349px"><br></span></div><div dir="ltr"><span style="font-size:12.8000001907349px"><div dir="ltr"><font face="monospace, monospace">  CGF.EmitCallArgs(Args, FPT, ArgVec.data(), ArgVec.data() + ArgVec.size(), CD,</font></div><div dir="ltr"><font face="monospace, monospace">                   IsCopy ? 1 : 0);</font></div><div><br></div><div>thus avoiding the dereference passes the tests.</div><div><br></div><div>Yaron</div><div><br></div></span></div><div dir="ltr"><span style="font-size:12.8000001907349px"><br></span></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote"><div dir="ltr">2015-07-18 17:35 GMT+03:00 Benjamin Kramer <span dir="ltr"><<a href="mailto:benny.kra@googlemail.com" target="_blank">benny.kra@googlemail.com</a>></span>:</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: d0k<br>
Date: Sat Jul 18 09:35:53 2015<br>
New Revision: 242608<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D242608-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=txWK99Nwfw23fOP5D-dZqyYNaPWplxPQjcwhYIYm8-8&s=Tj7g6GxnzFUywSuf0qr4ejlI0ALRUVqdNBOyPCtACFU&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=242608&view=rev</a><br>
Log:<br>
[AST] Cleanup ExprIterator.<br>
<br>
- Make it a proper random access iterator with a little help from iterator_adaptor_base<br>
- Clean up users of magic dereferencing. The iterator should behave like an Expr **.<br>
- Make it an implementation detail of Stmt. This allows inlining of the assertions.<br>
<br>
Modified:<br>
    cfe/trunk/include/clang/AST/Stmt.h<br>
    cfe/trunk/lib/AST/Expr.cpp<br>
    cfe/trunk/lib/AST/StmtPrinter.cpp<br>
    cfe/trunk/lib/CodeGen/CGCall.cpp<br>
    cfe/trunk/lib/CodeGen/CGClass.cpp<br>
    cfe/trunk/lib/CodeGen/CGExprCXX.cpp<br>
    cfe/trunk/lib/CodeGen/CodeGenFunction.h<br>
    cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp<br>
<br>
Modified: cfe/trunk/include/clang/AST/Stmt.h<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_include_clang_AST_Stmt.h-3Frev-3D242608-26r1-3D242607-26r2-3D242608-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=txWK99Nwfw23fOP5D-dZqyYNaPWplxPQjcwhYIYm8-8&s=xgHHQujSU5zhnvkRyBMMYFCMCrlB5wSyEYcKsujiIZs&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Stmt.h?rev=242608&r1=242607&r2=242608&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/AST/Stmt.h (original)<br>
+++ cfe/trunk/include/clang/AST/Stmt.h Sat Jul 18 09:35:53 2015<br>
@@ -22,6 +22,7 @@<br>
 #include "clang/Basic/SourceLocation.h"<br>
 #include "llvm/ADT/ArrayRef.h"<br>
 #include "llvm/ADT/PointerIntPair.h"<br>
+#include "llvm/ADT/iterator.h"<br>
 #include "llvm/Support/Compiler.h"<br>
 #include "llvm/Support/ErrorHandling.h"<br>
 #include <string><br>
@@ -49,57 +50,6 @@ namespace clang {<br>
   class Token;<br>
   class VarDecl;<br>
<br>
-  //===--------------------------------------------------------------------===//<br>
-  // ExprIterator - Iterators for iterating over Stmt* arrays that contain<br>
-  //  only Expr*.  This is needed because AST nodes use Stmt* arrays to store<br>
-  //  references to children (to be compatible with StmtIterator).<br>
-  //===--------------------------------------------------------------------===//<br>
-<br>
-  class Stmt;<br>
-  class Expr;<br>
-<br>
-  class ExprIterator : public std::iterator<std::forward_iterator_tag,<br>
-                                            Expr *&, ptrdiff_t,<br>
-                                            Expr *&, Expr *&> {<br>
-    Stmt** I;<br>
-  public:<br>
-    ExprIterator(Stmt** i) : I(i) {}<br>
-    ExprIterator() : I(nullptr) {}<br>
-    ExprIterator& operator++() { ++I; return *this; }<br>
-    ExprIterator operator-(size_t i) { return I-i; }<br>
-    ExprIterator operator+(size_t i) { return I+i; }<br>
-    Expr* operator[](size_t idx);<br>
-    // FIXME: Verify that this will correctly return a signed distance.<br>
-    signed operator-(const ExprIterator& R) const { return I - R.I; }<br>
-    Expr* operator*() const;<br>
-    Expr* operator->() const;<br>
-    bool operator==(const ExprIterator& R) const { return I == R.I; }<br>
-    bool operator!=(const ExprIterator& R) const { return I != R.I; }<br>
-    bool operator>(const ExprIterator& R) const { return I > R.I; }<br>
-    bool operator>=(const ExprIterator& R) const { return I >= R.I; }<br>
-  };<br>
-<br>
-  class ConstExprIterator : public std::iterator<std::forward_iterator_tag,<br>
-                                                 const Expr *&, ptrdiff_t,<br>
-                                                 const Expr *&,<br>
-                                                 const Expr *&> {<br>
-    const Stmt * const *I;<br>
-  public:<br>
-    ConstExprIterator(const Stmt * const *i) : I(i) {}<br>
-    ConstExprIterator() : I(nullptr) {}<br>
-    ConstExprIterator& operator++() { ++I; return *this; }<br>
-    ConstExprIterator operator+(size_t i) const { return I+i; }<br>
-    ConstExprIterator operator-(size_t i) const { return I-i; }<br>
-    const Expr * operator[](size_t idx) const;<br>
-    signed operator-(const ConstExprIterator& R) const { return I - R.I; }<br>
-    const Expr * operator*() const;<br>
-    const Expr * operator->() const;<br>
-    bool operator==(const ConstExprIterator& R) const { return I == R.I; }<br>
-    bool operator!=(const ConstExprIterator& R) const { return I != R.I; }<br>
-    bool operator>(const ConstExprIterator& R) const { return I > R.I; }<br>
-    bool operator>=(const ConstExprIterator& R) const { return I >= R.I; }<br>
-  };<br>
-<br>
 //===----------------------------------------------------------------------===//<br>
 // AST classes for statements.<br>
 //===----------------------------------------------------------------------===//<br>
@@ -337,6 +287,39 @@ public:<br>
   /// de-serialization).<br>
   struct EmptyShell { };<br>
<br>
+protected:<br>
+  /// Iterator for iterating over Stmt * arrays that contain only Expr *<br>
+  ///<br>
+  /// This is needed because AST nodes use Stmt* arrays to store<br>
+  /// references to children (to be compatible with StmtIterator).<br>
+  struct ExprIterator<br>
+      : llvm::iterator_adaptor_base<ExprIterator, Stmt **,<br>
+                                    std::random_access_iterator_tag, Expr *> {<br>
+    ExprIterator() : iterator_adaptor_base(nullptr) {}<br>
+    ExprIterator(Stmt **I) : iterator_adaptor_base(I) {}<br>
+<br>
+    reference operator*() const {<br>
+      assert((*I)->getStmtClass() >= firstExprConstant &&<br>
+             (*I)->getStmtClass() <= lastExprConstant);<br>
+      return *reinterpret_cast<Expr **>(I);<br>
+    }<br>
+  };<br>
+<br>
+  /// Const iterator for iterating over Stmt * arrays that contain only Expr *<br>
+  struct ConstExprIterator<br>
+      : llvm::iterator_adaptor_base<ConstExprIterator, const Stmt *const *,<br>
+                                    std::random_access_iterator_tag,<br>
+                                    const Expr *const> {<br>
+    ConstExprIterator() : iterator_adaptor_base(nullptr) {}<br>
+    ConstExprIterator(const Stmt *const *I) : iterator_adaptor_base(I) {}<br>
+<br>
+    reference operator*() const {<br>
+      assert((*I)->getStmtClass() >= firstExprConstant &&<br>
+             (*I)->getStmtClass() <= lastExprConstant);<br>
+      return *reinterpret_cast<const Expr *const *>(I);<br>
+    }<br>
+  };<br>
+<br>
 private:<br>
   /// \brief Whether statistic collection is enabled.<br>
   static bool StatisticsEnabled;<br>
<br>
Modified: cfe/trunk/lib/AST/Expr.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_AST_Expr.cpp-3Frev-3D242608-26r1-3D242607-26r2-3D242608-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=txWK99Nwfw23fOP5D-dZqyYNaPWplxPQjcwhYIYm8-8&s=z2qD9N1ynhGw13ueOWzRbVuPDQWeodKKonZmBFIzxkI&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Expr.cpp?rev=242608&r1=242607&r2=242608&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/AST/Expr.cpp (original)<br>
+++ cfe/trunk/lib/AST/Expr.cpp Sat Jul 18 09:35:53 2015<br>
@@ -4163,19 +4163,6 @@ PseudoObjectExpr::PseudoObjectExpr(QualT<br>
 }<br>
<br>
 //===----------------------------------------------------------------------===//<br>
-//  ExprIterator.<br>
-//===----------------------------------------------------------------------===//<br>
-<br>
-Expr* ExprIterator::operator[](size_t idx) { return cast<Expr>(I[idx]); }<br>
-Expr* ExprIterator::operator*() const { return cast<Expr>(*I); }<br>
-Expr* ExprIterator::operator->() const { return cast<Expr>(*I); }<br>
-const Expr* ConstExprIterator::operator[](size_t idx) const {<br>
-  return cast<Expr>(I[idx]);<br>
-}<br>
-const Expr* ConstExprIterator::operator*() const { return cast<Expr>(*I); }<br>
-const Expr* ConstExprIterator::operator->() const { return cast<Expr>(*I); }<br>
-<br>
-//===----------------------------------------------------------------------===//<br>
 //  Child Iterators for iterating over subexpressions/substatements<br>
 //===----------------------------------------------------------------------===//<br>
<br>
<br>
Modified: cfe/trunk/lib/AST/StmtPrinter.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_AST_StmtPrinter.cpp-3Frev-3D242608-26r1-3D242607-26r2-3D242608-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=txWK99Nwfw23fOP5D-dZqyYNaPWplxPQjcwhYIYm8-8&s=MGQa6ITBHkW_kPr3XTiIrQN56d9AT7cv3fzsGknPLCQ&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtPrinter.cpp?rev=242608&r1=242607&r2=242608&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/AST/StmtPrinter.cpp (original)<br>
+++ cfe/trunk/lib/AST/StmtPrinter.cpp Sat Jul 18 09:35:53 2015<br>
@@ -1768,7 +1768,7 @@ void StmtPrinter::VisitCXXTemporaryObjec<br>
   for (CXXTemporaryObjectExpr::arg_iterator Arg = Node->arg_begin(),<br>
                                          ArgEnd = Node->arg_end();<br>
        Arg != ArgEnd; ++Arg) {<br>
-    if (Arg->isDefaultArgument())<br>
+    if ((*Arg)->isDefaultArgument())<br>
       break;<br>
     if (Arg != Node->arg_begin())<br>
       OS << ", ";<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CGCall.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_CodeGen_CGCall.cpp-3Frev-3D242608-26r1-3D242607-26r2-3D242608-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=txWK99Nwfw23fOP5D-dZqyYNaPWplxPQjcwhYIYm8-8&s=8BeNaf5EDXRBRJnpiYEqto9_Jzgjw1P9OwU-kBQ-aak&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=242608&r1=242607&r2=242608&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CGCall.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CGCall.cpp Sat Jul 18 09:35:53 2015<br>
@@ -2829,7 +2829,7 @@ void CodeGenFunction::EmitCallArgs(CallA<br>
     for (int I = ArgTypes.size() - 1; I >= 0; --I) {<br>
       CallExpr::const_arg_iterator Arg = ArgBeg + I;<br>
       EmitCallArg(Args, *Arg, ArgTypes[I]);<br>
-      EmitNonNullArgCheck(Args.back().RV, ArgTypes[I], Arg->getExprLoc(),<br>
+      EmitNonNullArgCheck(Args.back().RV, ArgTypes[I], (*Arg)->getExprLoc(),<br>
                           CalleeDecl, ParamsToSkip + I);<br>
     }<br>
<br>
@@ -2843,7 +2843,7 @@ void CodeGenFunction::EmitCallArgs(CallA<br>
     CallExpr::const_arg_iterator Arg = ArgBeg + I;<br>
     assert(Arg != ArgEnd);<br>
     EmitCallArg(Args, *Arg, ArgTypes[I]);<br>
-    EmitNonNullArgCheck(Args.back().RV, ArgTypes[I], Arg->getExprLoc(),<br>
+    EmitNonNullArgCheck(Args.back().RV, ArgTypes[I], (*Arg)->getExprLoc(),<br>
                         CalleeDecl, ParamsToSkip + I);<br>
   }<br>
 }<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CGClass.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_CodeGen_CGClass.cpp-3Frev-3D242608-26r1-3D242607-26r2-3D242608-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=txWK99Nwfw23fOP5D-dZqyYNaPWplxPQjcwhYIYm8-8&s=3SGjUI3crKETsqnVTxx2f-t7JJf0gQAHkc7PTi4oz58&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGClass.cpp?rev=242608&r1=242607&r2=242608&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CGClass.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CGClass.cpp Sat Jul 18 09:35:53 2015<br>
@@ -1832,7 +1832,7 @@ CodeGenFunction::EmitSynthesizedCXXCopyC<br>
            "trivial 1-arg ctor not a copy/move ctor");<br>
     EmitAggregateCopyCtor(This, Src,<br>
                           getContext().getTypeDeclType(D->getParent()),<br>
-                          E->arg_begin()->getType());<br>
+                          (*E->arg_begin())->getType());<br>
     return;<br>
   }<br>
   llvm::Value *Callee = CGM.getAddrOfCXXStructor(D, StructorType::Complete);<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CGExprCXX.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_CodeGen_CGExprCXX.cpp-3Frev-3D242608-26r1-3D242607-26r2-3D242608-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=txWK99Nwfw23fOP5D-dZqyYNaPWplxPQjcwhYIYm8-8&s=0QrCcz4tFIOUjMUOsgYl5UFsWI1mbxx8qsGn350KwXs&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprCXX.cpp?rev=242608&r1=242607&r2=242608&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CGExprCXX.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CGExprCXX.cpp Sat Jul 18 09:35:53 2015<br>
@@ -196,7 +196,7 @@ RValue CodeGenFunction::EmitCXXMemberOrO<br>
         // Trivial move and copy ctor are the same.<br>
         assert(CE->getNumArgs() == 1 && "unexpected argcount for trivial ctor");<br>
         llvm::Value *RHS = EmitLValue(*CE->arg_begin()).getAddress();<br>
-        EmitAggregateCopy(This, RHS, CE->arg_begin()->getType());<br>
+        EmitAggregateCopy(This, RHS, (*CE->arg_begin())->getType());<br>
         return RValue::get(This);<br>
       }<br>
       llvm_unreachable("unknown trivial member function");<br>
@@ -1089,8 +1089,7 @@ RValue CodeGenFunction::EmitBuiltinNewDe<br>
                                                  bool IsDelete) {<br>
   CallArgList Args;<br>
   const Stmt *ArgS = Arg;<br>
-  EmitCallArgs(Args, *Type->param_type_begin(),<br>
-               ConstExprIterator(&ArgS), ConstExprIterator(&ArgS + 1));<br>
+  EmitCallArgs(Args, *Type->param_type_begin(), &ArgS, &ArgS + 1);<br>
   // Find the allocation or deallocation function that we're calling.<br>
   ASTContext &Ctx = getContext();<br>
   DeclarationName Name = Ctx.DeclarationNames<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_CodeGen_CodeGenFunction.h-3Frev-3D242608-26r1-3D242607-26r2-3D242608-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=txWK99Nwfw23fOP5D-dZqyYNaPWplxPQjcwhYIYm8-8&s=bgRS1LJUp-wsCXl2sy316ajY44HStNy-6qPqOAvi62s&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=242608&r1=242607&r2=242608&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)<br>
+++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Sat Jul 18 09:35:53 2015<br>
@@ -2992,7 +2992,7 @@ public:<br>
                          .getCanonicalType((*I).getNonReferenceType())<br>
                          .getTypePtr() ==<br>
                      getContext()<br>
-                         .getCanonicalType(Arg->getType())<br>
+                         .getCanonicalType((*Arg)->getType())<br>
                          .getTypePtr())) &&<br>
                "type mismatch in call argument!");<br>
         ArgTypes.push_back(*I);<br>
<br>
Modified: cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_CodeGen_MicrosoftCXXABI.cpp-3Frev-3D242608-26r1-3D242607-26r2-3D242608-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=txWK99Nwfw23fOP5D-dZqyYNaPWplxPQjcwhYIYm8-8&s=khrHk157Ih3Ey3ORCdTqRNKPN2fLJZtkNTURBTXedkQ&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp?rev=242608&r1=242607&r2=242608&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp Sat Jul 18 09:35:53 2015<br>
@@ -3803,9 +3803,8 @@ MicrosoftCXXABI::getAddrOfCXXCtorClosure<br>
   CodeGenFunction::RunCleanupsScope Cleanups(CGF);<br>
<br>
   const auto *FPT = CD->getType()->castAs<FunctionProtoType>();<br>
-  ConstExprIterator ArgBegin(ArgVec.data()),<br>
-      ArgEnd(ArgVec.data() + ArgVec.size());<br>
-  CGF.EmitCallArgs(Args, FPT, ArgBegin, ArgEnd, CD, IsCopy ? 1 : 0);<br>
+  CGF.EmitCallArgs(Args, FPT, &*ArgVec.begin(), &*ArgVec.end(), CD,<br>
+                   IsCopy ? 1 : 0);<br>
<br>
   // Insert any ABI-specific implicit constructor arguments.<br>
   unsigned ExtraArgs = addImplicitConstructorArgs(CGF, CD, Ctor_Complete,<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>