forked from OSchip/llvm-project
Fix crash in redundant-void-arg check.
Summary: When applying this check to the unit tests, it would hit an assertion: llvm/tools/clang/lib/Lex/Lexer.cpp:1056: clang::SourceLocation clang::Lexer::getSourceLocation(const char*, unsigned int) const: Assertion `PP && "This doesn't work on raw lexers"' failed. Reviewers: klimek, LegalizeAdulthood, alexfh Subscribers: cfe-commits, alexfh Differential Revision: http://reviews.llvm.org/D14204 llvm-svn: 251792
This commit is contained in:
parent
8286b83f97
commit
dd4ed3af98
|
@ -47,8 +47,8 @@ namespace modernize {
|
|||
|
||||
void RedundantVoidArgCheck::registerMatchers(MatchFinder *Finder) {
|
||||
Finder->addMatcher(functionDecl(isExpansionInMainFile(), parameterCountIs(0),
|
||||
unless(isImplicit()),
|
||||
unless(isExternC())).bind(FunctionId),
|
||||
unless(isImplicit()), unless(isExternC()))
|
||||
.bind(FunctionId),
|
||||
this);
|
||||
Finder->addMatcher(typedefDecl(isExpansionInMainFile()).bind(TypedefId),
|
||||
this);
|
||||
|
@ -77,9 +77,10 @@ void RedundantVoidArgCheck::registerMatchers(MatchFinder *Finder) {
|
|||
cxxReinterpretCastExpr(isExpansionInMainFile(), CastDestinationIsFunction)
|
||||
.bind(NamedCastId),
|
||||
this);
|
||||
Finder->addMatcher(cxxConstCastExpr(isExpansionInMainFile(),
|
||||
CastDestinationIsFunction).bind(NamedCastId),
|
||||
this);
|
||||
Finder->addMatcher(
|
||||
cxxConstCastExpr(isExpansionInMainFile(), CastDestinationIsFunction)
|
||||
.bind(NamedCastId),
|
||||
this);
|
||||
Finder->addMatcher(lambdaExpr(isExpansionInMainFile()).bind(LambdaId), this);
|
||||
}
|
||||
|
||||
|
@ -128,11 +129,14 @@ void RedundantVoidArgCheck::processFunctionDecl(
|
|||
void RedundantVoidArgCheck::removeVoidArgumentTokens(
|
||||
const ast_matchers::MatchFinder::MatchResult &Result, SourceRange Range,
|
||||
StringRef GrammarLocation) {
|
||||
std::string DeclText =
|
||||
Lexer::getSourceText(CharSourceRange::getTokenRange(Range),
|
||||
*Result.SourceManager,
|
||||
Result.Context->getLangOpts()).str();
|
||||
Lexer PrototypeLexer(Range.getBegin(), Result.Context->getLangOpts(),
|
||||
CharSourceRange CharRange = Lexer::makeFileCharRange(
|
||||
CharSourceRange::getTokenRange(Range), *Result.SourceManager,
|
||||
Result.Context->getLangOpts());
|
||||
|
||||
std::string DeclText = Lexer::getSourceText(CharRange, *Result.SourceManager,
|
||||
Result.Context->getLangOpts())
|
||||
.str();
|
||||
Lexer PrototypeLexer(CharRange.getBegin(), Result.Context->getLangOpts(),
|
||||
DeclText.data(), DeclText.data(),
|
||||
DeclText.data() + DeclText.size());
|
||||
enum TokenState {
|
||||
|
|
|
@ -417,3 +417,19 @@ void test_lambda_functions() {
|
|||
// CHECK-MESSAGES: [[@LINE-2]]:45: warning: {{.*}} in lambda expression
|
||||
// CHECK-FIXES: {{^ }}auto void_returner = []() -> void (*)() { return f1; };{{$}}
|
||||
}
|
||||
|
||||
#define M(x) x
|
||||
|
||||
M(void inmacro(void) {})
|
||||
// CHECK-MESSAGES: :[[@LINE-1]]:16: warning: {{.*}} in function definition
|
||||
// CHECK-FIXES: M(void inmacro() {})
|
||||
|
||||
#define F(A, B) \
|
||||
struct F_##A##_##B { \
|
||||
F_##A##_##B(void); \
|
||||
}; \
|
||||
F_##A##_##B::F_##A##_##B(void)
|
||||
|
||||
F(Foo, Bar) {
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue