c++: Poor diagnostic in header-unit [PR 99468]
authorNathan Sidwell <nathan@acm.org>
Mon, 8 Mar 2021 18:37:03 +0000 (10:37 -0800)
committerNathan Sidwell <nathan@acm.org>
Mon, 8 Mar 2021 18:40:09 +0000 (10:40 -0800)
We didn't specifically check for a module-decl inside a header unit.
That leads to a confusing diagostic.  Fixed thusly.

gcc/cp/
* lex.c (module_token_filter::resume): Ignore module-decls inside
header-unit.
* parser.c (cp_parser_module_declaration): Reject in header-unit.
gcc/testsuite/
* g++.dg/modules/pr99468.H: New.

gcc/cp/lex.c
gcc/cp/parser.c
gcc/testsuite/g++.dg/modules/pr99468.H [new file with mode: 0644]

index c83346b..73e14b8 100644 (file)
@@ -515,7 +515,7 @@ struct module_token_filter
          {
          module_end:;
            /* End of the directive, handle the name.  */
-           if (import)
+           if (import && (is_import || !flag_header_unit))
              if (module_state *m
                  = preprocess_module (import, token_loc, module != NULL,
                                       is_import, got_export, reader))
index 378e457..f636bb7 100644 (file)
@@ -13745,7 +13745,13 @@ cp_parser_module_declaration (cp_parser *parser, module_parse mp_state,
   parser->lexer->in_pragma = true;
   cp_token *token = cp_lexer_consume_token (parser->lexer);
 
-  if (mp_state == MP_FIRST && !exporting
+  if (flag_header_unit)
+    {
+      error_at (token->location,
+               "module-declaration not permitted in header-unit");
+      goto skip_eol;
+    }
+  else if (mp_state == MP_FIRST && !exporting
       && cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
     {
       /* Start global module fragment.  */
diff --git a/gcc/testsuite/g++.dg/modules/pr99468.H b/gcc/testsuite/g++.dg/modules/pr99468.H
new file mode 100644 (file)
index 0000000..b6be0c3
--- /dev/null
@@ -0,0 +1,7 @@
+// PR 99468, stupidly worded diagnostic
+// { dg-additional-options -fmodule-header }
+
+module M; // { dg-error "module-declaration not permitted" }
+
+int i;
+// { dg-prune-output "not writing" }