[pushed] c++: fix arm-eabi bootstrap [PR105567]

Message ID 20220511175153.3460763-1-jason@redhat.com
State Committed
Commit 4dc86f716fe6087f1cf786d69c0c6f3f5af810f0
Headers
Series [pushed] c++: fix arm-eabi bootstrap [PR105567] |

Commit Message

Jason Merrill May 11, 2022, 5:51 p.m. UTC
  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.

Tested x86_64-pc-linux-gnu and arm-eabi sim, applying to trunk.

	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                       |  4 ++--
 gcc/testsuite/g++.dg/template/ctor10.C | 10 ++++++++++
 2 files changed, 12 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/template/ctor10.C


base-commit: 0acdbe29f66017fc5cca40dcbd72a0dd41491d07
  

Patch

diff --git a/gcc/cp/typeck.cc b/gcc/cp/typeck.cc
index 57e55ed48d1..6ecdd97697d 100644
--- a/gcc/cp/typeck.cc
+++ b/gcc/cp/typeck.cc
@@ -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
index 00000000000..cf10fc5b19a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/ctor10.C
@@ -0,0 +1,10 @@ 
+// PR bootstrap/105567
+// This was breaking with cdtor_returns_this.
+
+template <class T>
+struct A
+{
+  A() { return; }
+};
+
+A<int> a;