]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: Fix unhiding friend with imports [PR 99248]
authorNathan Sidwell <nathan@acm.org>
Thu, 11 Mar 2021 21:06:36 +0000 (13:06 -0800)
committerNathan Sidwell <nathan@acm.org>
Thu, 11 Mar 2021 21:13:12 +0000 (13:13 -0800)
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
gcc/cp/ptree.c
gcc/testsuite/g++.dg/modules/pr99248.h [new file with mode: 0644]
gcc/testsuite/g++.dg/modules/pr99248_a.H [new file with mode: 0644]
gcc/testsuite/g++.dg/modules/pr99248_b.H [new file with mode: 0644]

index 28271ba04855f3ca8994f5dab53610fdd761a1b3..d8839e29fe57a471170b512670bebf6839a47176 100644 (file)
@@ -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;
                        }
                    }
index e06fe6f72c19f2074620a159f79bf5e6fab03de4..95a4fdf284aed8b96310be0787c629bbe8c150a2 100644 (file)
@@ -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 (file)
index 0000000..89d8dd5
--- /dev/null
@@ -0,0 +1,5 @@
+class locale
+{
+  template<typename _Cache>
+  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 (file)
index 0000000..7f3fdda
--- /dev/null
@@ -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 (file)
index 0000000..33e242d
--- /dev/null
@@ -0,0 +1,7 @@
+// { dg-additional-options -fmodule-header }
+// { dg-module-cmi {} }
+#include "pr99248.h"
+import "pr99248_a.H";
+
+template<typename _Facet>
+struct __use_cache;