Hi,

here we ICE in C++11 mode in null_ptr_cst_p because integer_zerop is true for a NOP_EXPR, which TREE_OVERFLOW cannot handle. Thus the idea is using STRIP_NOPS in C++11 mode too: makes sense to me unless we have reasons of principle to exclude NOPs in that mode. Anyway, patch passes testing on x86_64-linux.

Thanks,
Paolo.

///////////////////////
/cp
2011-12-02  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/51313
        * call.c (null_ptr_cst_p): STRIP_NOPS in c++11 mode too.

/testsuite
2011-12-02  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/51313
        * g++.dg/cpp0x/pr51313.C: New.
        
Index: testsuite/g++.dg/cpp0x/pr51313.C
===================================================================
--- testsuite/g++.dg/cpp0x/pr51313.C    (revision 0)
+++ testsuite/g++.dg/cpp0x/pr51313.C    (revision 0)
@@ -0,0 +1,18 @@
+// PR c++/51313
+// { dg-options "-std=c++0x" }
+
+class ostream;
+
+extern "C" {
+  extern int isdigit (int);
+}
+
+ostream&
+operator<<(ostream&, const unsigned char*);
+
+extern ostream cout;
+
+int main()
+{
+  cout << isdigit(0);
+}
Index: cp/call.c
===================================================================
--- cp/call.c   (revision 181932)
+++ cp/call.c   (working copy)
@@ -549,10 +549,8 @@ null_ptr_cst_p (tree t)
     {
       /* Core issue 903 says only literal 0 is a null pointer constant.  */
       if (cxx_dialect < cxx0x)
-       {
-         t = integral_constant_value (t);
-         STRIP_NOPS (t);
-       }
+       t = integral_constant_value (t);
+      STRIP_NOPS (t);
       if (integer_zerop (t) && !TREE_OVERFLOW (t))
        return true;
     }

Reply via email to