From bd71889b9017751e1a06970d20b28b9fe9479bdc Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Tue, 23 Mar 2021 12:23:30 -0700 Subject: 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. --- gcc/cp/name-lookup.c | 33 ++++++++++++++++++++++-------- gcc/testsuite/g++.dg/modules/pr99283-1_a.H | 6 ++++++ gcc/testsuite/g++.dg/modules/pr99283-1_b.H | 10 +++++++++ 3 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/g++.dg/modules/pr99283-1_a.H create mode 100644 gcc/testsuite/g++.dg/modules/pr99283-1_b.H (limited to 'gcc') diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index a6257f5..f4263f1 100644 --- a/gcc/cp/name-lookup.c +++ b/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 a/gcc/testsuite/g++.dg/modules/pr99283-1_a.H b/gcc/testsuite/g++.dg/modules/pr99283-1_a.H new file mode 100644 index 0000000..95c8c06 --- /dev/null +++ b/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 +_Facet &use_facet (); diff --git a/gcc/testsuite/g++.dg/modules/pr99283-1_b.H b/gcc/testsuite/g++.dg/modules/pr99283-1_b.H new file mode 100644 index 0000000..cd15a1b --- /dev/null +++ b/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 +_Facet &use_facet (); + +extern template +char &use_facet (); -- cgit v1.1