OSDN Git Service

/cp
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 10 Jul 2013 05:53:45 +0000 (05:53 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 10 Jul 2013 05:53:45 +0000 (05:53 +0000)
2012-12-03  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/54170
* cvt.c (cp_convert_to_pointer): Don't discard side-effects from
expressions of nullptr_t.
* typeck.c (build_ptrmemfunc): Likewise.

/testsuite
2012-12-03  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/54170
* g++.dg/cpp0x/lambda/lambda-nullptr.C: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@200863 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/cvt.c
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nullptr.C [new file with mode: 0644]

index b0e6133..5b5acd9 100644 (file)
@@ -1,3 +1,10 @@
+2012-12-03  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/54170
+       * cvt.c (cp_convert_to_pointer): Don't discard side-effects from
+       expressions of nullptr_t.
+       * typeck.c (build_ptrmemfunc): Likewise.
+
 2013-07-09  Jason Merrill  <jason@redhat.com>
 
        PR c++/57437
index c411a47..d7ad05b 100644 (file)
@@ -198,6 +198,8 @@ cp_convert_to_pointer (tree type, tree expr)
 
   if (null_ptr_cst_p (expr))
     {
+      tree val;
+
       if (c_inhibit_evaluation_warnings == 0
          && !NULLPTR_TYPE_P (TREE_TYPE (expr)))
        warning (OPT_Wzero_as_null_pointer_constant,
@@ -207,16 +209,14 @@ cp_convert_to_pointer (tree type, tree expr)
        return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr, 0,
                                 /*c_cast_p=*/false, tf_warning_or_error);
 
-      if (TYPE_PTRMEM_P (type))
-       {
-         /* A NULL pointer-to-member is represented by -1, not by
-            zero.  */
-         expr = build_int_cst_type (type, -1);
-       }
-      else
-       expr = build_int_cst (type, 0);
+      /* A NULL pointer-to-data-member is represented by -1, not by
+        zero.  */
+      val = (TYPE_PTRMEM_P (type)
+            ? build_int_cst_type (type, -1)
+            : build_int_cst (type, 0));
 
-      return expr;
+      return (TREE_SIDE_EFFECTS (expr)
+             ? build2 (COMPOUND_EXPR, type, expr, val) : val);
     }
   else if (TYPE_PTR_TO_MEMBER_P (type) && INTEGRAL_CODE_P (form))
     {
index 796eea6..688946a 100644 (file)
@@ -7246,7 +7246,7 @@ build_ptrmemfunc (tree type, tree pfn, int force, bool c_cast_p,
   /* Handle null pointer to member function conversions.  */
   if (null_ptr_cst_p (pfn))
     {
-      pfn = build_c_cast (input_location, type, nullptr_node);
+      pfn = build_c_cast (input_location, type, pfn);
       return build_ptrmemfunc1 (to_type,
                                integer_zero_node,
                                pfn);
index 10df7f3..1f7cfff 100644 (file)
@@ -1,3 +1,8 @@
+2012-12-03  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/54170
+       * g++.dg/cpp0x/lambda/lambda-nullptr.C: New.
+
 2013-07-08  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/57785
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nullptr.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nullptr.C
new file mode 100644 (file)
index 0000000..8a4d028
--- /dev/null
@@ -0,0 +1,47 @@
+// PR c++/54170
+// { dg-do run { target c++11 } }
+
+#include <cassert>
+
+struct A;
+typedef A* ptr;
+typedef int (A::*pmf) (int);
+typedef int (A::*pdm);
+
+int total;
+
+void add(int n)
+{
+  total += n;
+}
+
+template <typename RType, typename Callable>
+RType Call(Callable native_func, int arg)
+{
+  return native_func(arg);
+}
+
+template <typename RType>
+RType do_test(int delta)
+{
+  return Call<RType>([=](int delta) { add(delta); return nullptr; }, delta);
+}
+
+template <typename RType>
+void test()
+{
+  total = 0;
+  assert (!do_test<RType>(5));
+  assert (total == 5);
+  assert (!do_test<RType>(20));
+  assert (total == 25);
+  assert (!do_test<RType>(-256));
+  assert (total == -231);
+}
+
+int main()
+{
+  test<ptr>();
+  test<pdm>();
+  test<pmf>();
+}