{ "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 },
/* 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,
#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. */
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)
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)