WB ((lang->gets_delete >> 0) & 1);
WB ((lang->gets_delete >> 1) & 1);
- // Interfaceness is recalculated upon reading. May have to revisit?
- // How do dllexport and dllimport interact across a module?
- // lang->interface_only
- // lang->interface_unknown
+ WB (lang->interface_only);
+ WB (lang->interface_unknown);
WB (lang->contains_empty_class_p);
WB (lang->anon_aggr);
WB (lang->non_zero_init);
v = b () << 0;
v |= b () << 1;
lang->gets_delete = v;
- // lang->interface_only
- // lang->interface_unknown
- lang->interface_unknown = true; // Redetermine interface
+ RB (lang->interface_only);
+ RB (lang->interface_unknown);
RB (lang->contains_empty_class_p);
RB (lang->anon_aggr);
RB (lang->non_zero_init);
/* Set the TEMPLATE_DECL's type. */
TREE_TYPE (decl) = TREE_TYPE (inner);
+ /* Redetermine whether we need to import or export this declaration
+ for this TU. But for extern templates we know we must import:
+ they'll be defined in a different TU.
+ FIXME: How do dllexport and dllimport interact across a module?
+ See also https://github.com/itanium-cxx-abi/cxx-abi/issues/170.
+ May have to revisit? */
+ if (type
+ && CLASS_TYPE_P (type)
+ && TYPE_LANG_SPECIFIC (type)
+ && !(CLASSTYPE_EXPLICIT_INSTANTIATION (type)
+ && CLASSTYPE_INTERFACE_KNOWN (type)
+ && CLASSTYPE_INTERFACE_ONLY (type)))
+ {
+ CLASSTYPE_INTERFACE_ONLY (type) = false;
+ CLASSTYPE_INTERFACE_UNKNOWN (type) = true;
+ }
+
/* Add to specialization tables now that constraints etc are
added. */
if (mk == MK_partial)
bool installing = maybe_dup && !TYPE_SIZE (type);
if (installing)
{
- if (DECL_EXTERNAL (defn) && TYPE_LANG_SPECIFIC (type))
- {
- /* We don't deal with not-really-extern, because, for a
- module you want the import to be the interface, and for a
- header-unit, you're doing it wrong. */
- CLASSTYPE_INTERFACE_UNKNOWN (type) = false;
- CLASSTYPE_INTERFACE_ONLY (type) = true;
- }
-
if (maybe_dup != defn)
{
// FIXME: This is needed on other defns too, almost