[PATCH] D33209: [clang-tidy] Add "emplace_back" detection in inefficient-vector-operation.

2017-05-16 Thread Haojian Wu via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rL303157: [clang-tidy] Add "emplace_back" detection in 
inefficient-vector-operation. (authored by hokein).

Changed prior to commit:
  https://reviews.llvm.org/D33209?vs=99124=99127#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D33209

Files:
  
clang-tools-extra/trunk/clang-tidy/performance/InefficientVectorOperationCheck.cpp
  
clang-tools-extra/trunk/docs/clang-tidy/checks/performance-inefficient-vector-operation.rst
  
clang-tools-extra/trunk/test/clang-tidy/performance-inefficient-vector-operation.cpp

Index: clang-tools-extra/trunk/clang-tidy/performance/InefficientVectorOperationCheck.cpp
===
--- clang-tools-extra/trunk/clang-tidy/performance/InefficientVectorOperationCheck.cpp
+++ clang-tools-extra/trunk/clang-tidy/performance/InefficientVectorOperationCheck.cpp
@@ -39,14 +39,14 @@
 //   - VectorVarDeclName: 'v' in  (as VarDecl).
 //   - VectorVarDeclStmatName: The entire 'std::vector v;' statement (as
 // DeclStmt).
-//   - PushBackCallName: 'v.push_back(i)' (as cxxMemberCallExpr).
+//   - PushBackOrEmplaceBackCallName: 'v.push_back(i)' (as cxxMemberCallExpr).
 //   - LoopInitVarName: 'i' (as VarDecl).
 //   - LoopEndExpr: '10+1' (as Expr).
 static const char LoopCounterName[] = "for_loop_counter";
 static const char LoopParentName[] = "loop_parent";
 static const char VectorVarDeclName[] = "vector_var_decl";
 static const char VectorVarDeclStmtName[] = "vector_var_decl_stmt";
-static const char PushBackCallName[] = "push_back_call";
+static const char PushBackOrEmplaceBackCallName[] = "append_call";
 static const char LoopInitVarName[] = "loop_init_var";
 static const char LoopEndExprName[] = "loop_end_expr";
 
@@ -81,13 +81,13 @@
   const auto VectorVarDecl =
   varDecl(hasInitializer(VectorDefaultConstructorCall))
   .bind(VectorVarDeclName);
