Эх сурвалжийг харах

Enable coroutines under -std=c++2a.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@354736 91177308-0d34-0410-b5e6-96231b3b80d8
Richard Smith 6 жил өмнө
parent
commit
db44dfe30c

+ 1 - 1
include/clang/Basic/LangOptions.def

@@ -136,7 +136,7 @@ LANGOPT(Freestanding, 1, 0, "freestanding implementation")
 LANGOPT(NoBuiltin         , 1, 0, "disable builtin functions")
 LANGOPT(NoBuiltin         , 1, 0, "disable builtin functions")
 LANGOPT(NoMathBuiltin     , 1, 0, "disable math builtin functions")
 LANGOPT(NoMathBuiltin     , 1, 0, "disable math builtin functions")
 LANGOPT(GNUAsm            , 1, 1, "GNU-style inline assembly")
 LANGOPT(GNUAsm            , 1, 1, "GNU-style inline assembly")
-LANGOPT(CoroutinesTS      , 1, 0, "C++ coroutines TS")
+LANGOPT(Coroutines        , 1, 0, "C++20 coroutines")
 LANGOPT(DllExportInlines  , 1, 1, "dllexported classes dllexport inline methods")
 LANGOPT(DllExportInlines  , 1, 1, "dllexported classes dllexport inline methods")
 LANGOPT(RelaxedTemplateTemplateArgs, 1, 0, "C++17 relaxed matching of template template arguments")
 LANGOPT(RelaxedTemplateTemplateArgs, 1, 0, "C++17 relaxed matching of template template arguments")
 
 

+ 9 - 7
include/clang/Basic/TokenKinds.def

@@ -32,6 +32,9 @@
 #ifndef CONCEPTS_KEYWORD
 #ifndef CONCEPTS_KEYWORD
 #define CONCEPTS_KEYWORD(X) CXX2A_KEYWORD(X,KEYCONCEPTS)
 #define CONCEPTS_KEYWORD(X) CXX2A_KEYWORD(X,KEYCONCEPTS)
 #endif
 #endif
+#ifndef COROUTINES_KEYWORD
+#define COROUTINES_KEYWORD(X) CXX2A_KEYWORD(X,KEYCOROUTINES)
+#endif
 #ifndef MODULES_KEYWORD
 #ifndef MODULES_KEYWORD
 #define MODULES_KEYWORD(X) KEYWORD(X,KEYMODULES)
 #define MODULES_KEYWORD(X) KEYWORD(X,KEYMODULES)
 #endif
 #endif
@@ -254,8 +257,7 @@ PUNCTUATOR(caretcaret,            "^^")
 //   KEYZVECTOR - This is a keyword for the System z vector extensions,
 //   KEYZVECTOR - This is a keyword for the System z vector extensions,
 //                which are heavily based on AltiVec
 //                which are heavily based on AltiVec
 //   KEYBORLAND - This is a keyword if Borland extensions are enabled
 //   KEYBORLAND - This is a keyword if Borland extensions are enabled
-//   KEYCOROUTINES - This is a keyword if support for the C++ coroutines
-//                   TS is enabled
+//   KEYCOROUTINES - This is a keyword if support for C++ coroutines is enabled
 //   BOOLSUPPORT - This is a keyword if 'bool' is a built-in type
 //   BOOLSUPPORT - This is a keyword if 'bool' is a built-in type
 //   HALFSUPPORT - This is a keyword if 'half' is a built-in type
 //   HALFSUPPORT - This is a keyword if 'half' is a built-in type
 //   WCHARSUPPORT - This is a keyword if 'wchar_t' is a built-in type
 //   WCHARSUPPORT - This is a keyword if 'wchar_t' is a built-in type
@@ -371,17 +373,17 @@ CXX11_KEYWORD(thread_local          , 0)
 CONCEPTS_KEYWORD(concept)
 CONCEPTS_KEYWORD(concept)
 CONCEPTS_KEYWORD(requires)
 CONCEPTS_KEYWORD(requires)
 
 
-// C++ coroutines TS keywords
-KEYWORD(co_await                    , KEYCOROUTINES)
-KEYWORD(co_return                   , KEYCOROUTINES)
-KEYWORD(co_yield                    , KEYCOROUTINES)
+// C++2a / coroutines TS keywords
+COROUTINES_KEYWORD(co_await)
+COROUTINES_KEYWORD(co_return)
+COROUTINES_KEYWORD(co_yield)
 
 
 // C++ modules TS keywords
 // C++ modules TS keywords
 MODULES_KEYWORD(module)
 MODULES_KEYWORD(module)
 MODULES_KEYWORD(import)
 MODULES_KEYWORD(import)
 
 
 // C++ char8_t proposal
 // C++ char8_t proposal
