On 11/9/23 16:06, Nathaniel Shead wrote:
Bootstrapped and regtested on x86_64-pc-linux-gnu.
-- >8 --
A TEMPLATE_DECL does not have module attachment flags associated with
it, so this patch extracts the result from the template to read the
flags from there instead.
oh yeah. my original plan had it duplicated, but that didn't work out well.
You can use
tree decl = STRIP_TEMPLATE (new_fn);
btw. ok with that change
As a drive-by fix we also group the error with its informative note.
PR c++/106849
gcc/cp/ChangeLog:
* name-lookup.cc (do_nonmember_using_decl): Handle
TEMPLATE_DECLs when checking module attachment.
gcc/testsuite/ChangeLog:
* g++.dg/modules/using-9.C: New test.
Signed-off-by: Nathaniel Shead <nathanielosh...@gmail.com>
---
gcc/cp/name-lookup.cc | 14 ++++++++++----
gcc/testsuite/g++.dg/modules/using-9.C | 13 +++++++++++++
2 files changed, 23 insertions(+), 4 deletions(-)
create mode 100644 gcc/testsuite/g++.dg/modules/using-9.C
diff --git a/gcc/cp/name-lookup.cc b/gcc/cp/name-lookup.cc
index a8b9229b29e..512dc1be87f 100644
--- a/gcc/cp/name-lookup.cc
+++ b/gcc/cp/name-lookup.cc
@@ -4846,12 +4846,18 @@ do_nonmember_using_decl (name_lookup &lookup, bool
fn_scope_p,
bool exporting = revealing_p && module_exporting_p ();
if (exporting)
{
+ /* Module flags for templates are on the template_result. */
+ tree decl = new_fn;
+ if (TREE_CODE (decl) == TEMPLATE_DECL)
+ decl = DECL_TEMPLATE_RESULT (decl);
+
/* If the using decl is exported, the things it refers
- to must also be exported (or not habve module attachment). */
- if (!DECL_MODULE_EXPORT_P (new_fn)
- && (DECL_LANG_SPECIFIC (new_fn)
- && DECL_MODULE_ATTACH_P (new_fn)))
+ to must also be exported (or not have module attachment). */
+ if (!DECL_MODULE_EXPORT_P (decl)
+ && (DECL_LANG_SPECIFIC (decl)
+ && DECL_MODULE_ATTACH_P (decl)))
{
+ auto_diagnostic_group d;
error ("%q#D does not have external linkage", new_fn);
inform (DECL_SOURCE_LOCATION (new_fn),
"%q#D declared here", new_fn);
diff --git a/gcc/testsuite/g++.dg/modules/using-9.C
b/gcc/testsuite/g++.dg/modules/using-9.C
new file mode 100644
index 00000000000..4290280d897
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/using-9.C
@@ -0,0 +1,13 @@
+// PR c++/106849
+// { dg-additional-options "-fmodules-ts" }
+// { dg-module-cmi !lib }
+
+export module lib;
+
+namespace outer {
+ template<typename T> void any_of(T) { } // { dg-note "declared here" }
+}
+
+export using outer::any_of; // { dg-error "does not have external linkage" }
+
+// { dg-prune-output "not writing module" }
--
Nathan Sidwell