summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang-tools-extra/cpp11-migrate/UseNullptr/NullptrMatchers.cpp10
-rw-r--r--clang-tools-extra/test/cpp11-migrate/UseNullptr/basic.cpp25
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));
+}
OpenPOWER on IntegriCloud