re PR c++/67216 (false is still a null pointer constant)
authorPaolo Carlini <paolo.carlini@oracle.com>
Mon, 17 Aug 2015 21:40:07 +0000 (21:40 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 17 Aug 2015 21:40:07 +0000 (21:40 +0000)
/cp
2015-08-17  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/67216
* call.c (null_ptr_cst_p): In C++11 return 'false' for 'false'.

/testsuite
2015-08-17  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/67216
* g++.dg/cpp0x/nullptr34.C: New.
* g++.dg/warn/Wconversion2.C: Adjust.
* g++.dg/warn/Wnull-conversion-1.C: Likewise.
* g++.old-deja/g++.other/null3.C: Likewise.

* g++.dg/cpp0x/pr51313.C: Adjust.

From-SVN: r226956

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/nullptr34.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/pr51313.C
gcc/testsuite/g++.dg/warn/Wconversion2.C
gcc/testsuite/g++.dg/warn/Wnull-conversion-1.C
gcc/testsuite/g++.old-deja/g++.other/null3.C

index ca00d03e11d398c892b44bef637e6ee745f38cf9..0bf33c8eb6a3937e2ec16d80a60f8be25091b97a 100644 (file)
@@ -1,3 +1,8 @@
+2015-08-17  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/67216
+       * call.c (null_ptr_cst_p): In C++11 return 'false' for 'false'.
+
 2015-08-17  Jason Merrill  <jason@redhat.com>
 
        PR c++/67244
index 19ddb91e08fc53137c0e8a0a1fe7c0bb386574de..909ac990189fa69a2e63fa3660ecc78472f8760c 100644 (file)
@@ -524,22 +524,33 @@ struct z_candidate {
 bool
 null_ptr_cst_p (tree t)
 {
+  tree type = TREE_TYPE (t);
+
   /* [conv.ptr]
 
      A null pointer constant is an integral constant expression
      (_expr.const_) rvalue of integer type that evaluates to zero or
      an rvalue of type std::nullptr_t. */
-  if (NULLPTR_TYPE_P (TREE_TYPE (t)))
+  if (NULLPTR_TYPE_P (type))
     return true;
-  if (CP_INTEGRAL_TYPE_P (TREE_TYPE (t)))
+
+  if (cxx_dialect >= cxx11)
     {
       /* Core issue 903 says only literal 0 is a null pointer constant.  */
-      if (cxx_dialect < cxx11)
-       t = fold_non_dependent_expr (t);
+      if (TREE_CODE (type) == INTEGER_TYPE
+         && TREE_CODE (t) == INTEGER_CST
+         && integer_zerop (t)
+         && !TREE_OVERFLOW (t))
+       return true;
+    }
+  else if (CP_INTEGRAL_TYPE_P (type))
+    {
+      t = fold_non_dependent_expr (t);
       STRIP_NOPS (t);
       if (integer_zerop (t) && !TREE_OVERFLOW (t))
        return true;
     }
+
   return false;
 }
 
index 93aed719457fb29e799c910a0d47bb0476d0f5e1..2f1ba2532a1058980725a726ef017fb0b3eaf6f6 100644 (file)
@@ -1,3 +1,13 @@
+2015-08-17  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/67216
+       * g++.dg/cpp0x/nullptr34.C: New.
+       * g++.dg/warn/Wconversion2.C: Adjust.
+       * g++.dg/warn/Wnull-conversion-1.C: Likewise.
+       * g++.old-deja/g++.other/null3.C: Likewise.
+
+       * g++.dg/cpp0x/pr51313.C: Adjust.
+
 2015-08-17  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/67221
diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr34.C b/gcc/testsuite/g++.dg/cpp0x/nullptr34.C
new file mode 100644 (file)
index 0000000..2fc70a1
--- /dev/null
@@ -0,0 +1,17 @@
+// PR c++/67216
+// { dg-do compile { target c++11 } }
+
+struct s {
+    s( long ) {}
+};
+
+struct t {
+    t( void * ) {}
+};
+
+void foo(s) {}
+void foo(t) {}
+
+int main() {
+    foo(false);
+}
index eb304ba44808cdba9570aef9ff85a916bc9254ed..afd281359c5b46e35935dd83b51c1bc6ad073e3e 100644 (file)
@@ -14,5 +14,5 @@ extern ostream cout;
 
 int main()
 {
-  cout << isdigit(0);
+  cout << isdigit(0);  // { dg-error "invalid conversion" }
 }
index 226dd852b760e3a020af926208e36857b4ba4580..d105d922059cb92b04a613b4d55eb25eb38c36bb 100644 (file)
@@ -1,3 +1,4 @@
 // { dg-options "-Wconversion-null" }
 void foo(const char *); 
-void bar() { foo(false); } // { dg-warning "pointer type for argument" }
+void bar() { foo(false); } // { dg-warning "pointer type for argument" "" { target { ! c++11 } } }
+// { dg-error "cannot convert" "" { target c++11 } 3 }
index 84a1d380bb7cd7ecd8934cf7c7827716449e8a38..d35074417e7e0de545c56a1d35e7d7bae37d8aa0 100644 (file)
@@ -6,10 +6,13 @@
 void func1(int* ptr);
 
 void func2() {
-  int* t = false;             // { dg-warning "converting 'false' to pointer" }
+  int* t = false;             // { dg-warning "converting 'false' to pointer" "" { target { ! c++11 } } }
+// { dg-error "cannot convert" "" { target c++11 } 9 }
   int* p;
-  p = false;                  // { dg-warning "converting 'false' to pointer" }
+  p = false;                  // { dg-warning "converting 'false' to pointer" "" { target { ! c++11 } } }
+// { dg-error "cannot convert" "" { target c++11 } 12 }
   int* r = sizeof(char) / 2;  // { dg-error "invalid conversion from" "" { target c++11 } }
-  func1(false);               // { dg-warning "converting 'false' to pointer" }
+  func1(false);               // { dg-warning "converting 'false' to pointer" "" { target { ! c++11 } } }
+// { dg-error "cannot convert" "" { target c++11 } 15 }
   int i = NULL;               // { dg-warning "converting to non-pointer" }
 }
index 01071f9297b107b96d3ebd3936bfc8f22c3d743e..ff1d0669b698d0137cdfaaceb1acf91fc4c0e157 100644 (file)
@@ -2,5 +2,6 @@
 
 void x()
 {
- int* p = 1==0;        // { dg-warning "converting 'false' to pointer" }
+ int* p = 1==0;        // { dg-warning "converting 'false' to pointer" "" { target { ! c++11 } } }
+// { dg-error "cannot convert" "" { target c++11 } 5 } 
 }