diff options
-rw-r--r-- | clang-tools-extra/cpp11-migrate/UseNullptr/NullptrMatchers.cpp | 10 | ||||
-rw-r--r-- | clang-tools-extra/test/cpp11-migrate/UseNullptr/basic.cpp | 25 |
2 files changed, 31 insertions, 4 deletions
diff --git a/clang-tools-extra/cpp11-migrate/UseNullptr/NullptrMatchers.cpp b/clang-tools-extra/cpp11-migrate/UseNullptr/NullptrMatchers.cpp index e4baf05432f..43df883622a 100644 --- a/clang-tools-extra/cpp11-migrate/UseNullptr/NullptrMatchers.cpp +++ b/clang-tools-extra/cpp11-migrate/UseNullptr/NullptrMatchers.cpp @@ -58,10 +58,12 @@ StatementMatcher makeCastSequenceMatcher() { ); return castExpr( - unless(hasAncestor(explicitCastExpr())), anyOf( - hasDescendant(ImplicitCastToNull), - ImplicitCastToNull - ) + ImplicitCastToNull, + explicitCastExpr( + hasDescendant(ImplicitCastToNull) + ) + ), + unless(hasAncestor(explicitCastExpr())) ).bind(CastSequence); } diff --git a/clang-tools-extra/test/cpp11-migrate/UseNullptr/basic.cpp b/clang-tools-extra/test/cpp11-migrate/UseNullptr/basic.cpp index c84758e1cd2..b7c5d5e3516 100644 --- a/clang-tools-extra/test/cpp11-migrate/UseNullptr/basic.cpp +++ b/clang-tools-extra/test/cpp11-migrate/UseNullptr/basic.cpp @@ -221,6 +221,8 @@ struct Bam { void ambiguous_function(int *a) {} void ambiguous_function(float *a) {} +void const_ambiguous_function(const int *p) {} +void const_ambiguous_function(const float *p) {} void test_explicit_cast_ambiguous1() { ambiguous_function((int*)0); @@ -251,3 +253,26 @@ void test_explicit_cast_ambiguous5() { k = (int*)0; // CHECK: k = (int*)nullptr; } + +void test_const_pointers_abiguous() { + const_ambiguous_function((int*)0); + // CHECK: const_ambiguous_function((int*)nullptr); +} + +// Test where the implicit cast to null is surrounded by another implict cast +// with possible explict casts in-between. +void test_const_pointers() { + const int *const_p1 = 0; + // CHECK: const int *const_p1 = nullptr; + const int *const_p2 = NULL; + // CHECK: const int *const_p2 = nullptr; + const int *const_p3 = (int)0; + // CHECK: const int *const_p3 = nullptr; + const int *const_p4 = (int)0.0f; + // CHECK: const int *const_p4 = nullptr; + const int *const_p5 = (int*)0; + // CHECK: const int *const_p5 = (int*)nullptr; + int *t; + const int *const_p6 = static_cast<int*>(t ? t : static_cast<int*>(0)); + // CHECK: const int *const_p6 = static_cast<int*>(t ? t : static_cast<int*>(nullptr)); +} |