public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-8974] c++: Fix error recovery when redeclaring enum in different module [PR99573]
@ 2024-02-14 11:06 Nathaniel Shead
  0 siblings, 0 replies; only message in thread
From: Nathaniel Shead @ 2024-02-14 11:06 UTC (permalink / raw)
  To: gcc-cvs

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

commit r14-8974-gbbb30f12a7e5ce008f59ec26c9e4cc65ee79fe56
Author: Nathaniel Shead <nathanieloshead@gmail.com>
Date:   Mon Feb 12 12:40:15 2024 +1100

    c++: Fix error recovery when redeclaring enum in different module [PR99573]
    
    This ensures that with modules enabled, redeclaring an enum in the wrong
    module or with the wrong underlying type no longer ICEs.
    
    The patch also rearranges the order of the checks a little because I
    think it's probably more important to note that you can't redeclare the
    enum all before complaining about mismatched underlying types etc.
    
    As a drive by this patch also adds some missing diagnostic groups, and
    rewords the module redeclaration error message to more closely match the
    wording used in other places this check is done.
    
            PR c++/99573
    
    gcc/cp/ChangeLog:
    
            * decl.cc (start_enum): Reorder check for redeclaring in module.
            Add missing auto_diagnostic_groups.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/modules/enum-12.C: New test.
    
    Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
    Reviewed-by: Jason Merrill <jason@redhat.com>

Diff:
---
 gcc/cp/decl.cc                         | 35 ++++++++++++++++++++--------------
 gcc/testsuite/g++.dg/modules/enum-12.C | 10 ++++++++++
 2 files changed, 31 insertions(+), 14 deletions(-)

diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc
index 3e41fd4fa313..d19d09adde43 100644
--- a/gcc/cp/decl.cc
+++ b/gcc/cp/decl.cc
@@ -16955,8 +16955,26 @@ start_enum (tree name, tree enumtype, tree underlying_type,
      to instantiation time is the comparison of underlying types.  */
   if (enumtype && TREE_CODE (enumtype) == ENUMERAL_TYPE)
     {
-      if (scoped_enum_p != SCOPED_ENUM_P (enumtype))
+      /* Attempt to set the declaring module.  */
+      if (modules_p ())
 	{
+	  tree decl = TYPE_NAME (enumtype);
+	  if (!module_may_redeclare (decl))
+	    {
+	      auto_diagnostic_group d;
+	      error ("cannot declare %qD in different module", decl);
+	      inform (DECL_SOURCE_LOCATION (decl), "previously declared here");
+	      enumtype = error_mark_node;
+	    }
+	  else
+	    set_instantiating_module (decl);
+	}
+
+      if (enumtype == error_mark_node)
+	;
+      else if (scoped_enum_p != SCOPED_ENUM_P (enumtype))
+	{
+	  auto_diagnostic_group d;
 	  error_at (input_location, "scoped/unscoped mismatch "
 		    "in enum %q#T", enumtype);
 	  inform (DECL_SOURCE_LOCATION (TYPE_MAIN_DECL (enumtype)),
@@ -16965,6 +16983,7 @@ start_enum (tree name, tree enumtype, tree underlying_type,
 	}
       else if (ENUM_FIXED_UNDERLYING_TYPE_P (enumtype) != !! underlying_type)
 	{
+	  auto_diagnostic_group d;
 	  error_at (input_location, "underlying type mismatch "
 		    "in enum %q#T", enumtype);
 	  inform (DECL_SOURCE_LOCATION (TYPE_MAIN_DECL (enumtype)),
@@ -16975,25 +16994,13 @@ start_enum (tree name, tree enumtype, tree underlying_type,
 	       && !same_type_p (underlying_type,
 				ENUM_UNDERLYING_TYPE (enumtype)))
 	{
+	  auto_diagnostic_group d;
 	  error_at (input_location, "different underlying type "
 		    "in enum %q#T", enumtype);
 	  inform (DECL_SOURCE_LOCATION (TYPE_MAIN_DECL (enumtype)),
 		  "previous definition here");
 	  underlying_type = NULL_TREE;
 	}
-
-      if (modules_p ())
-	{
-	  if (!module_may_redeclare (TYPE_NAME (enumtype)))
-	    {
-	      error ("cannot define %qD in different module",
-		     TYPE_NAME (enumtype));
-	      inform (DECL_SOURCE_LOCATION (TYPE_NAME (enumtype)),
-		      "declared here");
-	      enumtype = error_mark_node;
-	    }
-	  set_instantiating_module (TYPE_NAME (enumtype));
-	}
     }
 
   if (!enumtype || TREE_CODE (enumtype) != ENUMERAL_TYPE
diff --git a/gcc/testsuite/g++.dg/modules/enum-12.C b/gcc/testsuite/g++.dg/modules/enum-12.C
new file mode 100644
index 000000000000..57eeb85d92ad
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/enum-12.C
@@ -0,0 +1,10 @@
+// PR c++/99573
+// { dg-additional-options "-fmodules-ts" }
+// { dg-module-cmi !foo }
+
+export module foo;
+namespace std {
+  enum class align_val_t : decltype(sizeof(int)) {};  // { dg-error "different module" }
+}
+
+// { dg-prune-output "not writing module" }

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2024-02-14 11:06 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-02-14 11:06 [gcc r14-8974] c++: Fix error recovery when redeclaring enum in different module [PR99573] Nathaniel Shead

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).