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 5d1e4ef..cae883b 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 f413e87..8c17067 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 d35b087..41914f6 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 8a69bc4..21e33d6 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)