aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/module.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/cp/module.cc')
-rw-r--r--gcc/cp/module.cc47
1 files changed, 35 insertions, 12 deletions
diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
index f562bf8..f8fa7f1 100644
--- a/gcc/cp/module.cc
+++ b/gcc/cp/module.cc
@@ -8097,18 +8097,37 @@ trees_in::install_entity (tree decl)
gcc_checking_assert (!existed);
slot = ident;
}
- else if (state->is_partition ())
- {
- /* The decl is already in the entity map, but we see it again now from a
- partition: we want to overwrite if the original decl wasn't also from
- a (possibly different) partition. Otherwise, for things like template
- instantiations, make_dependency might not realise that this is also
- provided from a partition and should be considered part of this module
- (and thus always emitted into the primary interface's CMI). */
+ else
+ {
unsigned *slot = entity_map->get (DECL_UID (decl));
- module_state *imp = import_entity_module (*slot);
- if (!imp->is_partition ())
- *slot = ident;
+
+ /* The entity must be in the entity map already. However, DECL may
+ be the DECL_TEMPLATE_RESULT of an existing partial specialisation
+ if we matched it while streaming another instantiation; in this
+ case we already registered that TEMPLATE_DECL. */
+ if (!slot)
+ {
+ tree type = TREE_TYPE (decl);
+ gcc_checking_assert (TREE_CODE (decl) == TYPE_DECL
+ && CLASS_TYPE_P (type)
+ && CLASSTYPE_TEMPLATE_SPECIALIZATION (type));
+ slot = entity_map->get (DECL_UID (CLASSTYPE_TI_TEMPLATE (type)));
+ }
+ gcc_checking_assert (slot);
+
+ if (state->is_partition ())
+ {
+ /* The decl is already in the entity map, but we see it again now
+ from a partition: we want to overwrite if the original decl
+ wasn't also from a (possibly different) partition. Otherwise,
+ for things like template instantiations, make_dependency might
+ not realise that this is also provided from a partition and
+ should be considered part of this module (and thus always
+ emitted into the primary interface's CMI). */
+ module_state *imp = import_entity_module (*slot);
+ if (!imp->is_partition ())
+ *slot = ident;
+ }
}
return true;
@@ -12638,7 +12657,11 @@ trees_out::write_function_def (tree decl)
{
unsigned flags = 0;
- flags |= 1 * DECL_NOT_REALLY_EXTERN (decl);
+ /* Whether the importer should emit this definition, if used. */
+ flags |= 1 * (DECL_NOT_REALLY_EXTERN (decl)
+ && (get_importer_interface (decl)
+ != importer_interface::always_import));
+
if (f)
{
flags |= 2;