c++: Note duplicates in symbol table [PR 99283]

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.
This commit is contained in:
Nathan Sidwell 2021-03-23 12:23:30 -07:00
parent b61461ac7f
commit bd71889b90
3 changed files with 40 additions and 9 deletions

View File

@ -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

View File

@ -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 ();

View File

@ -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> ();