]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/54170 (Call to lambda elided)
authorPaolo Carlini <paolo.carlini@oracle.com>
Wed, 10 Jul 2013 05:53:45 +0000 (05:53 +0000)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 10 Jul 2013 05:53:45 +0000 (01:53 -0400)
/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: r200863

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 b0e6133b9f78ebca24ec35bf9f2b898f78845a94..5b5acd930699386f450664f5fd06ae60949f3d38 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 c411a47f0a8f6960b59f92f431d42d208dea9042..d7ad05b1583c57f57c3f17cca0143f2dbcd84a70 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 796eea6465cbabfd3228d2a071cd0e044055a0c7..688946ab7c7b611526d37b734a2f570d96812080 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 10df7f3331b2143d468447608f7e753096d8105d..1f7cfff2fcd9e47441fb3b6c8d39f3d14e2563b5 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>();
+}