Tested x86_64-pc-linux-gnu, will apply to trunk with the rest of this patch
series.

-- 8< --

Within the compiler, module keywords "import", "module", and "export" that
are recognized as part of module directives gain an extra trailing space to
distinguish them from other non-keyword uses of those words in the code.
But when dumping preprocessed output, printing those spaces creates a
gratuitous inconsistency with non-modules preprocessing, as revealed by
several of the g++.dg/modules/cpp* tests if modules are enabled by default
in C++20 mode.

libcpp/ChangeLog:

        * lex.cc (cpp_output_token): Omit terminal space from name.

gcc/testsuite/ChangeLog:

        * g++.dg/modules/cpp-2_c.C: Expect only one space after import.
        * g++.dg/modules/cpp-5_c.C
        * g++.dg/modules/dep-2.C
        * g++.dg/modules/dir-only-2_b.C
        * g++.dg/modules/pr99050_b.C
        * g++.dg/modules/inc-xlate-1_b.H
        * g++.dg/modules/legacy-3_b.H
        * g++.dg/modules/legacy-3_c.H: Likewise.
---
 gcc/testsuite/g++.dg/modules/cpp-2_c.C       |  2 +-
 gcc/testsuite/g++.dg/modules/cpp-5_c.C       |  2 +-
 gcc/testsuite/g++.dg/modules/dep-2.C         |  2 +-
 gcc/testsuite/g++.dg/modules/dir-only-2_b.C  | 10 +++++-----
 gcc/testsuite/g++.dg/modules/pr99050_b.C     |  2 +-
 libcpp/lex.cc                                |  7 +++++--
 gcc/testsuite/g++.dg/modules/inc-xlate-1_b.H |  2 +-
 gcc/testsuite/g++.dg/modules/legacy-3_b.H    |  2 +-
 gcc/testsuite/g++.dg/modules/legacy-3_c.H    |  2 +-
 9 files changed, 17 insertions(+), 14 deletions(-)

diff --git a/gcc/testsuite/g++.dg/modules/cpp-2_c.C 
b/gcc/testsuite/g++.dg/modules/cpp-2_c.C
index c6e02b7800a..2a79031eb34 100644
--- a/gcc/testsuite/g++.dg/modules/cpp-2_c.C
+++ b/gcc/testsuite/g++.dg/modules/cpp-2_c.C
@@ -11,7 +11,7 @@ import nope;
 #endif
 think
 
-// { dg-final { scan-file cpp-2_c.i {cpp-2_c.C"\n\n\n\nmodule  bob;\n#pragma 
GCC unused\nimport  "[^\n]*\./cpp-2_b.H" \[\[ CLOSE ]];\nimport  
"[^\n]*cpp-2_a.H" \[\[ ]];\n} } }
+// { dg-final { scan-file cpp-2_c.i {cpp-2_c.C"\n\n\n\nmodule bob;\n#pragma 
GCC unused\nimport "[^\n]*\./cpp-2_b.H" \[\[ CLOSE ]];\nimport 
"[^\n]*cpp-2_a.H" \[\[ ]];\n} } }
 // { dg-final { scan-file cpp-2_c.i "int i;" } }
 // { dg-final { scan-file-not cpp-2_c.i "import *nope;" } }
 // { dg-final { scan-file cpp-2_c.i "THIS IS STDIO\n" } }
diff --git a/gcc/testsuite/g++.dg/modules/cpp-5_c.C 
b/gcc/testsuite/g++.dg/modules/cpp-5_c.C
index e0a78a516ae..7f75a228cda 100644
--- a/gcc/testsuite/g++.dg/modules/cpp-5_c.C
+++ b/gcc/testsuite/g++.dg/modules/cpp-5_c.C
@@ -7,4 +7,4 @@ import "cpp-5_a.H";
 
 Q
 
-// { dg-final { scan-file cpp-5_c.i {\nimport  "[^\n]*cpp-5_a.H";\n\n0\n} } }
+// { dg-final { scan-file cpp-5_c.i {\nimport "[^\n]*cpp-5_a.H";\n\n0\n} } }
diff --git a/gcc/testsuite/g++.dg/modules/dep-2.C 
b/gcc/testsuite/g++.dg/modules/dep-2.C
index 2dccab3554d..3c869755785 100644
--- a/gcc/testsuite/g++.dg/modules/dep-2.C
+++ b/gcc/testsuite/g++.dg/modules/dep-2.C
@@ -9,4 +9,4 @@ module m:part;
 // { dg-final { scan-file dep-2.d {\ngcm.cache/m:part\.gcm:| dep-2\.o} } }
 // { dg-final { scan-file dep-2.d {\n\.PHONY: m:part\.c\+\+-module} } }
 
-// { dg-final { scan-file dep-2.i {\nmodule  m:part;\n} } }
+// { dg-final { scan-file dep-2.i {\nmodule m:part;\n} } }
diff --git a/gcc/testsuite/g++.dg/modules/dir-only-2_b.C 
b/gcc/testsuite/g++.dg/modules/dir-only-2_b.C
index 1009ae5b3a2..b1ef9b95e58 100644
--- a/gcc/testsuite/g++.dg/modules/dir-only-2_b.C
+++ b/gcc/testsuite/g++.dg/modules/dir-only-2_b.C
@@ -21,8 +21,8 @@ export module bob;
 
 export import q;
 
