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