Skip to content

Commit 6873789

Browse files
committed
add WarnOnNontrailingVoid option to modernize-use-trailing-return-type check
1 parent d9f9064 commit 6873789

File tree

5 files changed

+59
-10
lines changed

5 files changed

+59
-10
lines changed

clang-tools-extra/clang-tidy/modernize/UseTrailingReturnTypeCheck.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,11 @@
88

99
#include "UseTrailingReturnTypeCheck.h"
1010
#include "clang/AST/ASTContext.h"
11+
#include "clang/AST/ASTTypeTraits.h"
12+
#include "clang/AST/DeclCXX.h"
1113
#include "clang/AST/RecursiveASTVisitor.h"
1214
#include "clang/ASTMatchers/ASTMatchFinder.h"
15+
#include "clang/ASTMatchers/ASTMatchers.h"
1316
#include "clang/Lex/Preprocessor.h"
1417
#include "clang/Tooling/FixIt.h"
1518
#include "llvm/ADT/StringExtras.h"
@@ -457,6 +460,7 @@ static void keepSpecifiers(std::string &ReturnType, std::string &Auto,
457460
UseTrailingReturnTypeCheck::UseTrailingReturnTypeCheck(
458461
StringRef Name, ClangTidyContext *Context)
459462
: ClangTidyCheck(Name, Context),
463+
WarnOnNonTrailingVoid(Options.get("WarnOnNonTrailingVoid", false)),
460464
TransformFunctions(Options.get("TransformFunctions", true)),
461465
TransformLambdas(Options.get("TransformLambdas", TransformLambda::All)) {
462466

@@ -469,18 +473,23 @@ UseTrailingReturnTypeCheck::UseTrailingReturnTypeCheck(
469473

470474
void UseTrailingReturnTypeCheck::storeOptions(
471475
ClangTidyOptions::OptionMap &Opts) {
476+
Options.store(Opts, "WarnOnNonTrailingVoid", WarnOnNonTrailingVoid);
472477
Options.store(Opts, "TransformFunctions", TransformFunctions);
473478
Options.store(Opts, "TransformLambdas", TransformLambdas);
474479
}
475480

476481
void UseTrailingReturnTypeCheck::registerMatchers(MatchFinder *Finder) {
482+
const auto HasNoWrittenReturnType =
483+
anyOf(cxxConversionDecl(), cxxConstructorDecl(), cxxDestructorDecl());
484+
477485
auto F =
478-
functionDecl(
479-
unless(anyOf(
480-
hasTrailingReturn(), returns(voidType()), cxxConversionDecl(),
486+
traverse(
487+
TK_IgnoreUnlessSpelledInSource,
488+
functionDecl(unless(anyOf(
489+
hasTrailingReturn(), HasNoWrittenReturnType,
490+
WarnOnNonTrailingVoid ? unless(anything()) : returns(voidType()),
481491
cxxMethodDecl(
482-
anyOf(isImplicit(),
483-
hasParent(cxxRecordDecl(hasParent(lambdaExpr()))))))))
492+
hasParent(cxxRecordDecl(hasParent(lambdaExpr()))))))))
484493
.bind("Func");
485494

486495
if (TransformFunctions) {

clang-tools-extra/clang-tidy/modernize/UseTrailingReturnTypeCheck.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class UseTrailingReturnTypeCheck : public ClangTidyCheck {
4040

4141
private:
4242
Preprocessor *PP = nullptr;
43+
const bool WarnOnNonTrailingVoid;
4344
const bool TransformFunctions;
4445
const TransformLambda TransformLambdas;
4546

clang-tools-extra/docs/ReleaseNotes.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,11 @@ Changes in existing checks
156156
- Improved :doc:`misc-header-include-cycle
157157
<clang-tidy/checks/misc/header-include-cycle>` check performance.
158158

159+
- Improved :doc:`modernize-use-trailing-return-type
160+
<clang-tidy/checks/modernize/use-trailing-return-type>` check by adding the
161+
option `WarnOnNonTrailingVoid` that applies the check to ``void``-returning
162+
functions that by default are excluded from this check.
163+
159164
- Improved :doc:`modernize-use-designated-initializers
160165
<clang-tidy/checks/modernize/use-designated-initializers>` check to
161166
suggest using designated initializers for aliased aggregate types.
@@ -190,6 +195,11 @@ Changes in existing checks
190195
<clang-tidy/checks/readability/qualified-auto>` check by adding the option
191196
`IgnoreAliasing`, that allows not looking at underlying types of type aliases.
192197

198+
- Improved :doc:`performance-unnecessary-value-param
199+
<clang-tidy/checks/performance/unnecessary-value-param>` check performance by
200+
tolerating fix-it breaking compilation when functions is used as pointers
201+
to avoid matching usage of functions within the current compilation unit.
202+
193203
Removed checks
194204
^^^^^^^^^^^^^^
195205

clang-tools-extra/docs/clang-tidy/checks/modernize/use-trailing-return-type.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@ transforms to:
2727
virtual auto f3() const && -> float = delete;
2828
auto lambda = []() -> void {};
2929

30+
Options
31+
-------
32+
33+
.. option:: WarnOnNonTrailingVoid
34+
35+
If the option is set to `true`, the check will apply even to function
36+
signatures with return type ``void``. Default is `false`.
3037

3138
Limitations
3239
-----------

clang-tools-extra/test/clang-tidy/checkers/modernize/use-trailing-return-type.cpp

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
1-
// RUN: %check_clang_tidy -std=c++14-or-later %s modernize-use-trailing-return-type %t -- -- -fdeclspec -fexceptions -DCOMMAND_LINE_INT=int
1+
// RUN: %check_clang_tidy \
2+
// RUN: -std=c++14-or-later %s modernize-use-trailing-return-type %t -- \
3+
// RUN: -- -fdeclspec -fexceptions -DCOMMAND_LINE_INT=int
4+
// RUN: %check_clang_tidy -check-suffixes=,WARN-ON-NONTRAILING-VOID \
5+
// RUN: -std=c++14-or-later %s modernize-use-trailing-return-type %t -- \
6+
// RUN: -config="{CheckOptions: { \
7+
// RUN: modernize-use-trailing-return-type.WarnOnNonTrailingVoid: true, \
8+
// RUN: }}" \
9+
// RUN: -- -fdeclspec -fexceptions -DCOMMAND_LINE_INT=int
210

311
namespace std {
412
template <typename T>
@@ -566,6 +574,24 @@ ostream& operator<<(ostream& ostream, int i);
566574
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use a trailing return type for this function [modernize-use-trailing-return-type]
567575
// CHECK-FIXES: {{^}}ostream& operator<<(ostream& ostream, int i);{{$}}
568576

577+
//
578+
// WarnOnNonTrailingVoid option
579+
//
580+
581+
void leadingVoid();
582+
// CHECK-MESSAGES-WARN-ON-NONTRAILING-VOID: :[[@LINE-1]]:6: warning: use a trailing return type for this function [modernize-use-trailing-return-type]
583+
// CHECK-FIXES-WARN-ON-NONTRAILING-VOID: {{^}}auto leadingVoid() -> void;{{$}}
584+
void leadingVoid(int arg);
585+
// CHECK-MESSAGES-WARN-ON-NONTRAILING-VOID: :[[@LINE-1]]:6: warning: use a trailing return type for this function [modernize-use-trailing-return-type]
586+
// CHECK-FIXES-WARN-ON-NONTRAILING-VOID: {{^}}auto leadingVoid(int arg) -> void;{{$}}
587+
void leadingVoid(int arg) { return; }
588+
// CHECK-MESSAGES-WARN-ON-NONTRAILING-VOID: :[[@LINE-1]]:6: warning: use a trailing return type for this function [modernize-use-trailing-return-type]
589+
// CHECK-FIXES-WARN-ON-NONTRAILING-VOID: {{^}}auto leadingVoid(int arg) -> void { return; }{{$}}
590+
591+
auto trailingVoid() -> void;
592+
auto trailingVoid(int arg) -> void;
593+
auto trailingVoid(int arg) -> void { return; }
594+
569595
//
570596
// Samples which do not trigger the check
571597
//
@@ -579,10 +605,6 @@ template <typename T> auto f(T t) -> int;
579605

580606
auto ff();
581607

582-
void c();
583-
void c(int arg);
584-
void c(int arg) { return; }
585-
586608
struct D2 : B {
587609
D2();
588610
virtual ~D2();

0 commit comments

Comments
 (0)