[clang-tools-extra] r363272 - [clang-tidy] Fixed abseil-time-subtraction to work on C++17

Dmitri Gribenko via cfe-commits cfe-commits at lists.llvm.org
Thu Jun 13 08:11:02 PDT 2019


Author: gribozavr
Date: Thu Jun 13 08:11:02 2019
New Revision: 363272

URL: http://llvm.org/viewvc/llvm-project?rev=363272&view=rev
Log:
[clang-tidy] Fixed abseil-time-subtraction to work on C++17

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

Reviewers: hokein, gribozavr

Subscribers: xazax.hun, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D63261

Patch by Johan Vikström.

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

Modified: clang-tools-extra/trunk/clang-tidy/abseil/TimeSubtractionCheck.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/abseil/TimeSubtractionCheck.cpp?rev=363272&r1=363271&r2=363272&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/abseil/TimeSubtractionCheck.cpp (original)
+++ clang-tools-extra/trunk/clang-tidy/abseil/TimeSubtractionCheck.cpp Thu Jun 13 08:11:02 2019
@@ -29,33 +29,52 @@ static bool InsideMacroDefinition(const
 
 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(expr(anyOf(
+                       callExpr(hasParent(materializeTemporaryExpr(hasParent(
+                                    cxxConstructExpr(hasParent(exprWithCleanups(
+                                        hasParent(varDecl()))))))))
+                           .bind("e"),
+                       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 AST shapes need to be
+  // matched here.
   return selectFirst<const Expr>(
              "e",
-             match(expr(hasParent(
-                            materializeTemporaryExpr(hasParent(cxxConstructExpr(
-                                hasParent(callExpr()),
-                                unless(hasParent(cxxOperatorCallExpr())))))))
-                       .bind("e"),
-                   *Node, *Result.Context)) != nullptr;
+             match(
+                 expr(anyOf(
+                     expr(hasParent(materializeTemporaryExpr(
+                              hasParent(cxxConstructExpr(
+                                  hasParent(callExpr()),
+                                  unless(hasParent(cxxOperatorCallExpr())))))))
+                         .bind("e"),
+                     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 AST shapes need to be
+  // matched here.
   return selectFirst<const Expr>(
-             "e", match(expr(hasParent(materializeTemporaryExpr(hasParent(
-                                 cxxConstructExpr(hasParent(exprWithCleanups(
-                                     hasParent(returnStmt()))))))))
-                            .bind("e"),
-                        *Node, *Result.Context)) != nullptr;
+             "e",
+             match(expr(anyOf(
+                       expr(hasParent(materializeTemporaryExpr(hasParent(
+                                cxxConstructExpr(hasParent(exprWithCleanups(
+                                    hasParent(returnStmt()))))))))
+                           .bind("e"),
+                       expr(hasParent(returnStmt())).bind("e"))),
+                   *Node, *Result.Context)) != nullptr;
 }
 
 static bool parensRequired(const MatchFinder::MatchResult &Result,

Modified: clang-tools-extra/trunk/test/clang-tidy/abseil-time-subtraction.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/abseil-time-subtraction.cpp?rev=363272&r1=363271&r2=363272&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/clang-tidy/abseil-time-subtraction.cpp (original)
+++ clang-tools-extra/trunk/test/clang-tidy/abseil-time-subtraction.cpp Thu Jun 13 08:11:02 2019
@@ -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"




More information about the cfe-commits mailing list