* c++: Note duplicates in symbol table [PR 99283]
@ 2021-03-23 19:28 Nathan Sidwell
0 siblings, 0 replies; only message in thread
From: Nathan Sidwell @ 2021-03-23 19:28 UTC (permalink / raw)
To: GCC Patches
[-- Attachment #1: Type: text/plain, Size: 450 bytes --]
I ran into this reducing 99283, we were failing to mark binding vectors
when the current TU declares a duplicate decl (as opposed to an import
introduces a duplicate).
PR c++/99283
gcc/cp/
* name-lookup.c (check_module_override): Set global or partition
DUP on the binding vector.
gcc/testsuite/
* g++.dg/modules/pr99283-1_a.H: New.
* g++.dg/modules/pr99283-1_b.H: New.
--
Nathan Sidwell
[-- Attachment #2: pr99283-1.diff --]
[-- Type: text/x-patch, Size: 2671 bytes --]
diff --git c/gcc/cp/name-lookup.c w/gcc/cp/name-lookup.c
index a6257f5da32..f4263f15f62 100644
--- c/gcc/cp/name-lookup.c
+++ w/gcc/cp/name-lookup.c
@@ -3528,6 +3528,7 @@ static tree
check_module_override (tree decl, tree mvec, bool hiding,
tree scope, tree name)
{
+ tree match = NULL_TREE;
bitmap imports = get_import_bitmap ();
binding_cluster *cluster = BINDING_VECTOR_CLUSTER_BASE (mvec);
unsigned ix = BINDING_VECTOR_NUM_CLUSTERS (mvec);
@@ -3566,13 +3567,15 @@ check_module_override (tree decl, tree mvec, bool hiding,
bind = STAT_VISIBLE (bind);
for (ovl_iterator iter (bind); iter; ++iter)
- if (iter.using_p ())
- ;
- else if (tree match = duplicate_decls (decl, *iter, hiding))
- return match;
+ if (!iter.using_p ())
+ {
+ match = duplicate_decls (decl, *iter, hiding);
+ if (match)
+ goto matched;
+ }
}
- if (TREE_PUBLIC (scope) && TREE_PUBLIC (decl) && !not_module_p ()
+ if (TREE_PUBLIC (scope) && TREE_PUBLIC (STRIP_TEMPLATE (decl))
/* Namespaces are dealt with specially in
make_namespace_finish. */
&& !(TREE_CODE (decl) == NAMESPACE_DECL && !DECL_NAMESPACE_ALIAS (decl)))
@@ -3588,14 +3591,26 @@ check_module_override (tree decl, tree mvec, bool hiding,
for (ovl_iterator iter (mergeable); iter; ++iter)
{
- tree match = *iter;
-
- if (duplicate_decls (decl, match, hiding))
- return match;
+ match = duplicate_decls (decl, *iter, hiding);
+ if (match)
+ goto matched;
}
}
return NULL_TREE;
+
+ matched:
+ if (match != error_mark_node)
+ {
+ if (named_module_p ())
+ BINDING_VECTOR_PARTITION_DUPS_P (mvec) = true;
+ else
+ BINDING_VECTOR_GLOBAL_DUPS_P (mvec) = true;
+ }
+
+ return match;
+
+
}
/* Record DECL as belonging to the current lexical scope. Check for
diff --git c/gcc/testsuite/g++.dg/modules/pr99283-1_a.H w/gcc/testsuite/g++.dg/modules/pr99283-1_a.H
new file mode 100644
index 00000000000..95c8c06bec6
--- /dev/null
+++ w/gcc/testsuite/g++.dg/modules/pr99283-1_a.H
@@ -0,0 +1,6 @@
+// PR 99283 part 1 ICE on specialization
+// { dg-additional-options -fmodule-header }
+// { dg-module-cmi {} }
+
+template<typename _Facet>
+_Facet &use_facet ();
diff --git c/gcc/testsuite/g++.dg/modules/pr99283-1_b.H w/gcc/testsuite/g++.dg/modules/pr99283-1_b.H
new file mode 100644
index 00000000000..cd15a1b1e0c
--- /dev/null
+++ w/gcc/testsuite/g++.dg/modules/pr99283-1_b.H
@@ -0,0 +1,10 @@
+// { dg-additional-options -fmodule-header }
+// { dg-module-cmi {} }
+
+import "pr99283-1_a.H";
+
+template<typename _Facet>
+_Facet &use_facet ();
+
+extern template
+char &use_facet<char> ();
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2021-03-23 19:28 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-23 19:28 c++: Note duplicates in symbol table [PR 99283] Nathan Sidwell
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).