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:
parent
b61461ac7f
commit
bd71889b90
@ -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
|
||||
|
||||
6
gcc/testsuite/g++.dg/modules/pr99283-1_a.H
Normal file
6
gcc/testsuite/g++.dg/modules/pr99283-1_a.H
Normal 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 ();
|
||||
10
gcc/testsuite/g++.dg/modules/pr99283-1_b.H
Normal file
10
gcc/testsuite/g++.dg/modules/pr99283-1_b.H
Normal 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> ();
|
||||
Loading…
Reference in New Issue
Block a user