From 5f27a9f90d4eadadf937f1a5d0bfccf39261f330 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Thu, 11 Mar 2021 13:06:36 -0800 Subject: c++: Fix unhiding friend with imports [PR 99248] This was a simple thinko about which object held the reference to the binding vector. I also noticed stale code in the tree dumper, as I recently removed the flags from a lazy number. PR c++/99248 gcc/cp/ * name-lookup.c (lookup_elaborated_type_1): Access slot not bind when there's a binding vector. * ptree.c (cxx_print_xnode): Lazy flags are no longer a thing. gcc/testsuite/ * g++.dg/modules/pr99248.h: New. * g++.dg/modules/pr99248_a.H: New. * g++.dg/modules/pr99248_b.H: New. --- gcc/cp/name-lookup.c | 2 +- gcc/cp/ptree.c | 3 +-- gcc/testsuite/g++.dg/modules/pr99248.h | 5 +++++ gcc/testsuite/g++.dg/modules/pr99248_a.H | 5 +++++ gcc/testsuite/g++.dg/modules/pr99248_b.H | 7 +++++++ 5 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/modules/pr99248.h create mode 100644 gcc/testsuite/g++.dg/modules/pr99248_a.H create mode 100644 gcc/testsuite/g++.dg/modules/pr99248_b.H (limited to 'gcc') diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index 28271ba..d8839e2 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -7940,7 +7940,7 @@ lookup_elaborated_type_1 (tree name, TAG_how how) if (*slot == bind) *slot = decl; else - BINDING_VECTOR_CLUSTER (bind, 0) + BINDING_VECTOR_CLUSTER (*slot, 0) .slots[BINDING_SLOT_CURRENT] = decl; } } diff --git a/gcc/cp/ptree.c b/gcc/cp/ptree.c index e06fe6f..95a4fdf 100644 --- a/gcc/cp/ptree.c +++ b/gcc/cp/ptree.c @@ -310,8 +310,7 @@ cxx_print_xnode (FILE *file, tree node, int indent) { indent_to (file, indent + 4); unsigned lazy = slot.get_lazy (); - fprintf (file, "%s snum:%u flags:%d", - pfx, lazy >> 2, lazy & 3); + fprintf (file, "%s snum:%u", pfx, lazy); } else if (slot) print_node (file, pfx, slot, indent + 4); diff --git a/gcc/testsuite/g++.dg/modules/pr99248.h b/gcc/testsuite/g++.dg/modules/pr99248.h new file mode 100644 index 0000000..89d8dd5 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/pr99248.h @@ -0,0 +1,5 @@ +class locale +{ + template + friend struct __use_cache; +}; diff --git a/gcc/testsuite/g++.dg/modules/pr99248_a.H b/gcc/testsuite/g++.dg/modules/pr99248_a.H new file mode 100644 index 0000000..7f3fdda --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/pr99248_a.H @@ -0,0 +1,5 @@ +// PR 99248 ICE with friend +// { dg-additional-options -fmodule-header } +// { dg-module-cmi {} } +#include "pr99248.h" + diff --git a/gcc/testsuite/g++.dg/modules/pr99248_b.H b/gcc/testsuite/g++.dg/modules/pr99248_b.H new file mode 100644 index 0000000..33e242d --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/pr99248_b.H @@ -0,0 +1,7 @@ +// { dg-additional-options -fmodule-header } +// { dg-module-cmi {} } +#include "pr99248.h" +import "pr99248_a.H"; + +template +struct __use_cache; -- cgit v1.1