C++ Module keywords
authorNathan Sidwell <nathan@acm.org>
Tue, 1 Dec 2020 19:44:34 +0000 (11:44 -0800)
committerNathan Sidwell <nathan@acm.org>
Tue, 1 Dec 2020 19:47:32 +0000 (11:47 -0800)
This adds the module keywords.  These are special internal tokens
generated by the preprocessor's module-control-line token peeking
logic.  Spelling them with a space means that they turn back into
regular tokens in preprocessor output (but do skew the column
numbering :()

gcc/c-family/
* c-common.c (module, import, export): New internal tokens (with
trailing space).
* c-common.h (RID__MODULE, RID__IMPORT & RID__EXPORT): Enumerate
them.
(D_CXX_MODULES, D_CXX_MODULES_FLAGS): Enable them.
* c-cppbuiltin.c (c_cpp_builtins): Feature macro.
gcc/cp/
* lex.c (init_reswords): Maybe enable module keywords.

gcc/c-family/c-common.c
gcc/c-family/c-common.h
gcc/c-family/c-cppbuiltin.c
gcc/cp/lex.c

index 5d1e4ef289c481267aaa857b8b8125d899eb10d6..cae883b530974aaf9a9951ce880c1a56272f13e8 100644 (file)
@@ -540,6 +540,12 @@ const struct c_common_resword c_common_reswords[] =
   { "concept",         RID_CONCEPT,    D_CXX_CONCEPTS_FLAGS | D_CXXWARN },
   { "requires",        RID_REQUIRES,   D_CXX_CONCEPTS_FLAGS | D_CXXWARN },
 
+  /* Modules-related keywords, these are internal unspellable tokens,
+     created by the preprocessor.  */
+  { "module ",         RID__MODULE,    D_CXX_MODULES_FLAGS | D_CXXWARN },
+  { "import ",         RID__IMPORT,    D_CXX_MODULES_FLAGS | D_CXXWARN },
+  { "export ",         RID__EXPORT,    D_CXX_MODULES_FLAGS | D_CXXWARN },
+
   /* Coroutines-related keywords */
   { "co_await",                RID_CO_AWAIT,   D_CXX_COROUTINES_FLAGS | D_CXXWARN },
   { "co_yield",                RID_CO_YIELD,   D_CXX_COROUTINES_FLAGS | D_CXXWARN },
index f413e8773f5e839bbc24c56c9c64d67c5a7122a6..8c17067e63c7ef23b2b227ad9c57fed13eee2744 100644 (file)
@@ -195,6 +195,9 @@ enum rid
   /* C++ concepts */
   RID_CONCEPT, RID_REQUIRES,
 
+  /* C++ modules.  */
+  RID__MODULE, RID__IMPORT, RID__EXPORT, /* Internal tokens.  */
+
   /* C++ coroutines */
   RID_CO_AWAIT, RID_CO_YIELD, RID_CO_RETURN,
 
@@ -449,9 +452,11 @@ extern machine_mode c_default_pointer_mode;
 #define D_CXX_CHAR8_T  0X1000  /* In C++, only with -fchar8_t.  */
 #define D_CXX20                0x2000  /* In C++, C++20 only.  */
 #define D_CXX_COROUTINES 0x4000  /* In C++, only with coroutines.  */
+#define D_CXX_MODULES  0x8000  /* In C++, only with modules.  */
 
 #define D_CXX_CONCEPTS_FLAGS D_CXXONLY | D_CXX_CONCEPTS
 #define D_CXX_CHAR8_T_FLAGS D_CXXONLY | D_CXX_CHAR8_T
+#define D_CXX_MODULES_FLAGS (D_CXXONLY | D_CXX_MODULES)
 #define D_CXX_COROUTINES_FLAGS (D_CXXONLY | D_CXX_COROUTINES)
 
 /* The reserved keyword table.  */
index d35b087bdcc4639c66c351a45b4307fb92d84955..41914f64874a21012513bfbc047e2f9d1bafe51c 100644 (file)
@@ -1025,6 +1025,10 @@ c_cpp_builtins (cpp_reader *pfile)
           else
             cpp_define (pfile, "__cpp_concepts=201507L");
         }
+      if (flag_modules)
+       /* The std-defined value is 201907L, but I don't think we can
+          claim victory yet.  201810 is the p1103 date. */
+       cpp_define (pfile, "__cpp_modules=201810L");
       if (flag_coroutines)
        cpp_define (pfile, "__cpp_impl_coroutine=201902L"); /* n4861, DIS */
       if (flag_tm)
index 8a69bc4f170d205232f1cfe0a46c68c0a6c71373..21e33d69c089fd5bb3c90d4ea50cc1da5bfb823a 100644 (file)
@@ -235,6 +235,8 @@ init_reswords (void)
     mask |= D_CXX_CONCEPTS;
   if (!flag_coroutines)
     mask |= D_CXX_COROUTINES;
+  if (!flag_modules)
+    mask |= D_CXX_MODULES;
   if (!flag_tm)
     mask |= D_TRANSMEM;
   if (!flag_char8_t)