-  const auto PushBackCallExpr =
+  const auto VectorAppendCallExpr =
   cxxMemberCallExpr(
-  callee(cxxMethodDecl(hasName("push_back"))), on(hasType(VectorDecl)),
+  callee(cxxMethodDecl(hasAnyName("push_back", "emplace_back"))),
+  on(hasType(VectorDecl)),
   onImplicitObjectArgument(declRefExpr(to(VectorVarDecl
-  .bind(PushBackCallName);
-  const auto PushBackCall =
-  expr(anyOf(PushBackCallExpr, exprWithCleanups(has(PushBackCallExpr;
+  .bind(PushBackOrEmplaceBackCallName);
+  const auto VectorAppendCall = expr(ignoringImplicit(VectorAppendCallExpr));
   const auto VectorVarDefStmt =
   declStmt(hasSingleDecl(equalsBoundNode(VectorVarDeclName)))
   .bind(VectorVarDeclStmtName);
@@ -98,9 +98,11 @@
   const auto RefersToLoopVar = ignoringParenImpCasts(
   declRefExpr(to(varDecl(equalsBoundNode(LoopInitVarName);
 
-  // Matchers for the loop whose body has only 1 push_back calling statement.
-  const auto HasInterestingLoopBody = hasBody(anyOf(
-  compoundStmt(statementCountIs(1), has(PushBackCall)), PushBackCall));
+  // Matchers for the loop whose body has only 1 push_back/emplace_back calling
+  // statement.
+  const auto HasInterestingLoopBody =
+  hasBody(anyOf(compoundStmt(statementCountIs(1), has(VectorAppendCall)),
+VectorAppendCall));
   const auto InInterestingCompoundStmt =
   hasParent(compoundStmt(has(VectorVarDefStmt)).bind(LoopParentName));
 
@@ -145,8 +147,8 @@
   const auto *ForLoop = Result.Nodes.getNodeAs(LoopCounterName);
   const auto *RangeLoop =
   Result.Nodes.getNodeAs(RangeLoopName);
-  const auto *PushBackCall =
-  Result.Nodes.getNodeAs(PushBackCallName);
+  const auto *VectorAppendCall =
+  Result.Nodes.getNodeAs(PushBackOrEmplaceBackCallName);
   const auto *LoopEndExpr = Result.Nodes.getNodeAs(LoopEndExprName);
   const auto *LoopParent = Result.Nodes.getNodeAs(LoopParentName);
 
@@ -173,7 +175,7 @@
 
   llvm::StringRef VectorVarName = Lexer::getSourceText(
   CharSourceRange::getTokenRange(
-  PushBackCall->getImplicitObjectArgument()->getSourceRange()),
+  VectorAppendCall->getImplicitObjectArgument()->getSourceRange()),
   SM, Context->getLangOpts());
 
   std::string ReserveStmt;
@@ -197,9 +199,11 @@
 ReserveStmt = (VectorVarName + ".reserve(" + LoopEndSource + ");\n").str();
   }
 
-  auto Diag = diag(PushBackCall->getLocStart(),
-   "'push_back' is called inside a loop; "
-   "consider pre-allocating the vector capacity before the loop");
+  auto Diag =
+  diag(VectorAppendCall->getLocStart(),
+   "%0 is called inside a loop; "
+   "consider pre-allocating the vector capacity before the loop")
+  << VectorAppendCall->getMethodDecl()->getDeclName();
 
   if (!ReserveStmt.empty())
 Diag << FixItHint::CreateInsertion(LoopStmt->getLocStart(), ReserveStmt);
Index: clang-tools-extra/trunk/docs/clang-tidy/checks/performance-inefficient-vector-operation.rst

[PATCH] D33209: [clang-tidy] Add "emplace_back" detection in inefficient-vector-operation.

2017-05-16 Thread Haojian Wu via Phabricator via cfe-commits
hokein added inline comments.



Comment at: clang-tidy/performance/InefficientVectorOperationCheck.cpp:50
+static const char PushBackOrEmplaceBackCallName[] =
+"push_back_or_emplace_back_call";
 static const char LoopInitVarName[] = "loop_init_var";

alexfh wrote:
> nit: No need for the actual strings to be that long, since you're only using 
> the corresponding constant names in the code. Even though there's no small 
> string optimization used for bound AST nodes (they are stored in a 
> `std::map`), maps are frequently 
> compared, which is less wasteful with shorter strings.
> 
> It would be interesting to see how large is the impact of longer or shorter 
> string IDs, but until then we can still avoid overly long names.
Acknowledged. Thanks for the detailed explanation ;)



Comment at: test/clang-tidy/performance-inefficient-vector-operation.cpp:158
+std::vector v;
+// CHECK-FIXES: v.reserve(t.size());
+for (const auto  : t) {

alexfh wrote:
> This pattern is ambiguous. I'd use unique variable name for each test to 
> avoid patterns matching incorrect lines.
Sounds good. Also applied the change to the whole test file.


https://reviews.llvm.org/D33209



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


[PATCH] D33209: [clang-tidy] Add "emplace_back" detection in inefficient-vector-operation.

2017-05-16 Thread Haojian Wu via Phabricator via cfe-commits
hokein updated this revision to Diff 99124.
hokein marked 3 inline comments as done.
hokein added a comment.

Improve tests.


https://reviews.llvm.org/D33209

Files:
  clang-tidy/performance/InefficientVectorOperationCheck.cpp
  docs/clang-tidy/checks/performance-inefficient-vector-operation.rst
  test/clang-tidy/performance-inefficient-vector-operation.cpp

Index: test/clang-tidy/performance-inefficient-vector-operation.cpp
===
--- test/clang-tidy/performance-inefficient-vector-operation.cpp
+++ test/clang-tidy/performance-inefficient-vector-operation.cpp
@@ -35,6 +35,9 @@
   explicit vector(size_type n);
 
   void push_back(const T& val);
+
+  template  void emplace_back(Args &&... args);
+
   void reserve(size_t n);
   void resize(size_t n);
 
@@ -61,205 +64,214 @@
 
 void f(std::vector& t) {
   {
-std::vector v;
-// CHECK-FIXES: v.reserve(10);
+std::vector v0;
+// CHECK-FIXES: v0.reserve(10);
 for (int i = 0; i < 10; ++i)
-  v.push_back(i);
+  v0.push_back(i);
   // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: 'push_back' is called inside a loop; consider pre-allocating the vector capacity before the loop
   }
   {
-std::vector v;
-// CHECK-FIXES: v.reserve(10);
+std::vector v1;
+// CHECK-FIXES: v1.reserve(10);
 for (int i = 0; i < 10; i++)
-  v.push_back(i);
+  v1.push_back(i);
   // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: 'push_back' is called
   }
   {
-std::vector v;
-// CHECK-FIXES: v.reserve(10);
+std::vector v2;
+// CHECK-FIXES: v2.reserve(10);
 for (int i = 0; i < 10; ++i)
-  v.push_back(0);
+  v2.push_back(0);
   // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: 'push_back' is called
   }
   {
-std::vector v;
-// CHECK-FIXES: v.reserve(5);
+std::vector v3;
+// CHECK-FIXES: v3.reserve(5);
 for (int i = 0; i < 5; ++i) {
-  v.push_back(i);
+  v3.push_back(i);
   // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: 'push_back' is called
 }
-// CHECK-FIXES-NOT: v.reserve(10);
+// CHECK-FIXES-NOT: v3.reserve(10);
 for (int i = 0; i < 10; ++i) {
   // No fix for this loop as we encounter the prior loops.
-  v.push_back(i);
+  v3.push_back(i);
 }
   }
   {
-std::vector v;
-std::vector v2;
-v2.reserve(3);
-// CHECK-FIXES: v.reserve(10);
+std::vector v4;
+std::vector v5;
+v5.reserve(3);
+// CHECK-FIXES: v4.reserve(10);
 for (int i = 0; i < 10; ++i)
-  v.push_back(i);
+  v4.push_back(i);
   // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: 'push_back' is called
   }
   {
-std::vector v;
-// CHECK-FIXES: v.reserve(t.size());
+std::vector v6;
+// CHECK-FIXES: v6.reserve(t.size());
 for (std::size_t i = 0; i < t.size(); ++i) {
-  v.push_back(t[i]);
+  v6.push_back(t[i]);
   // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: 'push_back' is called
 }
   }
   {
-std::vector v;
-// CHECK-FIXES: v.reserve(t.size() - 1);
+std::vector v7;
+// CHECK-FIXES: v7.reserve(t.size() - 1);
 for (std::size_t i = 0; i < t.size() - 1; ++i) {
-  v.push_back(t[i]);
+  v7.push_back(t[i]);
 } // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: 'push_back' is called
   }
   {
-std::vector v;
-// CHECK-FIXES: v.reserve(t.size());
+std::vector v8;
+// CHECK-FIXES: v8.reserve(t.size());
 for (const auto  : t) {
-  v.push_back(e);
+  v8.push_back(e);
   // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: 'push_back' is called
 }
   }
   {
-std::vector v;
-// CHECK-FIXES: v.reserve(t.size());
+std::vector v9;
+// CHECK-FIXES: v9.reserve(t.size());
 for (const auto  : t) {
-  v.push_back(Op(e));
+  v9.push_back(Op(e));
   // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: 'push_back' is called
 }
   }
   {
-std::vector v;
-// CHECK-FIXES: v.reserve(t.size());
+std::vector v10;
+// CHECK-FIXES: v10.reserve(t.size());
 for (const auto  : t) {
-  v.push_back(Foo(e));
+  v10.push_back(Foo(e));
   // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: 'push_back' is called
 }
   }
   {
-std::vector v;
-// CHECK-FIXES: v.reserve(t.size());
+std::vector v11;
+// CHECK-FIXES: v11.reserve(t.size());
 for (const auto  : t) {
-  v.push_back(e);
+  v11.push_back(e);
   // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: 'push_back' is called
 }
   }
+  {
+std::vector v12;
+// CHECK-FIXES: v12.reserve(t.size());
+for (const auto  : t) {
+  v12.emplace_back(e);
+  // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: 'emplace_back' is called
+}
+  }
+
   //  Non-fixed Cases 
   {
-std::vector v;
-v.reserve(20);
-// CHECK-FIXES-NOT: v.reserve(10);
+std::vector z0;
+z0.reserve(20);
+// CHECK-FIXES-NOT: z0.reserve(10);
 // There is a "reserve" call already.
 for (int i = 0; i < 10; ++i) {
-  

[PATCH] D33209: [clang-tidy] Add "emplace_back" detection in inefficient-vector-operation.

2017-05-16 Thread Alexander Kornienko via Phabricator via cfe-commits
alexfh accepted this revision.
alexfh added a comment.
This revision is now accepted and ready to land.

LG once the comments are addressed.


https://reviews.llvm.org/D33209



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


[PATCH] D33209: [clang-tidy] Add "emplace_back" detection in inefficient-vector-operation.

2017-05-16 Thread Alexander Kornienko via Phabricator via cfe-commits
alexfh added inline comments.



Comment at: clang-tidy/performance/InefficientVectorOperationCheck.cpp:208
+   "consider pre-allocating the vector capacity before the loop")
+  << VectorAppendCall->getMethodDecl()->getDeclName();
 

hokein wrote:
> alexfh wrote:
> > Diagnostic builder should be able to format NamedDecls directly, this 
> > `->getDeclName()` is not necessary. The only difference is that it will 
> > likely add quotes around the name, which seems to be good anyway.
> I tried it, but I found the behavior between using `getDeclName()` and not 
> using `getDeclName()` is different when handling the template functions:
> 
> * `diag(...) << VectorAppendCall->getMethodDecl()` will print the function 
> name with instantiated template arguments like "emplace_back";
> *  `diag(...) << VectorAppendCall->getMethodDecl()->getDeclName()` will just 
> print the function name without template arguments, which is what we expect.
Good to know.



Comment at: clang-tidy/performance/InefficientVectorOperationCheck.cpp:50
+static const char PushBackOrEmplaceBackCallName[] =
+"push_back_or_emplace_back_call";
 static const char LoopInitVarName[] = "loop_init_var";

nit: No need for the actual strings to be that long, since you're only using 
the corresponding constant names in the code. Even though there's no small 
string optimization used for bound AST nodes (they are stored in a 
`std::map`), maps are frequently 
compared, which is less wasteful with shorter strings.

It would be interesting to see how large is the impact of longer or shorter 
string IDs, but until then we can still avoid overly long names.



Comment at: test/clang-tidy/performance-inefficient-vector-operation.cpp:158
+std::vector v;
+// CHECK-FIXES: v.reserve(t.size());
+for (const auto  : t) {

This pattern is ambiguous. I'd use unique variable name for each test to avoid 
patterns matching incorrect lines.


https://reviews.llvm.org/D33209



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


[PATCH] D33209: [clang-tidy] Add "emplace_back" detection in inefficient-vector-operation.

2017-05-16 Thread Haojian Wu via Phabricator via cfe-commits
hokein marked an inline comment as done.
hokein added inline comments.



Comment at: clang-tidy/performance/InefficientVectorOperationCheck.cpp:92
+  const auto VectorAppendCall = expr(
+  anyOf(VectorAppendCallExpr, 
exprWithCleanups(has(VectorAppendCallExpr;
   const auto VectorVarDefStmt =

malcolm.parsons wrote:
> I'd use ignoringImplicit(VectorAppendCallExpr) to ignore ExprWithCleanups.
Good to know. Thanks!



Comment at: clang-tidy/performance/InefficientVectorOperationCheck.cpp:208
+   "consider pre-allocating the vector capacity before the loop")
+  << VectorAppendCall->getMethodDecl()->getDeclName();
 

alexfh wrote:
> Diagnostic builder should be able to format NamedDecls directly, this 
> `->getDeclName()` is not necessary. The only difference is that it will 
> likely add quotes around the name, which seems to be good anyway.
I tried it, but I found the behavior between using `getDeclName()` and not 
using `getDeclName()` is different when handling the template functions:

* `diag(...) << VectorAppendCall->getMethodDecl()` will print the function name 
with instantiated template arguments like "emplace_back";
*  `diag(...) << VectorAppendCall->getMethodDecl()->getDeclName()` will just 
print the function name without template arguments, which is what we expect.


https://reviews.llvm.org/D33209



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


[PATCH] D33209: [clang-tidy] Add "emplace_back" detection in inefficient-vector-operation.

2017-05-16 Thread Haojian Wu via Phabricator via cfe-commits
hokein updated this revision to Diff 99119.
hokein marked an inline comment as done.
hokein added a comment.

Adress review comments.


https://reviews.llvm.org/D33209

Files:
  clang-tidy/performance/InefficientVectorOperationCheck.cpp
  docs/clang-tidy/checks/performance-inefficient-vector-operation.rst
  test/clang-tidy/performance-inefficient-vector-operation.cpp

Index: test/clang-tidy/performance-inefficient-vector-operation.cpp
===
--- test/clang-tidy/performance-inefficient-vector-operation.cpp
+++ test/clang-tidy/performance-inefficient-vector-operation.cpp
@@ -35,6 +35,9 @@
   explicit vector(size_type n);
 
   void push_back(const T& val);
+
+  template  void emplace_back(Args &&... args);
+
   void reserve(size_t n);
   void resize(size_t n);
 
@@ -150,6 +153,14 @@
   // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: 'push_back' is called
 }
   }
+  {
+std::vector v;
+// CHECK-FIXES: v.reserve(t.size());
+for (const auto  : t) {
+  v.emplace_back(e);
+  // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: 'emplace_back' is called
+}
+  }
   //  Non-fixed Cases 
   {
 std::vector v;
Index: docs/clang-tidy/checks/performance-inefficient-vector-operation.rst
===
--- docs/clang-tidy/checks/performance-inefficient-vector-operation.rst
+++ docs/clang-tidy/checks/performance-inefficient-vector-operation.rst
@@ -3,8 +3,8 @@
 performance-inefficient-vector-operation
 
 
-Finds possible inefficient ``std::vector`` operations (e.g. ``push_back``) that
-may cause unnecessary memory reallocations.
+Finds possible inefficient ``std::vector`` operations (e.g. ``push_back``,
+``emplace_back``) that may cause unnecessary memory reallocations.
 
 Currently, the check only detects following kinds of loops with a single
 statement body:
@@ -24,7 +24,7 @@
 
 * For-range loops like ``for (range-declaration : range_expression)``, the type
   of ``range_expression`` can be ``std::vector``, ``std::array``,
-  ``std::dequeue``, ``std::set``, ``std::unordered_set``, ``std::map``,
+  ``std::deque``, ``std::set``, ``std::unordered_set``, ``std::map``,
   ``std::unordered_set``:
 
 .. code-block:: c++
Index: clang-tidy/performance/InefficientVectorOperationCheck.cpp
===
--- clang-tidy/performance/InefficientVectorOperationCheck.cpp
+++ clang-tidy/performance/InefficientVectorOperationCheck.cpp
@@ -39,14 +39,15 @@
 //   - VectorVarDeclName: 'v' in  (as VarDecl).
 //   - VectorVarDeclStmatName: The entire 'std::vector v;' statement (as
 // DeclStmt).
-//   - PushBackCallName: 'v.push_back(i)' (as cxxMemberCallExpr).
+//   - PushBackOrEmplaceBackCallName: 'v.push_back(i)' (as cxxMemberCallExpr).
 //   - LoopInitVarName: 'i' (as VarDecl).
 //   - LoopEndExpr: '10+1' (as Expr).
 static const char LoopCounterName[] = "for_loop_counter";
 static const char LoopParentName[] = "loop_parent";
 static const char VectorVarDeclName[] = "vector_var_decl";
 static const char VectorVarDeclStmtName[] = "vector_var_decl_stmt";
-static const char PushBackCallName[] = "push_back_call";
+static const char PushBackOrEmplaceBackCallName[] =
+"push_back_or_emplace_back_call";
 static const char LoopInitVarName[] = "loop_init_var";
 static const char LoopEndExprName[] = "loop_end_expr";
 
@@ -81,13 +82,13 @@
   const auto VectorVarDecl =
   varDecl(hasInitializer(VectorDefaultConstructorCall))
   .bind(VectorVarDeclName);
-  const auto PushBackCallExpr =
+  const auto VectorAppendCallExpr =
   cxxMemberCallExpr(
-  callee(cxxMethodDecl(hasName("push_back"))), on(hasType(VectorDecl)),
+  callee(cxxMethodDecl(hasAnyName("push_back", "emplace_back"))),
+  on(hasType(VectorDecl)),
   onImplicitObjectArgument(declRefExpr(to(VectorVarDecl
-  .bind(PushBackCallName);
-  const auto PushBackCall =
-  expr(anyOf(PushBackCallExpr, exprWithCleanups(has(PushBackCallExpr;
+  .bind(PushBackOrEmplaceBackCallName);
+  const auto VectorAppendCall = expr(ignoringImplicit(VectorAppendCallExpr));
   const auto VectorVarDefStmt =
   declStmt(hasSingleDecl(equalsBoundNode(VectorVarDeclName)))
   .bind(VectorVarDeclStmtName);
@@ -98,9 +99,11 @@
   const auto RefersToLoopVar = ignoringParenImpCasts(
   declRefExpr(to(varDecl(equalsBoundNode(LoopInitVarName);
 
-  // Matchers for the loop whose body has only 1 push_back calling statement.
-  const auto HasInterestingLoopBody = hasBody(anyOf(
-  compoundStmt(statementCountIs(1), has(PushBackCall)), PushBackCall));
+  // Matchers for the loop whose body has only 1 push_back/emplace_back calling
+  // statement.
+  const auto HasInterestingLoopBody =
+  hasBody(anyOf(compoundStmt(statementCountIs(1), has(VectorAppendCall)),
+

[PATCH] D33209: [clang-tidy] Add "emplace_back" detection in inefficient-vector-operation.

2017-05-16 Thread Alexander Kornienko via Phabricator via cfe-commits
alexfh added inline comments.



Comment at: clang-tidy/performance/InefficientVectorOperationCheck.cpp:208
+   "consider pre-allocating the vector capacity before the loop")
+  << VectorAppendCall->getMethodDecl()->getDeclName();
 

Diagnostic builder should be able to format NamedDecls directly, this 
`->getDeclName()` is not necessary. The only difference is that it will likely 
add quotes around the name, which seems to be good anyway.


Repository:
  rL LLVM

https://reviews.llvm.org/D33209



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


[PATCH] D33209: [clang-tidy] Add "emplace_back" detection in inefficient-vector-operation.

2017-05-15 Thread Malcolm Parsons via Phabricator via cfe-commits
malcolm.parsons added a subscriber: cfe-commits.
malcolm.parsons added inline comments.



Comment at: clang-tidy/performance/InefficientVectorOperationCheck.cpp:92
+  const auto VectorAppendCall = expr(
+  anyOf(VectorAppendCallExpr, 
exprWithCleanups(has(VectorAppendCallExpr;
   const auto VectorVarDefStmt =

I'd use ignoringImplicit(VectorAppendCallExpr) to ignore ExprWithCleanups.


Repository:
  rL LLVM

https://reviews.llvm.org/D33209



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