Fixed Use-Nullptr when replacing return(0)

Before fix, the paren expression was being replaced resulting in returnnullptr.
ParenExpr and implicit casts now ignored so we get return(nullptr) instead.

Added new test cases.

Fixes PR15398

Author: Ariel Bernal <ariel.j.bernal@intel.com>
llvm-svn: 176551
This commit is contained in:
Edwin Vane 2013-03-06 14:51:34 +00:00
parent a1c0a2a2c6
commit 105963d17c
2 changed files with 35 additions and 2 deletions

View File

@ -110,8 +110,10 @@ void NullptrFixer::run(const ast_matchers::MatchFinder::MatchResult &Result) {
const CastExpr *Cast = Result.Nodes.getNodeAs<CastExpr>(ImplicitCastNode);
if (Cast) {
SourceLocation StartLoc = Cast->getLocStart();
SourceLocation EndLoc = Cast->getLocEnd();
const Expr *E = Cast->IgnoreParenImpCasts();
SourceLocation StartLoc = E->getLocStart();
SourceLocation EndLoc = E->getLocEnd();
// If the start/end location is a macro, get the expansion location.
StartLoc = SM.getFileLoc(StartLoc);

View File

@ -204,3 +204,34 @@ void test_function_like_macro2() {
// CHECK: my_macro(p != nullptr);
#undef my_macro
}
// Test parentheses expressions resulting in a nullptr.
int *test_parentheses_expression1() {
return(0);
// CHECK: return(nullptr);
}
int *test_parentheses_expression2() {
return(int(0.f));
// CHECK: return(nullptr);
}
int *test_nested_parentheses_expression() {
return((((0))));
// CHECK: return((((nullptr))));
}
void *test_parentheses_explicit_cast() {
return(static_cast<void*>(0));
// CHECK: return(nullptr);
}
void *test_parentheses_explicit_cast_sequence1() {
return(static_cast<void*>(static_cast<int*>((void*)NULL)));
// CHECK: return(nullptr);
}
void *test_parentheses_explicit_cast_sequence2() {
return(static_cast<void*>(reinterpret_cast<int*>((float*)int(0.f))));
// CHECK: return(nullptr);
}