From: Edwin Vane Date: Sun, 17 Feb 2013 16:45:54 +0000 (+0000) Subject: Fix -use-nullptr problems with assert() X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4ad00b46fbb0bfe2530b6cdd8803937166bfa80f;p=platform%2Fupstream%2Fllvm.git Fix -use-nullptr problems with assert() If a cast expression (NullToPointer) is detected in a function-like macro parameter, we should use the spelling location instead of the expansion location. Using SourceManager::getFileLoc() fixes this problem. Also added testcases for this bug. Fixes: PR15279 Author: Tareq A Siraj Reviewer: klimek llvm-svn: 175399 --- diff --git a/clang-tools-extra/cpp11-migrate/UseNullptr/NullptrActions.cpp b/clang-tools-extra/cpp11-migrate/UseNullptr/NullptrActions.cpp index 54ea3e8..22cdbc6 100644 --- a/clang-tools-extra/cpp11-migrate/UseNullptr/NullptrActions.cpp +++ b/clang-tools-extra/cpp11-migrate/UseNullptr/NullptrActions.cpp @@ -57,6 +57,10 @@ public: SourceLocation StartLoc = FirstCast->getLocStart(); SourceLocation EndLoc = FirstCast->getLocEnd(); + // If the start/end location is a macro, get the expansion location. + StartLoc = SM.getFileLoc(StartLoc); + EndLoc = SM.getFileLoc(EndLoc); + if (SM.getFileID(StartLoc) == SM.getFileID(EndLoc) && SM.isFromMainFile(StartLoc) && SM.isFromMainFile(EndLoc)) { CharSourceRange Range(SourceRange(StartLoc, EndLoc), true); @@ -100,10 +104,9 @@ void NullptrFixer::run(const ast_matchers::MatchFinder::MatchResult &Result) { if (SM.getFileID(StartLoc) != SM.getFileID(EndLoc)) return; - if (StartLoc.isMacroID()) - StartLoc = SM.getExpansionLoc(StartLoc); - if (EndLoc.isMacroID()) - EndLoc = SM.getExpansionLoc(EndLoc); + // If the start/end location is a macro, get the expansion location. + StartLoc = SM.getFileLoc(StartLoc); + EndLoc = SM.getFileLoc(EndLoc); if (!SM.isFromMainFile(StartLoc) || !SM.isFromMainFile(EndLoc)) return; diff --git a/clang-tools-extra/test/cpp11-migrate/UseNullptr/basic.cpp b/clang-tools-extra/test/cpp11-migrate/UseNullptr/basic.cpp index a0d93b1..c9dc404 100644 --- a/clang-tools-extra/test/cpp11-migrate/UseNullptr/basic.cpp +++ b/clang-tools-extra/test/cpp11-migrate/UseNullptr/basic.cpp @@ -178,3 +178,29 @@ int test_function_return6() { return g_null; // CHECK: return g_null; } + +// Test function-like macros where the parameter to the macro (expression) +// results in a nullptr. +void __dummy_assert_fail() {} + +void test_function_like_macro1() { + // This tests that the CastSequenceVisitor is working properly. +#define my_assert(expr) \ + ((expr) ? static_cast(expr) : __dummy_assert_fail()) + + int *p; + my_assert(p != 0); + // CHECK: my_assert(p != nullptr); +#undef my_assert +} + +void test_function_like_macro2() { + // This tests that the implicit cast is working properly. +#define my_macro(expr) \ + (expr) + + int *p; + my_macro(p != 0); + // CHECK: my_macro(p != nullptr); +#undef my_macro +}