re PR c++/65339 (C++ ICE with lambda and no capture list)
authorJason Merrill <jason@redhat.com>
Mon, 9 Mar 2015 19:59:54 +0000 (15:59 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 9 Mar 2015 19:59:54 +0000 (15:59 -0400)
PR c++/65339
* call.c: Don't call maybe_resolve_dummy when calling a constructor.

From-SVN: r221285

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

index cd2d0765998bd412ddd2e116ebc2fedea386c5b4..67aa184bcb1f9d641787c178bdb15d12dd7751af 100644 (file)
@@ -1,3 +1,8 @@
+2015-03-09  Jason Merrill  <jason@redhat.com>
+
+       PR c++/65339
+       * call.c: Don't call maybe_resolve_dummy when calling a constructor.
+
 2015-03-09  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/65120
index 2b15185a8951eebbb48065f790fe89e102f60646..fdd8436d53e7bc4ed99804da709df9f49f338910 100644 (file)
@@ -8020,7 +8020,11 @@ build_new_method_call_1 (tree instance, tree fns, vec<tree, va_gc> **args,
      that would be captured if the call turns out to be to a
      non-static member function.  Do not actually capture it at this
      point.  */
-  first_mem_arg = maybe_resolve_dummy (instance, false);
+  if (DECL_CONSTRUCTOR_P (fn))
+    /* Constructors don't use the enclosing 'this'.  */
+    first_mem_arg = instance;
+  else
+    first_mem_arg = maybe_resolve_dummy (instance, false);
 
   /* Get the high-water mark for the CONVERSION_OBSTACK.  */
   p = conversion_obstack_alloc (0);
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv9.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv9.C
new file mode 100644 (file)
index 0000000..d7955fd
--- /dev/null
@@ -0,0 +1,27 @@
+// PR c++/65339
+// { dg-do compile { target c++11 } }
+
+class FuncWrapper {
+public:
+  template <typename Func> void callfunc(Func f)
+  {
+     f();
+  }
+};
+
+class Object {
+  int field;
+public:
+  void Method();
+  Object() { field = 555; }
+  Object(const Object&) { __builtin_abort(); }
+};
+
+void Object::Method ()
+{
+  FuncWrapper wrap;
+  wrap.callfunc(*[]()
+               {
+                 return Object();
+               });
+}