-KEYWORD(char8_t                     , CHAR8SUPPORT)
+CXX2A_KEYWORD(char8_t               , CHAR8SUPPORT)
 
 
 // C11 Extension
 // C11 Extension
 KEYWORD(_Float16                    , KEYALL)
 KEYWORD(_Float16                    , KEYALL)

+ 1 - 1
lib/Basic/IdentifierTable.cpp

@@ -143,7 +143,7 @@ static KeywordStatus getKeywordStatus(const LangOptions &LangOpts,
   // in non-arc mode.
   // in non-arc mode.
   if (LangOpts.ObjC && (Flags & KEYOBJC)) return KS_Enabled;
   if (LangOpts.ObjC && (Flags & KEYOBJC)) return KS_Enabled;
   if (LangOpts.ConceptsTS && (Flags & KEYCONCEPTS)) return KS_Enabled;
   if (LangOpts.ConceptsTS && (Flags & KEYCONCEPTS)) return KS_Enabled;
-  if (LangOpts.CoroutinesTS && (Flags & KEYCOROUTINES)) return KS_Enabled;
+  if (LangOpts.Coroutines && (Flags & KEYCOROUTINES)) return KS_Enabled;
   if (LangOpts.ModulesTS && (Flags & KEYMODULES)) return KS_Enabled;
   if (LangOpts.ModulesTS && (Flags & KEYMODULES)) return KS_Enabled;
   if (LangOpts.CPlusPlus && (Flags & KEYALLCXX)) return KS_Future;
   if (LangOpts.CPlusPlus && (Flags & KEYALLCXX)) return KS_Future;
   return KS_Disabled;
   return KS_Disabled;

+ 1 - 1
lib/Basic/Module.cpp

@@ -108,7 +108,7 @@ static bool hasFeature(StringRef Feature, const LangOptions &LangOpts,
   bool HasFeature = llvm::StringSwitch<bool>(Feature)
   bool HasFeature = llvm::StringSwitch<bool>(Feature)
                         .Case("altivec", LangOpts.AltiVec)
                         .Case("altivec", LangOpts.AltiVec)
                         .Case("blocks", LangOpts.Blocks)
                         .Case("blocks", LangOpts.Blocks)
-                        .Case("coroutines", LangOpts.CoroutinesTS)
+                        .Case("coroutines", LangOpts.Coroutines)
                         .Case("cplusplus", LangOpts.CPlusPlus)
                         .Case("cplusplus", LangOpts.CPlusPlus)
                         .Case("cplusplus11", LangOpts.CPlusPlus11)
                         .Case("cplusplus11", LangOpts.CPlusPlus11)
                         .Case("cplusplus14", LangOpts.CPlusPlus14)
                         .Case("cplusplus14", LangOpts.CPlusPlus14)

+ 1 - 1
lib/CodeGen/BackendUtil.cpp

@@ -581,7 +581,7 @@ void EmitAssemblyHelper::CreatePasses(legacy::PassManager &MPM,
                            addObjCARCOptPass);
                            addObjCARCOptPass);
   }
   }
 
 