-// { dg-final { scan-file dir-only-2_b.i {// a comment\nmodule ;\nfrob} } }
-// { dg-final { scan-file dir-only-2_b.i {frob\nexport\nimport  foo;\nimport 
7;} } }
-// { dg-final { scan-file dir-only-2_b.i {import  
"[^\n]*/dir-only-2_a.H";\nimport  "[^\n]*/dir-only-2_a.H";\nX} } }
-// { dg-final { scan-file dir-only-2_b.i {export  module  bob;\n\nexport  
import  q;} } }
-// { dg-final { scan-file dir-only-2_b.i {import  sing;\n\n\n// comment} } }
+// { dg-final { scan-file dir-only-2_b.i {// a comment\nmodule;\nfrob} } }
+// { dg-final { scan-file dir-only-2_b.i {frob\nexport\nimport foo;\nimport 
7;} } }
+// { dg-final { scan-file dir-only-2_b.i {import 
"[^\n]*/dir-only-2_a.H";\nimport "[^\n]*/dir-only-2_a.H";\nX} } }
+// { dg-final { scan-file dir-only-2_b.i {export module bob;\n\nexport import 
q;} } }
+// { dg-final { scan-file dir-only-2_b.i {import sing;\n\n\n// comment} } }
diff --git a/gcc/testsuite/g++.dg/modules/pr99050_b.C 
b/gcc/testsuite/g++.dg/modules/pr99050_b.C
index 439e216eb16..f2c95631321 100644
--- a/gcc/testsuite/g++.dg/modules/pr99050_b.C
+++ b/gcc/testsuite/g++.dg/modules/pr99050_b.C
@@ -4,4 +4,4 @@
 
 int main () {}
 
-// { dg-final { scan-file pr99050_b.i {import  "[^\n]*99050_a.H" 
\[\[__translated\]\];\n} }  }
+// { dg-final { scan-file pr99050_b.i {import "[^\n]*99050_a.H" 
\[\[__translated\]\];\n} }  }
diff --git a/libcpp/lex.cc b/libcpp/lex.cc
index 4025e5cd3d9..57c339a753a 100644
--- a/libcpp/lex.cc
+++ b/libcpp/lex.cc
@@ -4444,14 +4444,17 @@ cpp_output_token (const cpp_token *token, FILE *fp)
       {
        size_t i;
        const unsigned char * name = NODE_NAME (token->val.node.node);
-       
-       for (i = 0; i < NODE_LEN (token->val.node.node); i++)
+       unsigned len = NODE_LEN (token->val.node.node);
+
+       for (i = 0; i < len; i++)
          if (name[i] & ~0x7F)
            {
              unsigned char buffer[10];
              i += utf8_to_ucn (buffer, name + i) - 1;
              fwrite (buffer, 1, 10, fp);
            }
+         else if (name[i] == ' ' && i == len - 1)
+           /* Omit terminal space in "export ".  */;
          else
            fputc (NODE_NAME (token->val.node.node)[i], fp);
       }
diff --git a/gcc/testsuite/g++.dg/modules/inc-xlate-1_b.H 
b/gcc/testsuite/g++.dg/modules/inc-xlate-1_b.H
index 50b27efa7ef..872ebf3de98 100644
--- a/gcc/testsuite/g++.dg/modules/inc-xlate-1_b.H
+++ b/gcc/testsuite/g++.dg/modules/inc-xlate-1_b.H
@@ -18,4 +18,4 @@ extern "C" {
 #endif
 #endif
 
-// { dg-final { scan-file inc-xlate-1_b.i {import  "[^\n]*inc-xlate-1_a.H" 
\[\[__translated\]\];\n} } }
+// { dg-final { scan-file inc-xlate-1_b.i {import "[^\n]*inc-xlate-1_a.H" 
\[\[__translated\]\];\n} } }
diff --git a/gcc/testsuite/g++.dg/modules/legacy-3_b.H 
b/gcc/testsuite/g++.dg/modules/legacy-3_b.H
index 145bfbbddd1..52eecd72c68 100644
--- a/gcc/testsuite/g++.dg/modules/legacy-3_b.H
+++ b/gcc/testsuite/g++.dg/modules/legacy-3_b.H
@@ -16,5 +16,5 @@ int move (int X = __LINE__); // Capture __LINE__ in a 
non-definition
 // this should not be diverted
 #include "legacy-3.h"
 
-// { dg-final { scan-file legacy-3_b.i {\n# 13 "[^\n]*legacy-3_b.H"\nimport  
"[^\n]*legacy-3_a.H" \[\[__translated\]\];\nint move \(int X = 14\);\n} } }
+// { dg-final { scan-file legacy-3_b.i {\n# 13 "[^\n]*legacy-3_b.H"\nimport 
"[^\n]*legacy-3_a.H" \[\[__translated\]\];\nint move \(int X = 14\);\n} } }
 
diff --git a/gcc/testsuite/g++.dg/modules/legacy-3_c.H 
b/gcc/testsuite/g++.dg/modules/legacy-3_c.H
index 56b81722997..63c9bcf7078 100644
--- a/gcc/testsuite/g++.dg/modules/legacy-3_c.H
+++ b/gcc/testsuite/g++.dg/modules/legacy-3_c.H
@@ -17,7 +17,7 @@ MARK3 __LINE__
 // this should not be translated
 #include "legacy-3.h"
 
-// { dg-final { scan-file legacy-3_c.i {MARK1 8\nimport  "[^\n]*legacy-3_a.H" 
\[\[__translated\]\];\nMARK2 10\n} } }
+// { dg-final { scan-file legacy-3_c.i {MARK1 8\nimport "[^\n]*legacy-3_a.H" 
\[\[__translated\]\];\nMARK2 10\n} } }
 // We should have stopped.
 // { dg-final { scan-file legacy-3_c.i {move} } }
 // { dg-final { scan-file legacy-3_c.i {MARK2 13\n\nMARK3 15\n} } }
-- 
2.46.2

Reply via email to