c++: fix arm-eabi bootstrap [PR105567]
authorJason Merrill <jason@redhat.com>
Wed, 11 May 2022 13:44:57 +0000 (09:44 -0400)
committerJason Merrill <jason@redhat.com>
Wed, 11 May 2022 17:50:39 +0000 (13:50 -0400)
Since my r13-112, in the template we were changing 'return' to 'return this'
on cdtor_returns_this targets, and then getting confused by that when
instantiating.  So only make that change at instantiation time.

PR bootstrap/105567

gcc/cp/ChangeLog:

* typeck.cc (check_return_expr): Don't mess with ctor return value
while parsing a template.

gcc/testsuite/ChangeLog:

* g++.dg/template/ctor10.C: New test.

gcc/cp/typeck.cc
gcc/testsuite/g++.dg/template/ctor10.C [new file with mode: 0644]

index 57e55ed..6ecdd97 100644 (file)
@@ -10448,7 +10448,7 @@ check_return_expr (tree retval, bool *no_warning)
       if (retval)
        error_at (loc, "returning a value from a destructor");
 
-      if (targetm.cxx.cdtor_returns_this ())
+      if (targetm.cxx.cdtor_returns_this () && !processing_template_decl)
        retval = current_class_ptr;
       else
        return NULL_TREE;
@@ -10463,7 +10463,7 @@ check_return_expr (tree retval, bool *no_warning)
        /* You can't return a value from a constructor.  */
        error_at (loc, "returning a value from a constructor");
 
-      if (targetm.cxx.cdtor_returns_this ())
+      if (targetm.cxx.cdtor_returns_this () && !processing_template_decl)
        retval = current_class_ptr;
       else
        return NULL_TREE;
diff --git a/gcc/testsuite/g++.dg/template/ctor10.C b/gcc/testsuite/g++.dg/template/ctor10.C
new file mode 100644 (file)
index 0000000..cf10fc5
--- /dev/null
@@ -0,0 +1,10 @@
+// PR bootstrap/105567
+// This was breaking with cdtor_returns_this.
+
+template <class T>
+struct A
+{
+  A() { return; }
+};
+
+A<int> a;