forked from OSchip/llvm-project
[clang-tidy: modernize] modernize-redundant-void-arg crashes when a function body is in a macro
Fixes https://bugs.llvm.org/show_bug.cgi?id=28406 Patch by IdrissRio. Differential revision: https://reviews.llvm.org/D49800 llvm-svn: 339433
This commit is contained in:
parent
8c4b964c5a
commit
f337f5b7a5
|
@ -149,6 +149,8 @@ void RedundantVoidArgCheck::removeVoidArgumentTokens(
|
|||
ProtoToken.getRawIdentifier() == "void") {
|
||||
State = SawVoid;
|
||||
VoidToken = ProtoToken;
|
||||
} else if (ProtoToken.is(tok::TokenKind::l_paren)) {
|
||||
State = SawLeftParen;
|
||||
} else {
|
||||
State = NothingYet;
|
||||
}
|
||||
|
@ -235,10 +237,11 @@ void RedundantVoidArgCheck::processLambdaExpr(
|
|||
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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -445,3 +445,46 @@ struct DefinitionWithNoBody {
|
|||
// 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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue