Author: Justin Lebar Date: 2020-02-11T14:41:22-08:00 New Revision: ac66c61bf9463bf419102ad8b6565dcbc495b0ab
URL: https://github.com/llvm/llvm-project/commit/ac66c61bf9463bf419102ad8b6565dcbc495b0ab DIFF: https://github.com/llvm/llvm-project/commit/ac66c61bf9463bf419102ad8b6565dcbc495b0ab.diff LOG: Use C++14-style return type deduction in clang. Summary: Simplifies the C++11-style "-> decltype(...)" return-type deduction. Note that you have to be careful about whether the function return type is `auto` or `decltype(auto)`. The difference is that bare `auto` strips const and reference, just like lambda return type deduction. In some cases that's what we want (or more likely, we know that the return type is a value type), but whenever we're wrapping a templated function which might return a reference, we need to be sure that the return type is decltype(auto). No functional change. Reviewers: bkramer, MaskRay, martong, shafik Subscribers: martong, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D74423 Added: Modified: clang/lib/AST/ASTImporter.cpp clang/lib/StaticAnalyzer/Checkers/GCDAntipatternChecker.cpp clang/lib/StaticAnalyzer/Checkers/OSObjectCStyleCast.cpp clang/lib/StaticAnalyzer/Checkers/ObjCAutoreleaseWriteChecker.cpp clang/lib/StaticAnalyzer/Checkers/PointerSortingChecker.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp index 3361c7886c2d..49058ceaab25 100644 --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -204,9 +204,7 @@ namespace clang { // Wrapper for an overload set. template <typename ToDeclT> struct CallOverloadedCreateFun { - template <typename... Args> - auto operator()(Args &&... args) - -> decltype(ToDeclT::Create(std::forward<Args>(args)...)) { + template <typename... Args> decltype(auto) operator()(Args &&... args) { return ToDeclT::Create(std::forward<Args>(args)...); } }; diff --git a/clang/lib/StaticAnalyzer/Checkers/GCDAntipatternChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/GCDAntipatternChecker.cpp index d471c23b83bf..76fa56406443 100644 --- a/clang/lib/StaticAnalyzer/Checkers/GCDAntipatternChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/GCDAntipatternChecker.cpp @@ -52,18 +52,16 @@ class GCDAntipatternChecker : public Checker<check::ASTCodeBody> { BugReporter &BR) const; }; -auto callsName(const char *FunctionName) - -> decltype(callee(functionDecl())) { +decltype(auto) callsName(const char *FunctionName) { return callee(functionDecl(hasName(FunctionName))); } -auto equalsBoundArgDecl(int ArgIdx, const char *DeclName) - -> decltype(hasArgument(0, expr())) { +decltype(auto) equalsBoundArgDecl(int ArgIdx, const char *DeclName) { return hasArgument(ArgIdx, ignoringParenCasts(declRefExpr( to(varDecl(equalsBoundNode(DeclName)))))); } -auto bindAssignmentToDecl(const char *DeclName) -> decltype(hasLHS(expr())) { +decltype(auto) bindAssignmentToDecl(const char *DeclName) { return hasLHS(ignoringParenImpCasts( declRefExpr(to(varDecl().bind(DeclName))))); } diff --git a/clang/lib/StaticAnalyzer/Checkers/OSObjectCStyleCast.cpp b/clang/lib/StaticAnalyzer/Checkers/OSObjectCStyleCast.cpp index 5b9895c338d8..90d69b81305c 100644 --- a/clang/lib/StaticAnalyzer/Checkers/OSObjectCStyleCast.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/OSObjectCStyleCast.cpp @@ -55,8 +55,7 @@ static void emitDiagnostics(const BoundNodes &Nodes, CE->getSourceRange()); } -static auto hasTypePointingTo(DeclarationMatcher DeclM) - -> decltype(hasType(pointerType())) { +static decltype(auto) hasTypePointingTo(DeclarationMatcher DeclM) { return hasType(pointerType(pointee(hasDeclaration(DeclM)))); } diff --git a/clang/lib/StaticAnalyzer/Checkers/ObjCAutoreleaseWriteChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/ObjCAutoreleaseWriteChecker.cpp index d2371fe60d21..9d587c585650 100644 --- a/clang/lib/StaticAnalyzer/Checkers/ObjCAutoreleaseWriteChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/ObjCAutoreleaseWriteChecker.cpp @@ -100,8 +100,7 @@ static inline std::vector<llvm::StringRef> toRefs(std::vector<std::string> V) { return std::vector<llvm::StringRef>(V.begin(), V.end()); } -static auto callsNames(std::vector<std::string> FunctionNames) - -> decltype(callee(functionDecl())) { +static decltype(auto) callsNames(std::vector<std::string> FunctionNames) { return callee(functionDecl(hasAnyName(toRefs(FunctionNames)))); } diff --git a/clang/lib/StaticAnalyzer/Checkers/PointerSortingChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/PointerSortingChecker.cpp index 586d9d3af2a6..a3bfac97e40a 100644 --- a/clang/lib/StaticAnalyzer/Checkers/PointerSortingChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/PointerSortingChecker.cpp @@ -54,7 +54,7 @@ static void emitDiagnostics(const BoundNodes &Match, const Decl *D, OS.str(), Location, Range); } -auto callsName(const char *FunctionName) -> decltype(callee(functionDecl())) { +decltype(auto) callsName(const char *FunctionName) { return callee(functionDecl(hasName(FunctionName))); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits