re PR c++/54170 (Call to lambda elided)
authorPaolo Carlini <paolo.carlini@oracle.com>
Mon, 3 Dec 2012 16:01:32 +0000 (16:01 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 3 Dec 2012 16:01:32 +0000 (16:01 +0000)
/cp
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.

From-SVN: r194098

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 b419f648a273abee4737ea7702534fc3a2b4245c..220b15688ff75f750390ad4ef8a97360adf97d58 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.
+
 2012-12-01  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/55542
index 4ba7642db202da74b84c2f24f0c03914618f33a4..7731b4a1f4b407707e9430565a792c1372625e1c 100644 (file)
@@ -215,16 +215,14 @@ cp_convert_to_pointer (tree type, tree expr, tsubst_flags_t complain)
        return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr, 0,
                                 /*c_cast_p=*/false, complain);
 
-      if (TYPE_PTRDATAMEM_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);
-
-      return expr;
+      /* A NULL pointer-to-data-member is represented by -1, not by
+        zero.  */
+      tree val = (TYPE_PTRDATAMEM_P (type)
+                 ? build_int_cst_type (type, -1)
+                 : build_int_cst (type, 0));
+
+      return (TREE_SIDE_EFFECTS (expr)
+             ? build2 (COMPOUND_EXPR, type, expr, val) : val);
     }
   else if (TYPE_PTRMEM_P (type) && INTEGRAL_CODE_P (form))
     {
index 1cbab61716703478a24d59f4653c12897a6a6b08..ef76dcdbeb80f255b45aa8ecd003bf81ad3bb1d7 100644 (file)
@@ -7567,7 +7567,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 550d459ed4f4be2b69cd47239727b3dd2032c309..89e7a7935830b7cddec97032923103613b666c0b 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.
+
 2012-12-03  Jakub Jelinek  <jakub@redhat.com>
 
        PR testsuite/55452
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..1aadbb4
--- /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>();
+}