From: Nathan Sidwell Date: Thu, 11 Mar 2021 21:06:36 +0000 (-0800) Subject: c++: Fix unhiding friend with imports [PR 99248] X-Git-Tag: basepoints/gcc-12~625 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5f27a9f90d4eadadf937f1a5d0bfccf39261f330;p=thirdparty%2Fgcc.git 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. --- diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index 28271ba04855..d8839e29fe57 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 e06fe6f72c19..95a4fdf284ae 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 000000000000..89d8dd5b39e8 --- /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 000000000000..7f3fddad3bc5 --- /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 000000000000..33e242d40144 --- /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;