[PATCH] D63261: [clang-tidy] Fixed abseil-time-subtraction to work on C++17

Johan Vikström via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Jun 13 06:33:42 PDT 2019


jvikstrom created this revision.
jvikstrom added reviewers: hokein, gribozavr.
Herald added subscribers: cfe-commits, xazax.hun.
Herald added a project: clang.

Fixed abseil-time-subtraction to work on C++17


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D63261

Files:
  clang-tools-extra/clang-tidy/abseil/TimeSubtractionCheck.cpp
  clang-tools-extra/test/clang-tidy/abseil-time-subtraction.cpp


Index: clang-tools-extra/test/clang-tidy/abseil-time-subtraction.cpp
===================================================================
--- clang-tools-extra/test/clang-tidy/abseil-time-subtraction.cpp
+++ clang-tools-extra/test/clang-tidy/abseil-time-subtraction.cpp
@@ -1,4 +1,4 @@
-// RUN: %check_clang_tidy -std=c++11,c++14 %s abseil-time-subtraction %t -- -- -I %S/Inputs
+// RUN: %check_clang_tidy -std=c++11-or-later %s abseil-time-subtraction %t -- -- -I %S/Inputs
 // FIXME: Fix the checker to work in C++17 mode.
 
 #include "absl/time/time.h"
Index: clang-tools-extra/clang-tidy/abseil/TimeSubtractionCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/abseil/TimeSubtractionCheck.cpp
+++ clang-tools-extra/clang-tidy/abseil/TimeSubtractionCheck.cpp
@@ -29,16 +29,26 @@
 
 static bool isConstructorAssignment(const MatchFinder::MatchResult &Result,
                                     const Expr *Node) {
+  // For C++14 and earlier there are elidable constructors that must be matched
+  // in hasParent. The elidable constructors do not exist in C++17 and later and
+  // therefore an additional check that does not match against the elidable
+  // constructors are needed for this case.
   return selectFirst<const Expr>(
-             "e", match(expr(hasParent(materializeTemporaryExpr(hasParent(
-                                 cxxConstructExpr(hasParent(exprWithCleanups(
-                                     hasParent(varDecl()))))))))
-                            .bind("e"),
-                        *Node, *Result.Context)) != nullptr;
+             "e",
+             match(callExpr(hasParent(materializeTemporaryExpr(
+                                hasParent(cxxConstructExpr(hasParent(
+                                    exprWithCleanups(hasParent(varDecl()))))))))
+                       .bind("e"),
+                   *Node, *Result.Context)) != nullptr ||
+         selectFirst<const Expr>("e",
+                                 match(callExpr(hasParent(varDecl())).bind("e"),
+                                       *Node, *Result.Context)) != nullptr;
 }
 
 static bool isArgument(const MatchFinder::MatchResult &Result,
                        const Expr *Node) {
+  // For the same reason as in isConstructorAssignment two separate selectFirsts
+  // need to be checked here
   return selectFirst<const Expr>(
              "e",
              match(expr(hasParent(
@@ -46,16 +56,26 @@
                                 hasParent(callExpr()),
                                 unless(hasParent(cxxOperatorCallExpr())))))))
                        .bind("e"),
-                   *Node, *Result.Context)) != nullptr;
+                   *Node, *Result.Context)) != nullptr ||
+         selectFirst<const Expr>(
+             "e", match(expr(hasParent(callExpr()),
+                             unless(hasParent(cxxOperatorCallExpr())))
+                            .bind("e"),
+                        *Node, *Result.Context)) != nullptr;
 }
 
 static bool isReturn(const MatchFinder::MatchResult &Result, const Expr *Node) {
+  // For the same reason as in isConstructorAssignment two separate selectFirsts
+  // need to be checked here
   return selectFirst<const Expr>(
              "e", match(expr(hasParent(materializeTemporaryExpr(hasParent(
                                  cxxConstructExpr(hasParent(exprWithCleanups(
                                      hasParent(returnStmt()))))))))
                             .bind("e"),
-                        *Node, *Result.Context)) != nullptr;
+                        *Node, *Result.Context)) != nullptr ||
+         selectFirst<const Expr>("e",
+                                 match(expr(hasParent(returnStmt())).bind("e"),
+                                       *Node, *Result.Context)) != nullptr;
 }
 
 static bool parensRequired(const MatchFinder::MatchResult &Result,


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D63261.204515.patch
Type: text/x-patch
Size: 3931 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190613/f70d2ba1/attachment-0001.bin>


More information about the cfe-commits mailing list