-  if (LangOpts.CoroutinesTS)
+  if (LangOpts.Coroutines)
     addCoroutinePassesToExtensionPoints(PMBuilder);
     addCoroutinePassesToExtensionPoints(PMBuilder);
 
 
   if (LangOpts.Sanitize.has(SanitizerKind::LocalBounds)) {
   if (LangOpts.Sanitize.has(SanitizerKind::LocalBounds)) {

+ 1 - 1
lib/Frontend/CompilerInvocation.cpp

@@ -2577,7 +2577,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,
   Opts.Blocks = Args.hasArg(OPT_fblocks) || (Opts.OpenCL
   Opts.Blocks = Args.hasArg(OPT_fblocks) || (Opts.OpenCL
     && Opts.OpenCLVersion == 200);
     && Opts.OpenCLVersion == 200);
   Opts.BlocksRuntimeOptional = Args.hasArg(OPT_fblocks_runtime_optional);
   Opts.BlocksRuntimeOptional = Args.hasArg(OPT_fblocks_runtime_optional);
-  Opts.CoroutinesTS = Args.hasArg(OPT_fcoroutines_ts);
+  Opts.Coroutines = Opts.CPlusPlus2a || Args.hasArg(OPT_fcoroutines_ts);
 
 
   // Enable [[]] attributes in C++11 by default.
   // Enable [[]] attributes in C++11 by default.
   Opts.DoubleSquareBracketAttributes =
   Opts.DoubleSquareBracketAttributes =

+ 1 - 1
lib/Frontend/InitPreprocessor.cpp

@@ -547,7 +547,7 @@ static void InitializeCPlusPlusFeatureTestMacros(const LangOptions &LangOpts,
   // TS features.
   // TS features.
   if (LangOpts.ConceptsTS)
   if (LangOpts.ConceptsTS)
     Builder.defineMacro("__cpp_experimental_concepts", "1L");
     Builder.defineMacro("__cpp_experimental_concepts", "1L");
-  if (LangOpts.CoroutinesTS)
+  if (LangOpts.Coroutines)
     Builder.defineMacro("__cpp_coroutines", "201703L");
     Builder.defineMacro("__cpp_coroutines", "201703L");
 }
 }
 
 

+ 1 - 1
lib/Sema/SemaDecl.cpp

@@ -13116,7 +13116,7 @@ Decl *Sema::ActOnFinishFunctionBody(Decl *dcl, Stmt *Body,
   sema::AnalysisBasedWarnings::Policy WP = AnalysisWarnings.getDefaultPolicy();
   sema::AnalysisBasedWarnings::Policy WP = AnalysisWarnings.getDefaultPolicy();
   sema::AnalysisBasedWarnings::Policy *ActivePolicy = nullptr;
   sema::AnalysisBasedWarnings::Policy *ActivePolicy = nullptr;
 
 
-  if (getLangOpts().CoroutinesTS && getCurFunction()->isCoroutine())
+  if (getLangOpts().Coroutines && getCurFunction()->isCoroutine())
     CheckCompletedCoroutineBody(FD, Body);
     CheckCompletedCoroutineBody(FD, Body);
 
 
   // Do not call PopExpressionEvaluationContext() if it is a lambda because one
   // Do not call PopExpressionEvaluationContext() if it is a lambda because one

+ 1 - 1
test/Lexer/cxx-features.cpp

@@ -271,6 +271,6 @@
 #error "wrong value for __cpp_experimental_concepts"
 #error "wrong value for __cpp_experimental_concepts"
 #endif
 #endif
 
 
-#if defined(COROUTINES) ? check(coroutines, 201703L, 201703L, 201703L, 201703L, 201703L) : check(coroutines, 0, 0, 0, 0, 0)
+#if defined(COROUTINES) ? check(coroutines, 201703L, 201703L, 201703L, 201703L, 201703L) : check(coroutines, 0, 0, 0, 0, 201703L)
 #error "wrong value for __cpp_coroutines"
 #error "wrong value for __cpp_coroutines"
 #endif
 #endif

+ 4 - 0
test/Lexer/cxx2a_keyword_as_cxx17.cpp

@@ -5,5 +5,9 @@ template<typename T>
 concept x = 0;
 concept x = 0;
 #undef concept
 #undef concept
 
 
+int co_await = 0; // expected-warning {{'co_await' is a keyword in C++2a}}
+int co_return = 0; // expected-warning {{'co_return' is a keyword in C++2a}}
+int co_yield = 0; // expected-warning {{'co_yield' is a keyword in C++2a}}
+int char8_t = 0; // expected-warning {{'char8_t' is a keyword in C++2a}}
 int concept = 0; // expected-warning {{'concept' is a keyword in C++2a}}
 int concept = 0; // expected-warning {{'concept' is a keyword in C++2a}}
 int requires = 0; // expected-warning {{'requires' is a keyword in C++2a}}
 int requires = 0; // expected-warning {{'requires' is a keyword in C++2a}}

+ 1 - 1
www/cxx_status.html

@@ -1060,7 +1060,7 @@ as the draft C++2a standard evolves.
     <tr>
     <tr>
       <td>Coroutines</td>
       <td>Coroutines</td>
       <td><a href="http://wg21.link/p0912r5">P0912R5</a></td>
       <td><a href="http://wg21.link/p0912r5">P0912R5</a></td>
-      <td class="partial" align="center">Partial (<tt>-fcoroutines-ts</tt>)</td>
+      <td class="partial" align="center">Partial</td>
     </tr>
     </tr>
 </table>
 </table>