diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc index 8db662c0267..70785493561 100644 --- a/gcc/cp/module.cc +++ b/gcc/cp/module.cc @@ -5806,10 +5806,8 @@ trees_out::lang_type_bools (tree t) 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); @@ -5877,9 +5875,8 @@ trees_in::lang_type_bools (tree t) 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); @@ -8246,6 +8243,23 @@ trees_in::decl_value () /* 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) @@ -12068,15 +12082,6 @@ trees_in::read_class_def (tree defn, tree maybe_template) 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 diff --git a/gcc/testsuite/g++.dg/modules/debug-2_a.C b/gcc/testsuite/g++.dg/modules/debug-2_a.C new file mode 100644 index 00000000000..eed0905542b --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/debug-2_a.C @@ -0,0 +1,9 @@ +// PR c++/112820 +// { dg-additional-options "-fmodules-ts -g" } +// { dg-module-cmi io } + +export module io; + +export struct error { + virtual const char* what() const noexcept; +}; diff --git a/gcc/testsuite/g++.dg/modules/debug-2_b.C b/gcc/testsuite/g++.dg/modules/debug-2_b.C new file mode 100644 index 00000000000..fc9afbc02e0 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/debug-2_b.C @@ -0,0 +1,8 @@ +// PR c++/112820 +// { dg-additional-options "-fmodules-ts -g" } + +module io; + +const char* error::what() const noexcept { + return "bla"; +} diff --git a/gcc/testsuite/g++.dg/modules/debug-2_c.C b/gcc/testsuite/g++.dg/modules/debug-2_c.C new file mode 100644 index 00000000000..37117f69dcd --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/debug-2_c.C @@ -0,0 +1,9 @@ +// PR c++/112820 +// { dg-module-do link } +// { dg-additional-options "-fmodules-ts -g" } + +import io; + +int main() { + error{}; +} diff --git a/gcc/testsuite/g++.dg/modules/debug-3_a.C b/gcc/testsuite/g++.dg/modules/debug-3_a.C new file mode 100644 index 00000000000..9e33d8260fd --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/debug-3_a.C @@ -0,0 +1,8 @@ +// PR c++/102607 +// { dg-additional-options "-fmodules-ts -g" } +// { dg-module-cmi mod } + +export module mod; +export struct B { + virtual ~B() = default; +}; diff --git a/gcc/testsuite/g++.dg/modules/debug-3_b.C b/gcc/testsuite/g++.dg/modules/debug-3_b.C new file mode 100644 index 00000000000..03c78b71b5d --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/debug-3_b.C @@ -0,0 +1,9 @@ +// PR c++/102607 +// { dg-module-do link } +// { dg-additional-options "-fmodules-ts -g" } + +import mod; +int main() { + struct D : B {}; + (void)D{}; +}