public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
From: Patrick Palka <ppalka@gcc.gnu.org>
To: gcc-cvs@gcc.gnu.org
Subject: [gcc r14-8963] c++/modules: ICEs with modular fmtlib
Date: Tue, 13 Feb 2024 19:27:11 +0000 (GMT)	[thread overview]
Message-ID: <20240213192711.8F35F3857C60@sourceware.org> (raw)

https://gcc.gnu.org/g:cb76d7e47693364861e63ea3bb274b1b5295a943

commit r14-8963-gcb76d7e47693364861e63ea3bb274b1b5295a943
Author: Patrick Palka <ppalka@redhat.com>
Date:   Tue Feb 13 14:26:40 2024 -0500

    c++/modules: ICEs with modular fmtlib
    
    Building modular fmtlib triggered two small modules bugs in C++23 and
    C++26 mode respectively (due to libstdc++ header differences).
    
    The first is that a TEMPLATE_DECL having DECL_LANG_SPECIFIC doesn't
    necessarily imply that its DECL_TEMPLATE_RESULT has DECL_LANG_SPECIFIC.
    So in add_specializations we need to use STRIP_TEMPLATE consistently;
    this is a follow-up to r12-7187-gdb84f382ae3dc2.
    
    The second is that get_originating_module_decl was ICEing on class-scope
    enumerators injected via using-enum.  I suppose we should handle them
    like a class-scope entity rather than a non-using-enum enumerator.
    
    gcc/cp/ChangeLog:
    
            * module.cc (depset::hash::add_specializations): Use
            STRIP_TEMPLATE consistently.
            (get_originating_module_decl): Handle class-scope CONST_DECL.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/modules/friend-6_a.C: New test.
            * g++.dg/modules/using-enum-3_a.C: New test.
            * g++.dg/modules/using-enum-3_b.C: New test.
    
    Reviewed-by: Jason Merill <jason@redhat.com>

Diff:
---
 gcc/cp/module.cc                              |  5 +++--
 gcc/testsuite/g++.dg/modules/friend-6_a.C     | 11 +++++++++++
 gcc/testsuite/g++.dg/modules/using-enum-3_a.C | 11 +++++++++++
 gcc/testsuite/g++.dg/modules/using-enum-3_b.C |  6 ++++++
 4 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
index 560d8f3b6142..34fafe7c9788 100644
--- a/gcc/cp/module.cc
+++ b/gcc/cp/module.cc
@@ -13256,7 +13256,7 @@ depset::hash::add_specializations (bool decl_p)
       if (use_tpl == 1)
 	/* Implicit instantiations only walked if we reach them.  */
 	needs_reaching = true;
-      else if (!DECL_LANG_SPECIFIC (spec)
+      else if (!DECL_LANG_SPECIFIC (STRIP_TEMPLATE (spec))
 	       || !DECL_MODULE_PURVIEW_P (STRIP_TEMPLATE (spec)))
 	/* Likewise, GMF explicit or partial specializations.  */
 	needs_reaching = true;
@@ -18716,7 +18716,8 @@ get_originating_module_decl (tree decl)
       && (TREE_CODE (DECL_CONTEXT (decl)) == ENUMERAL_TYPE))
     decl = TYPE_NAME (DECL_CONTEXT (decl));
   else if (TREE_CODE (decl) == FIELD_DECL
-	   || TREE_CODE (decl) == USING_DECL)
+	   || TREE_CODE (decl) == USING_DECL
+	   || CONST_DECL_USING_P (decl))
     {
       decl = DECL_CONTEXT (decl);
       if (TREE_CODE (decl) != FUNCTION_DECL)
diff --git a/gcc/testsuite/g++.dg/modules/friend-6_a.C b/gcc/testsuite/g++.dg/modules/friend-6_a.C
new file mode 100644
index 000000000000..7493e8f262fc
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/friend-6_a.C
@@ -0,0 +1,11 @@
+// { dg-additional-options "-fmodules-ts -Wno-pedantic" }
+// { dg-module-cmi friend_6 }
+
+module;
+# 1 "" 1
+template <typename> struct Trans_NS___cxx11_basic_string {
+  template <typename> friend class basic_stringbuf;
+};
+template struct Trans_NS___cxx11_basic_string<char>;
+# 6 "" 2
+export module friend_6;
diff --git a/gcc/testsuite/g++.dg/modules/using-enum-3_a.C b/gcc/testsuite/g++.dg/modules/using-enum-3_a.C
new file mode 100644
index 000000000000..10671eeaad44
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/using-enum-3_a.C
@@ -0,0 +1,11 @@
+// { dg-do compile { target c++20 } }
+// { dg-additional-options "-fmodules-ts" }
+// { dg-module-cmi using_enum_3 }
+
+export module using_enum_3;
+
+export
+struct text_encoding {
+  enum class id { CP50220 };
+  using enum id;
+};
diff --git a/gcc/testsuite/g++.dg/modules/using-enum-3_b.C b/gcc/testsuite/g++.dg/modules/using-enum-3_b.C
new file mode 100644
index 000000000000..8ac6e398ee75
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/using-enum-3_b.C
@@ -0,0 +1,6 @@
+// { dg-do compile { target c++20 } }
+// { dg-additional-options "-fmodules-ts" }
+
+import using_enum_3;
+
+static_assert(text_encoding::id::CP50220 == text_encoding::CP50220);

                 reply	other threads:[~2024-02-13 19:27 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240213192711.8F35F3857C60@sourceware.org \
    --to=ppalka@gcc.gnu.org \
    --cc=gcc-cvs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).