aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/pt.c
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2020-12-08 12:34:25 -0800
committerNathan Sidwell <nathan@acm.org>2020-12-08 12:38:04 -0800
commit570c312c03e151477505c8b70b25411e52751ff4 (patch)
tree1ef81534a0ef09c89cfe29dfcb6f55d873e3ded2 /gcc/cp/pt.c
parent4ed1dc1275bba89af92bfc7d97c21b376e4c29c3 (diff)
downloadgcc-570c312c03e151477505c8b70b25411e52751ff4.zip
gcc-570c312c03e151477505c8b70b25411e52751ff4.tar.gz
gcc-570c312c03e151477505c8b70b25411e52751ff4.tar.bz2
c++: Originating and instantiating module
With modules streamed entities have two new properties -- the module that declares them and the module that instantiates them. Here 'instantiate' applies to more than just templates -- for instance an implicit member fn. These may well be the same module. This adds the calls to places that need it. gcc/cp/ * class.c (layout_class_type): Call set_instantiating_module. (build_self_reference): Likewise. * decl.c (grokfndecl): Call set_originating_module. (grokvardecl): Likewise. (grokdeclarator): Likewise. * pt.c (maybe_new_partial_specialization): Call set_instantiating_module, propagate DECL_MODULE_EXPORT_P. (lookup_template_class_1): Likewise. (tsubst_function_decl): Likewise. (tsubst_decl, instantiate_template_1): Likewise. (build_template_decl): Propagate module flags. (tsubst_template_dcl): Likewise. (finish_concept_definition): Call set_originating_module. * module.cc (set_instantiating_module, set_originating_module): Stubs.
Diffstat (limited to 'gcc/cp/pt.c')
-rw-r--r--gcc/cp/pt.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 56d7b56..6b8e486 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -960,6 +960,9 @@ maybe_new_partial_specialization (tree type)
TREE_PRIVATE (d) = (current_access_specifier == access_private_node);
TREE_PROTECTED (d) = (current_access_specifier == access_protected_node);
+ set_instantiating_module (d);
+ DECL_MODULE_EXPORT_P (d) = DECL_MODULE_EXPORT_P (tmpl);
+
return t;
}
@@ -4922,6 +4925,17 @@ build_template_decl (tree decl, tree parms, bool member_template_p)
DECL_SOURCE_LOCATION (tmpl) = DECL_SOURCE_LOCATION (decl);
DECL_MEMBER_TEMPLATE_P (tmpl) = member_template_p;
+ if (modules_p ())
+ {
+ /* Propagate module information from the decl. */
+ DECL_MODULE_EXPORT_P (tmpl) = DECL_MODULE_EXPORT_P (decl);
+ if (DECL_LANG_SPECIFIC (decl))
+ {
+ DECL_MODULE_PURVIEW_P (tmpl) = DECL_MODULE_PURVIEW_P (decl);
+ gcc_checking_assert (!DECL_MODULE_IMPORT_P (decl));
+ }
+ }
+
return tmpl;
}
@@ -9994,6 +10008,12 @@ lookup_template_class_1 (tree d1, tree arglist, tree in_decl, tree context,
= DECL_SOURCE_LOCATION (TYPE_STUB_DECL (template_type));
}
+ set_instantiating_module (type_decl);
+ /* Although GEN_TMPL is the TEMPLATE_DECL, it has the same value
+ of export flag. We want to propagate this because it might
+ be a friend declaration that pushes a new hidden binding. */
+ DECL_MODULE_EXPORT_P (type_decl) = DECL_MODULE_EXPORT_P (gen_tmpl);
+
if (CLASS_TYPE_P (template_type))
{
TREE_PRIVATE (type_decl)
@@ -13912,6 +13932,7 @@ tsubst_function_decl (tree t, tree args, tsubst_flags_t complain,
if (!DECL_DELETED_FN (r))
DECL_INITIAL (r) = NULL_TREE;
DECL_CONTEXT (r) = ctx;
+ set_instantiating_module (r);
/* Handle explicit(dependent-expr). */
if (DECL_HAS_DEPENDENT_EXPLICIT_SPEC_P (t))
@@ -14235,6 +14256,24 @@ tsubst_template_decl (tree t, tree args, tsubst_flags_t complain,
TREE_TYPE (r) = TREE_TYPE (inner);
DECL_CONTEXT (r) = DECL_CONTEXT (inner);
+ if (modules_p ())
+ {
+ /* Propagate module information from the decl. */
+ DECL_MODULE_EXPORT_P (r) = DECL_MODULE_EXPORT_P (inner);
+ if (DECL_LANG_SPECIFIC (inner))
+ {
+ DECL_MODULE_PURVIEW_P (r) = DECL_MODULE_PURVIEW_P (inner);
+ /* If this is a constrained template, the above tsubst of
+ inner can find the unconstrained template, which may have
+ come from an import. This is ok, because we don't
+ register this instantiation (see below). */
+ gcc_checking_assert (!DECL_MODULE_IMPORT_P (inner)
+ || (TEMPLATE_PARMS_CONSTRAINTS
+ (DECL_TEMPLATE_PARMS (t))));
+ DECL_MODULE_IMPORT_P (r) = false;
+ }
+ }
+
DECL_TEMPLATE_INSTANTIATIONS (r) = NULL_TREE;
DECL_TEMPLATE_SPECIALIZATIONS (r) = NULL_TREE;
@@ -14789,6 +14828,8 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
SET_DECL_ASSEMBLER_NAME (r, NULL_TREE);
if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_DECL_WRTL))
SET_DECL_RTL (r, NULL);
+ set_instantiating_module (r);
+
/* The initializer must not be expanded until it is required;
see [temp.inst]. */
DECL_INITIAL (r) = NULL_TREE;
@@ -20951,6 +20992,8 @@ instantiate_template_1 (tree tmpl, tree orig_args, tsubst_flags_t complain)
DECL_TI_TEMPLATE (fndecl) = tmpl;
DECL_TI_ARGS (fndecl) = targ_ptr;
+ set_instantiating_module (fndecl);
+
/* Now we know the specialization, compute access previously
deferred. Do no access control for inheriting constructors,
as we already checked access for the inherited constructor. */
@@ -28037,6 +28080,8 @@ finish_concept_definition (cp_expr id, tree init)
DECL_CONTEXT (decl) = current_scope ();
DECL_INITIAL (decl) = init;
+ set_originating_module (decl, false);
+
/* Push the enclosing template. */
return push_template_decl (decl);
}