public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-9441] c++: DMI in template with virtual base [PR106890]
@ 2023-04-18 20:46 Jason Merrill
  0 siblings, 0 replies; only message in thread
From: Jason Merrill @ 2023-04-18 20:46 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:94569d91bd4c604da755b4aae84256e7fe21196a

commit r12-9441-g94569d91bd4c604da755b4aae84256e7fe21196a
Author: Jason Merrill <jason@redhat.com>
Date:   Sat Mar 18 08:27:26 2023 -0400

    c++: DMI in template with virtual base [PR106890]
    
    When parsing a default member init we just build a CONVERT_EXPR for
    converting to a virtual base, and then expand that into the more complex
    form when we actually use the DMI in a constructor.  But that wasn't working
    for the template case where we are considering the conversion at the point
    that the constructor needs the DMI instantiation, so it seemed like we were
    in a constructor already.  And then when the other constructor tries to
    reuse the instantiation, it sees uses of the first constructor's parameters,
    and dies.  So ensure that we get the CONVERT_EXPR in this case, too.
    
            PR c++/106890
    
    gcc/cp/ChangeLog:
    
            * init.cc (maybe_instantiate_nsdmi_init): Don't leave
            current_function_decl set to a constructor.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/cpp0x/nsdmi-template25.C: New test.

Diff:
---
 gcc/cp/init.cc                                | 14 ++++++++++++++
 gcc/testsuite/g++.dg/cpp0x/nsdmi-template25.C | 18 ++++++++++++++++++
 2 files changed, 32 insertions(+)

diff --git a/gcc/cp/init.cc b/gcc/cp/init.cc
index 75dbfe112b5..92969857ea8 100644
--- a/gcc/cp/init.cc
+++ b/gcc/cp/init.cc
@@ -613,6 +613,18 @@ maybe_instantiate_nsdmi_init (tree member, tsubst_flags_t complain)
 	      pushed = true;
 	    }
 
+	  /* If we didn't push_to_top_level, still step out of constructor
+	     scope so build_base_path doesn't try to use its __in_chrg.  */
+	  tree cfd = current_function_decl;
+	  auto cbl = current_binding_level;
+	  if (at_function_scope_p ())
+	    {
+	      current_function_decl
+		= decl_function_context (current_function_decl);
+	      while (current_binding_level->kind != sk_class)
+		current_binding_level = current_binding_level->level_chain;
+	    }
+
 	  inject_this_parameter (ctx, TYPE_UNQUALIFIED);
 
 	  start_lambda_scope (member);
@@ -631,6 +643,8 @@ maybe_instantiate_nsdmi_init (tree member, tsubst_flags_t complain)
 	  if (init != error_mark_node)
 	    hash_map_safe_put<hm_ggc> (nsdmi_inst, member, init);
 
+	  current_function_decl = cfd;
+	  current_binding_level = cbl;
 	  if (pushed)
 	    {
 	      pop_deferring_access_checks ();
diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-template25.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-template25.C
new file mode 100644
index 00000000000..368e745540e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-template25.C
@@ -0,0 +1,18 @@
+// PR c++/106890
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+  int p;
+};
+
+template<typename T>
+struct B : virtual public A
+{
+  B() { }
+  B(int) { }
+
+  int k = this->p;
+};
+
+template struct B<int>;

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-04-18 20:46 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-04-18 20:46 [gcc r12-9441] c++: DMI in template with virtual base [PR106890] Jason Merrill

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).