Index: gcc/gcc/testsuite/g++.dg/warn/null4.C |
diff --git a/gcc/gcc/testsuite/g++.dg/warn/null4.C b/gcc/gcc/testsuite/g++.dg/warn/null4.C |
index 785f27904882c5e5e0b954048d7992ca5da562e2..6aa4a097fadefefda64d70f0fc0ed6d60d80891d 100644 |
--- a/gcc/gcc/testsuite/g++.dg/warn/null4.C |
+++ b/gcc/gcc/testsuite/g++.dg/warn/null4.C |
@@ -11,9 +11,22 @@ int foo (void) |
if (NULL < NULL) return -1; // { dg-warning "NULL used in arithmetic" } |
if (NULL >= 0) return -1; // { dg-warning "NULL used in arithmetic" } |
if (NULL <= 0) return -1; // { dg-warning "NULL used in arithmetic" } |
+ // Adding to the NULL pointer, which has no specific type, should |
+ // result in a warning; the type of the resulting expression is |
+ // actually "int", not a pointer type. |
+ if (NULL + 1) return -1; // { dg-warning "NULL used in arithmetic" } |
+ if (1 + NULL) return -1; // { dg-warning "NULL used in arithmetic" } |
return 0; |
} |
+int *ip; |
+ |
+struct S {}; |
+typedef int S::*SPD; |
+typedef void (S::*SPF)(void); |
+SPD spd; |
+SPF spf; |
+ |
int bar (void) |
{ |
if (NULL) return -1; |
@@ -25,5 +38,18 @@ int bar (void) |
if (NULL != NULL) return -1; |
if (NULL == 0) return -1; |
if (NULL != 0) return -1; |
+ // Subtraction of pointers is vaild, so using NULL is OK. |
+ if (ip - NULL) return -1; |
+ if (NULL - NULL) return -1; |
+ // Comparing NULL with a pointer-to-member is OK. |
+ if (NULL == spd) return -1; |
+ if (spd == NULL) return -1; |
+ if (NULL != spd) return -1; |
+ if (spd != NULL) return -1; |
+ if (NULL == spf) return -1; |
+ if (spf == NULL) return -1; |
+ if (NULL != spf) return -1; |
+ if (spf != NULL) return -1; |
+ |
return 0; |
} |