Index: clang-tools-extra/trunk/clang-tidy/modernize/RedundantVoidArgCheck.cpp =================================================================== --- clang-tools-extra/trunk/clang-tidy/modernize/RedundantVoidArgCheck.cpp +++ clang-tools-extra/trunk/clang-tidy/modernize/RedundantVoidArgCheck.cpp @@ -149,6 +149,8 @@ ProtoToken.getRawIdentifier() == "void") { State = SawVoid; VoidToken = ProtoToken; + } else if (ProtoToken.is(tok::TokenKind::l_paren)) { + State = SawLeftParen; } else { State = NothingYet; } @@ -235,10 +237,11 @@ const MatchFinder::MatchResult &Result, const LambdaExpr *Lambda) { if (Lambda->getLambdaClass()->getLambdaCallOperator()->getNumParams() == 0 && Lambda->hasExplicitParameters()) { - SourceLocation Begin = - Lambda->getIntroducerRange().getEnd().getLocWithOffset(1); - SourceLocation End = Lambda->getBody()->getBeginLoc().getLocWithOffset(-1); - removeVoidArgumentTokens(Result, SourceRange(Begin, End), + SourceManager *SM = Result.SourceManager; + TypeLoc TL = Lambda->getLambdaClass()->getLambdaTypeInfo()->getTypeLoc(); + removeVoidArgumentTokens(Result, + {SM->getSpellingLoc(TL.getBeginLoc()), + SM->getSpellingLoc(TL.getEndLoc())}, "lambda expression"); } } Index: clang-tools-extra/trunk/test/clang-tidy/modernize-redundant-void-arg.cpp =================================================================== --- clang-tools-extra/trunk/test/clang-tidy/modernize-redundant-void-arg.cpp +++ clang-tools-extra/trunk/test/clang-tidy/modernize-redundant-void-arg.cpp @@ -445,3 +445,46 @@ // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: {{.*}} in function definition // CHECK-FIXES: DefinitionWithNoBody() = delete; }; + + + +#define BODY {} +#define LAMBDA1 [](void){} +// CHECK-MESSAGES: :[[@LINE-1]]:20: warning: redundant void argument list in lambda expression [modernize-redundant-void-arg] +// CHECK-FIXES: LAMBDA1 [](){} + +#define LAMBDA2 [](void)BODY +// CHECK-MESSAGES: :[[@LINE-1]]:20: warning: redundant void argument list in lambda expression [modernize-redundant-void-arg] +// CHECK-FIXES: LAMBDA2 []()BODY + +#define LAMBDA3(captures, args, body) captures args body +#define WRAP(...) __VA_ARGS__ + +#define LAMBDA4 (void)LAMBDA3([],(void),BODY) +// CHECK-MESSAGES: :[[@LINE-1]]:35: warning: redundant void argument list in lambda expression [modernize-redundant-void-arg] +// CHECK-FIXES: LAMBDA4 (void)LAMBDA3([],(),BODY) + +#define LAMBDA5 []() -> void (*)(void) {return BODY;} +// CHECK-MESSAGES: :[[@LINE-1]]:34: warning: redundant void argument list in lambda expression [modernize-redundant-void-arg] +// CHECK-FIXES: LAMBDA5 []() -> void (*)() {return BODY;} +void lambda_expression_with_macro_test(){ + (void)LAMBDA1; + (void)LAMBDA2; + (void)LAMBDA3([], (void), BODY); + // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: redundant void argument list in lambda expression [modernize-redundant-void-arg] + // CHECK-FIXES: (void)LAMBDA3([], (), BODY); + + LAMBDA4; + LAMBDA5; + WRAP((void)WRAP(WRAP(LAMBDA3(WRAP([]), WRAP((void)), WRAP(BODY))))); + // CHECK-MESSAGES: :[[@LINE-1]]:48: warning: redundant void argument list in lambda expression [modernize-redundant-void-arg] + // CHECK-FIXES: WRAP((void)WRAP(WRAP(LAMBDA3(WRAP([]), WRAP(()), WRAP(BODY))))); + + (void)WRAP([](void) {}); + // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: redundant void argument list in lambda expression [modernize-redundant-void-arg] + // CHECK-FIXES: (void)WRAP([]() {}); + + [](void) BODY; + // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: redundant void argument list in lambda expression [modernize-redundant-void-arg] + // CHECK-FIXES: []() BODY; +}