void RedundantVoidArgCheck::processFunctionDecl(
const MatchFinder::MatchResult &Result, const FunctionDecl *Function) {
if (Function->isThisDeclarationADefinition()) {
- const Stmt *Body = Function->getBody();
SourceLocation Start = Function->getBeginLoc();
- SourceLocation End =
- Body ? Body->getBeginLoc().getLocWithOffset(-1) : Function->getEndLoc();
+ SourceLocation End = Function->getEndLoc();
+ if (const Stmt *Body = Function->getBody()) {
+ End = Body->getBeginLoc();
+ if (End.isMacroID() &&
+ Result.SourceManager->isAtStartOfImmediateMacroExpansion(End))
+ End = Result.SourceManager->getExpansionLoc(End);
+ End = End.getLocWithOffset(-1);
+ }
removeVoidArgumentTokens(Result, SourceRange(Start, End),
"function definition");
} else {
void RedundantVoidArgCheck::removeVoidToken(Token VoidToken,
StringRef Diagnostic) {
- SourceLocation VoidLoc(VoidToken.getLocation());
- auto VoidRange =
- CharSourceRange::getTokenRange(VoidLoc, VoidLoc.getLocWithOffset(3));
- diag(VoidLoc, Diagnostic) << FixItHint::CreateRemoval(VoidRange);
+ SourceLocation VoidLoc = VoidToken.getLocation();
+ diag(VoidLoc, Diagnostic) << FixItHint::CreateRemoval(VoidLoc);
}
void RedundantVoidArgCheck::processTypedefNameDecl(
// CHECK-FIXES: []() BODY;
}
+namespace qqq {
+void foo() BODY
+void bar(void) BODY;
+// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: redundant void argument list in function definition
+// CHECK-FIXES: void bar() BODY;
+}
+
struct S_1 {
void g_1(void) const {
// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: redundant void argument list in function definition [modernize-redundant-void-arg]