[PATCH] D82278: Fix traversal over CXXConstructExpr in Syntactic mode

2020-10-30 Thread Stephen Kelly via Phabricator via cfe-commits
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG52ff86d25598: [AST] Fix traversal over CXXConstructExpr in 
Syntactic mode (authored by stephenkelly).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D82278

Files:
  clang/lib/AST/Expr.cpp
  clang/lib/AST/ParentMapContext.cpp
  clang/unittests/AST/ASTTraverserTest.cpp
  clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp

Index: clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
===
--- clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
+++ clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
@@ -2088,6 +2088,98 @@
 
   EXPECT_TRUE(matches(Code, traverse(TK_IgnoreUnlessSpelledInSource,
  staticAssertDecl(has(integerLiteral());
+
+  Code = R"cpp(
+
+struct OneParamCtor {
+  explicit OneParamCtor(int);
+};
+struct TwoParamCtor {
+  explicit TwoParamCtor(int, int);
+};
+
+void varDeclCtors() {
+  {
+  auto var1 = OneParamCtor(5);
+  auto var2 = TwoParamCtor(6, 7);
+  }
+  {
+  OneParamCtor var3(5);
+  TwoParamCtor var4(6, 7);
+  }
+  int i = 0;
+  {
+  auto var5 = OneParamCtor(i);
+  auto var6 = TwoParamCtor(i, 7);
+  }
+  {
+  OneParamCtor var7(i);
+  TwoParamCtor var8(i, 7);
+  }
+}
+
+)cpp";
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_AsIs, varDecl(hasName("var1"), hasInitializer(hasDescendant(
+ cxxConstructExpr()));
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_AsIs, varDecl(hasName("var2"), hasInitializer(hasDescendant(
+ cxxConstructExpr()));
+  EXPECT_TRUE(matches(
+  Code, traverse(TK_AsIs, varDecl(hasName("var3"),
+  hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code, traverse(TK_AsIs, varDecl(hasName("var4"),
+  hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_AsIs, varDecl(hasName("var5"), hasInitializer(hasDescendant(
+ cxxConstructExpr()));
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_AsIs, varDecl(hasName("var6"), hasInitializer(hasDescendant(
+ cxxConstructExpr()));
+  EXPECT_TRUE(matches(
+  Code, traverse(TK_AsIs, varDecl(hasName("var7"),
+  hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code, traverse(TK_AsIs, varDecl(hasName("var8"),
+  hasInitializer(cxxConstructExpr());
+
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var1"), hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var2"), hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var3"), hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var4"), hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var5"), hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var6"), hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var7"), hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var8"), hasInitializer(cxxConstructExpr());
 }
 
 template 
@@ -2293,21 +2385,20 @@
  forFunction(functionDecl(hasName("func2"),
   langCxx20OrLater()));
 
-  EXPECT_TRUE(matches(
-  Code,
-  traverse(
-  TK_IgnoreUnlessSpelledInSource,
-  returnStmt(forFunction(functionDecl(hasName("func3"))),
- hasReturnValue(cxxFunctionalCastExpr(
- hasSourceExpression(integerLiteral(equals(42))),
-  langCxx20OrLater()));
+  EXPECT_TRUE(
+  matches(Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   returnStmt(forFunction(functionDecl(hasName("func3"))),
+  hasReturnValue(cxxConstructExpr(hasArgument(
+  

[PATCH] D82278: Fix traversal over CXXConstructExpr in Syntactic mode

2020-10-29 Thread Aaron Ballman via Phabricator via cfe-commits
aaron.ballman accepted this revision.
aaron.ballman added a comment.

LGTM!


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D82278

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


[PATCH] D82278: Fix traversal over CXXConstructExpr in Syntactic mode

2020-10-29 Thread Stephen Kelly via Phabricator via cfe-commits
steveire updated this revision to Diff 301636.
steveire added a comment.

Update


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D82278

Files:
  clang/lib/AST/Expr.cpp
  clang/lib/AST/ParentMapContext.cpp
  clang/unittests/AST/ASTTraverserTest.cpp
  clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp

Index: clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
===
--- clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
+++ clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
@@ -2088,6 +2088,98 @@
 
   EXPECT_TRUE(matches(Code, traverse(TK_IgnoreUnlessSpelledInSource,
  staticAssertDecl(has(integerLiteral());
+
+  Code = R"cpp(
+
+struct OneParamCtor {
+  explicit OneParamCtor(int);
+};
+struct TwoParamCtor {
+  explicit TwoParamCtor(int, int);
+};
+
+void varDeclCtors() {
+  {
+  auto var1 = OneParamCtor(5);
+  auto var2 = TwoParamCtor(6, 7);
+  }
+  {
+  OneParamCtor var3(5);
+  TwoParamCtor var4(6, 7);
+  }
+  int i = 0;
+  {
+  auto var5 = OneParamCtor(i);
+  auto var6 = TwoParamCtor(i, 7);
+  }
+  {
+  OneParamCtor var7(i);
+  TwoParamCtor var8(i, 7);
+  }
+}
+
+)cpp";
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_AsIs, varDecl(hasName("var1"), hasInitializer(hasDescendant(
+ cxxConstructExpr()));
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_AsIs, varDecl(hasName("var2"), hasInitializer(hasDescendant(
+ cxxConstructExpr()));
+  EXPECT_TRUE(matches(
+  Code, traverse(TK_AsIs, varDecl(hasName("var3"),
+  hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code, traverse(TK_AsIs, varDecl(hasName("var4"),
+  hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_AsIs, varDecl(hasName("var5"), hasInitializer(hasDescendant(
+ cxxConstructExpr()));
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_AsIs, varDecl(hasName("var6"), hasInitializer(hasDescendant(
+ cxxConstructExpr()));
+  EXPECT_TRUE(matches(
+  Code, traverse(TK_AsIs, varDecl(hasName("var7"),
+  hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code, traverse(TK_AsIs, varDecl(hasName("var8"),
+  hasInitializer(cxxConstructExpr());
+
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var1"), hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var2"), hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var3"), hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var4"), hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var5"), hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var6"), hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var7"), hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var8"), hasInitializer(cxxConstructExpr());
 }
 
 template 
@@ -2293,21 +2385,20 @@
  forFunction(functionDecl(hasName("func2"),
   langCxx20OrLater()));
 
-  EXPECT_TRUE(matches(
-  Code,
-  traverse(
-  TK_IgnoreUnlessSpelledInSource,
-  returnStmt(forFunction(functionDecl(hasName("func3"))),
- hasReturnValue(cxxFunctionalCastExpr(
- hasSourceExpression(integerLiteral(equals(42))),
-  langCxx20OrLater()));
+  EXPECT_TRUE(
+  matches(Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   returnStmt(forFunction(functionDecl(hasName("func3"))),
+  hasReturnValue(cxxConstructExpr(hasArgument(
+  0, integerLiteral(equals(42))),
+  langCxx20OrLater()));
 
   EXPECT_TRUE(matches(
   Code,
   traverse(
   

[PATCH] D82278: Fix traversal over CXXConstructExpr in Syntactic mode

2020-10-29 Thread Yitzhak Mandelbaum via Phabricator via cfe-commits
ymandel added inline comments.



Comment at: clang/lib/AST/Expr.cpp:2822
+  if (SE->getSourceRange() == E->getSourceRange())
+return Cast->getSubExpr();
+}

nit: just `return SE`?



Comment at: clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp:1236
   EXPECT_TRUE(matches(foo_class + "void r() { Foo f = Foo(\"hello world\"); }",
-  cxxFunctionalCastExpr()));
+  traverse(TK_AsIs, cxxFunctionalCastExpr(;
 }

is this necessary/desirable given that we reverted the default behavior? if so, 
should we update other tests (at least, others involving this matcher) as well?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D82278

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


[PATCH] D82278: Fix traversal over CXXConstructExpr in Syntactic mode

2020-10-25 Thread Stephen Kelly via Phabricator via cfe-commits
steveire marked 2 inline comments as done.
steveire added inline comments.



Comment at: clang-tools-extra/clang-tidy/bugprone/UnusedRaiiCheck.cpp:80
   auto Matches =
-  match(expr(hasDescendant(typeLoc().bind("t"))), *E, *Result.Context);
+  match(traverse(TK_AsIs, expr(hasDescendant(typeLoc().bind("t", *E,
+*Result.Context);

aaron.ballman wrote:
> While I believe the change is necessary here, it's not obvious to me what 
> "hints" tell me this behavior is correct for the given matchers. None of the 
> matchers look like they're going to care about implicit nodes, so how am I to 
> know that AsIs is correct or not as a reviewer? As it stands, I sort of feel 
> like I have to take it on faith that this change is correct and it looks a 
> little suspicious because the code using the matcher is creating a fix-it at 
> what now may be the location of an implicit node.
I don't know if I was wrong about it being required before, or if it was 
required before, but the change to this file is not required now.



Comment at: clang/lib/AST/Expr.cpp:3001
 Expr *A = C->getArg(0);
-if (A->getSourceRange() == SR || !isa(C))
+if (A->getSourceRange() == SR || C->isElidable()) {
   E = A;

ymandel wrote:
> aaron.ballman wrote:
> > Looks like the change introduced new curly braces for a single-line if.
> Why is it necessary to check isElidable?  I think the logic here is subtle 
> (since the AST doesn't explicitly tag implicit expressions), so please add an 
> explanatory comment.
The `ignoringElidableConstructorCall` does it this way. I'm afraid I don't know 
more than that.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D82278

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


[PATCH] D82278: Fix traversal over CXXConstructExpr in Syntactic mode

2020-10-25 Thread Stephen Kelly via Phabricator via cfe-commits
steveire updated this revision to Diff 300550.
steveire added a comment.

Rebased


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D82278

Files:
  clang-tools-extra/clang-tidy/bugprone/ThrowKeywordMissingCheck.cpp
  clang/lib/AST/Expr.cpp
  clang/lib/AST/ParentMapContext.cpp
  clang/unittests/AST/ASTTraverserTest.cpp
  clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp
  clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp

Index: clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
===
--- clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
+++ clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
@@ -2088,6 +2088,98 @@
 
   EXPECT_TRUE(matches(Code, traverse(TK_IgnoreUnlessSpelledInSource,
  staticAssertDecl(has(integerLiteral());
+
+  Code = R"cpp(
+
+struct OneParamCtor {
+  explicit OneParamCtor(int);
+};
+struct TwoParamCtor {
+  explicit TwoParamCtor(int, int);
+};
+
+void varDeclCtors() {
+  {
+  auto var1 = OneParamCtor(5);
+  auto var2 = TwoParamCtor(6, 7);
+  }
+  {
+  OneParamCtor var3(5);
+  TwoParamCtor var4(6, 7);
+  }
+  int i = 0;
+  {
+  auto var5 = OneParamCtor(i);
+  auto var6 = TwoParamCtor(i, 7);
+  }
+  {
+  OneParamCtor var7(i);
+  TwoParamCtor var8(i, 7);
+  }
+}
+
+)cpp";
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_AsIs, varDecl(hasName("var1"), hasInitializer(hasDescendant(
+ cxxConstructExpr()));
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_AsIs, varDecl(hasName("var2"), hasInitializer(hasDescendant(
+ cxxConstructExpr()));
+  EXPECT_TRUE(matches(
+  Code, traverse(TK_AsIs, varDecl(hasName("var3"),
+  hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code, traverse(TK_AsIs, varDecl(hasName("var4"),
+  hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_AsIs, varDecl(hasName("var5"), hasInitializer(hasDescendant(
+ cxxConstructExpr()));
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_AsIs, varDecl(hasName("var6"), hasInitializer(hasDescendant(
+ cxxConstructExpr()));
+  EXPECT_TRUE(matches(
+  Code, traverse(TK_AsIs, varDecl(hasName("var7"),
+  hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code, traverse(TK_AsIs, varDecl(hasName("var8"),
+  hasInitializer(cxxConstructExpr());
+
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var1"), hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var2"), hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var3"), hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var4"), hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var5"), hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var6"), hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var7"), hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var8"), hasInitializer(cxxConstructExpr());
 }
 
 template 
@@ -2293,21 +2385,20 @@
  forFunction(functionDecl(hasName("func2"),
   langCxx20OrLater()));
 
-  EXPECT_TRUE(matches(
-  Code,
-  traverse(
-  TK_IgnoreUnlessSpelledInSource,
-  returnStmt(forFunction(functionDecl(hasName("func3"))),
- hasReturnValue(cxxFunctionalCastExpr(
- hasSourceExpression(integerLiteral(equals(42))),
-  langCxx20OrLater()));
+  EXPECT_TRUE(
+  matches(Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   returnStmt(forFunction(functionDecl(hasName("func3"))),
+  hasReturnValue(cxxConstructExpr(hasArgument(
+  0, integerLiteral(equals(42))),
+  

[PATCH] D82278: Fix traversal over CXXConstructExpr in Syntactic mode

2020-07-07 Thread Yitzhak Mandelbaum via Phabricator via cfe-commits
ymandel added a comment.

Thanks for this fix!




Comment at: clang/lib/AST/Expr.cpp:3001
 Expr *A = C->getArg(0);
-if (A->getSourceRange() == SR || !isa(C))
+if (A->getSourceRange() == SR || C->isElidable()) {
   E = A;

aaron.ballman wrote:
> Looks like the change introduced new curly braces for a single-line if.
Why is it necessary to check isElidable?  I think the logic here is subtle 
(since the AST doesn't explicitly tag implicit expressions), so please add an 
explanatory comment.



Comment at: clang/lib/AST/ParentMapContext.cpp:163
   if (const auto *C = dyn_cast(E)) {
-if (C->getSourceRange() == SR || !isa(C))
+if (C->getSourceRange() == SR || C->isElidable())
   return true;

Same here. Please comment on the logic.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D82278



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


[PATCH] D82278: Fix traversal over CXXConstructExpr in Syntactic mode

2020-07-07 Thread Aaron Ballman via Phabricator via cfe-commits
aaron.ballman added reviewers: rsmith, sammccall.
aaron.ballman added inline comments.



Comment at: clang-tools-extra/clang-tidy/bugprone/UnusedRaiiCheck.cpp:80
   auto Matches =
-  match(expr(hasDescendant(typeLoc().bind("t"))), *E, *Result.Context);
+  match(traverse(TK_AsIs, expr(hasDescendant(typeLoc().bind("t", *E,
+*Result.Context);

While I believe the change is necessary here, it's not obvious to me what 
"hints" tell me this behavior is correct for the given matchers. None of the 
matchers look like they're going to care about implicit nodes, so how am I to 
know that AsIs is correct or not as a reviewer? As it stands, I sort of feel 
like I have to take it on faith that this change is correct and it looks a 
little suspicious because the code using the matcher is creating a fix-it at 
what now may be the location of an implicit node.



Comment at: clang/lib/AST/Expr.cpp:3001
 Expr *A = C->getArg(0);
-if (A->getSourceRange() == SR || !isa(C))
+if (A->getSourceRange() == SR || C->isElidable()) {
   E = A;

Looks like the change introduced new curly braces for a single-line if.



Comment at: clang/lib/AST/ParentMapContext.cpp:157
 
+  if (auto *C = dyn_cast(E)) {
+if (C->getSourceRange() == SR)

`const auto *`


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D82278



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


[PATCH] D82278: Fix traversal over CXXConstructExpr in Syntactic mode

2020-06-21 Thread Stephen Kelly via Phabricator via cfe-commits
steveire created this revision.
steveire added reviewers: klimek, ymandel.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Skip over elidable nodes, and ensure that intermediate
CXXFunctionalCastExpr nodes are also skipped if they are semantic.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D82278

Files:
  clang-tools-extra/clang-tidy/bugprone/ThrowKeywordMissingCheck.cpp
  clang-tools-extra/clang-tidy/bugprone/UnusedRaiiCheck.cpp
  clang/lib/AST/Expr.cpp
  clang/lib/AST/ParentMapContext.cpp
  clang/unittests/AST/ASTTraverserTest.cpp
  clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp
  clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp

Index: clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
===
--- clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
+++ clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
@@ -1891,6 +1891,98 @@
 
   EXPECT_TRUE(matches(Code, traverse(TK_IgnoreUnlessSpelledInSource,
  staticAssertDecl(has(integerLiteral());
+
+  Code = R"cpp(
+
+struct OneParamCtor {
+  explicit OneParamCtor(int);
+};
+struct TwoParamCtor {
+  explicit TwoParamCtor(int, int);
+};
+
+void varDeclCtors() {
+  {
+  auto var1 = OneParamCtor(5);
+  auto var2 = TwoParamCtor(6, 7);
+  }
+  {
+  OneParamCtor var3(5);
+  TwoParamCtor var4(6, 7);
+  }
+  int i = 0;
+  {
+  auto var5 = OneParamCtor(i);
+  auto var6 = TwoParamCtor(i, 7);
+  }
+  {
+  OneParamCtor var7(i);
+  TwoParamCtor var8(i, 7);
+  }
+}
+
+)cpp";
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_AsIs, varDecl(hasName("var1"), hasInitializer(hasDescendant(
+ cxxConstructExpr()));
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_AsIs, varDecl(hasName("var2"), hasInitializer(hasDescendant(
+ cxxConstructExpr()));
+  EXPECT_TRUE(matches(
+  Code, traverse(TK_AsIs, varDecl(hasName("var3"),
+  hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code, traverse(TK_AsIs, varDecl(hasName("var4"),
+  hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_AsIs, varDecl(hasName("var5"), hasInitializer(hasDescendant(
+ cxxConstructExpr()));
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_AsIs, varDecl(hasName("var6"), hasInitializer(hasDescendant(
+ cxxConstructExpr()));
+  EXPECT_TRUE(matches(
+  Code, traverse(TK_AsIs, varDecl(hasName("var7"),
+  hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code, traverse(TK_AsIs, varDecl(hasName("var8"),
+  hasInitializer(cxxConstructExpr());
+
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var1"), hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var2"), hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var3"), hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var4"), hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var5"), hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var6"), hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var7"), hasInitializer(cxxConstructExpr());
+  EXPECT_TRUE(matches(
+  Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+   varDecl(hasName("var8"), hasInitializer(cxxConstructExpr());
 }
 
 template 
@@ -2096,21 +2188,20 @@
  forFunction(functionDecl(hasName("func2"),
   langCxx20OrLater()));
 
-  EXPECT_TRUE(matches(
-  Code,
-  traverse(
-  TK_IgnoreUnlessSpelledInSource,
-  returnStmt(forFunction(functionDecl(hasName("func3"))),
- hasReturnValue(cxxFunctionalCastExpr(
- hasSourceExpression(integerLiteral(equals(42))),
-  langCxx20OrLater()));
+  EXPECT_TRUE(
+  matches(Code,
+  traverse(TK_IgnoreUnlessSpelledInSource,
+