mirror of https://github.com/microsoft/clang.git
[coroutines] Support "coroutines" feature in module map requires clause
Summary: In order for libc++ to add `<experimental/coroutine>` to its module map, there has to be a feature that can be used to detect if coroutines support is enabled in Clang. Reviewers: rsmith Reviewed By: rsmith Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D33538 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@304107 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1995be1cfd
commit
384ca6f633
|
@ -413,6 +413,9 @@ altivec
|
|||
blocks
|
||||
The "blocks" language feature is available.
|
||||
|
||||
coroutines
|
||||
Support for the coroutines TS is available.
|
||||
|
||||
cplusplus
|
||||
C++ support is available.
|
||||
|
||||
|
|
|
@ -64,6 +64,7 @@ static bool hasFeature(StringRef Feature, const LangOptions &LangOpts,
|
|||
bool HasFeature = llvm::StringSwitch<bool>(Feature)
|
||||
.Case("altivec", LangOpts.AltiVec)
|
||||
.Case("blocks", LangOpts.Blocks)
|
||||
.Case("coroutines", LangOpts.CoroutinesTS)
|
||||
.Case("cplusplus", LangOpts.CPlusPlus)
|
||||
.Case("cplusplus11", LangOpts.CPlusPlus11)
|
||||
.Case("freestanding", LangOpts.Freestanding)
|
||||
|
|
|
@ -27,6 +27,7 @@ int glob;
|
|||
// CHECK-DMOD-NEXT: [ppIncludedFile]: {{.*}}/Modules/Inputs/Module.framework{{[/\\]}}Headers{{[/\\]}}Module.h | name: "Module/Module.h" | hash loc: {{.*}}/Modules/Inputs/DependsOnModule.framework{{[/\\]}}Headers{{[/\\]}}DependsOnModule.h:1:1 | isImport: 0 | isAngled: 1 | isModule: 1 | module: Module
|
||||
// CHECK-DMOD-NEXT: [ppIncludedFile]: [[DMOD_OTHER_H:.*/Modules/Inputs/DependsOnModule\.framework[/\\]Headers[/\\]other\.h]] | {{.*}} | hash loc: <invalid> | {{.*}} | module: DependsOnModule
|
||||
// CHECK-DMOD-NEXT: [ppIncludedFile]: [[DMOD_NOT_CXX_H:.*/Modules/Inputs/DependsOnModule\.framework[/\\]Headers[/\\]not_cxx\.h]] | {{.*}} | hash loc: <invalid> | {{.*}} | module: DependsOnModule.NotCXX
|
||||
// CHECK-DMOD-NEXT: [ppIncludedFile]: [[DMOD_NOT_CORO_H:.*/Modules/Inputs/DependsOnModule\.framework[/\\]Headers[/\\]not_coroutines\.h]] | {{.*}} | hash loc: <invalid> | {{.*}} | module: DependsOnModule.NotCoroutines
|
||||
// CHECK-DMOD-NEXT: [ppIncludedFile]: [[DMOD_SUB_H:.*/Modules/Inputs/DependsOnModule\.framework[/\\]Frameworks[/\\]SubFramework\.framework[/\\]Headers[/\\]SubFramework\.h]] | {{.*}} | hash loc: <invalid> | {{.*}} | module: DependsOnModule.SubFramework
|
||||
// CHECK-DMOD-NEXT: [ppIncludedFile]: [[DMOD_SUB_OTHER_H:.*/Modules/Inputs/DependsOnModule.framework[/\\]Frameworks[/\\]SubFramework\.framework[/\\]Headers[/\\]Other\.h]] | name: "SubFramework/Other.h" | hash loc: [[DMOD_SUB_H]]:1:1 | isImport: 0 | isAngled: 0 | isModule: 0 | module: DependsOnModule.SubFramework.Other
|
||||
// CHECK-DMOD-NEXT: [ppIncludedFile]: [[DMOD_PRIVATE_H:.*/Modules/Inputs/DependsOnModule.framework[/\\]PrivateHeaders[/\\]DependsOnModulePrivate.h]] | {{.*}} | hash loc: <invalid> | {{.*}} | module: DependsOnModule.Private.DependsOnModule
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
#ifndef __cpp_coroutines
|
||||
#error coroutines must be enabled
|
||||
#endif
|
|
@ -0,0 +1,3 @@
|
|||
#ifdef __cpp_coroutines
|
||||
#error coroutines must NOT be enabled
|
||||
#endif
|
|
@ -22,7 +22,14 @@ framework module DependsOnModule {
|
|||
explicit module CustomReq2 {
|
||||
requires custom_req2
|
||||
}
|
||||
|
||||
explicit module Coroutines {
|
||||
requires coroutines
|
||||
header "coroutines.h"
|
||||
}
|
||||
explicit module NotCoroutines {
|
||||
requires !coroutines
|
||||
header "not_coroutines.h"
|
||||
}
|
||||
explicit framework module SubFramework {
|
||||
umbrella header "SubFramework.h"
|
||||
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
// RUN: rm -rf %t
|
||||
// RUN: %clang_cc1 -Wauto-import -fmodules-cache-path=%t -fmodules -fimplicit-module-maps -F %S/Inputs %s -verify
|
||||
// RUN: %clang_cc1 -Wauto-import -fmodules-cache-path=%t -fmodules -fimplicit-module-maps -F %S/Inputs %s -verify -fcoroutines-ts -DCOROUTINES
|
||||
|
||||
|
||||
#ifdef COROUTINES
|
||||
@import DependsOnModule.Coroutines;
|
||||
@import DependsOnModule.NotCoroutines; // expected-error {{module 'DependsOnModule.NotCoroutines' is incompatible with feature 'coroutines'}}
|
||||
#else
|
||||
@import DependsOnModule.NotCoroutines;
|
||||
@import DependsOnModule.Coroutines; // expected-error {{module 'DependsOnModule.Coroutines' requires feature 'coroutines'}}
|
||||
#endif
|
Loading…
Reference in New Issue