<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Jun 15, 2015, at 12:03 PM, Richard Smith <<a href="mailto:richard@metafoo.co.uk" class="">richard@metafoo.co.uk</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div class="gmail_extra"><div class="gmail_quote">On Mon, Feb 2, 2015 at 1:56 PM, Ben Langmuir <span dir="ltr" class=""><<a href="mailto:blangmuir@apple.com" target="_blank" class="">blangmuir@apple.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: benlangmuir<br class="">
Date: Mon Feb  2 15:56:15 2015<br class="">
New Revision: 227868<br class="">
<br class="">
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D227868-26view-3Drev&d=AwMCAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=eiwTDZ6aPEOwuwsQjuuAiW08KMRfMwd4BdIbhhtQSeI&s=y1rXvverM9y07-t98qn6F5pHfrnHTAtgRb9j_Z84dj8&e=" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project?rev=227868&view=rev</a><br class="">
Log:<br class="">
Add cc1 option '-fmodule-feature' to add custom values for 'requires' decls<br class="">
<br class="">
This allows clang-based tools to specify custom features that can be<br class="">
tested by the 'requires' declaration in a module map file.<br class=""></blockquote><div class=""><br class=""></div><div class="">Hi Ben,</div><div class=""><br class=""></div><div class="">It looks like this isn't getting added to the module hash, nor even checked when we pull a module out of the cache.</div></div></div></div></div></blockquote><div><br class=""></div><div>Ack, thanks.  Fixed in r240433.</div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class="gmail_extra"><div class="gmail_quote"><div class=""> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Modified:<br class="">
    cfe/trunk/include/clang/Basic/LangOptions.h<br class="">
    cfe/trunk/include/clang/Driver/CC1Options.td<br class="">
    cfe/trunk/lib/Basic/Module.cpp<br class="">
    cfe/trunk/lib/Frontend/CompilerInvocation.cpp<br class="">
    cfe/trunk/test/Modules/Inputs/DependsOnModule.framework/module.map<br class="">
    cfe/trunk/test/Modules/requires.m<br class="">
<br class="">
Modified: cfe/trunk/include/clang/Basic/LangOptions.h<br class="">
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_include_clang_Basic_LangOptions.h-3Frev-3D227868-26r1-3D227867-26r2-3D227868-26view-3Ddiff&d=AwMCAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=eiwTDZ6aPEOwuwsQjuuAiW08KMRfMwd4BdIbhhtQSeI&s=nv2DPlO3XKSJEPaDgLtM0FYPsEYviRTYEXH7Gc-5nM0&e=" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/LangOptions.h?rev=227868&r1=227867&r2=227868&view=diff</a><br class="">
==============================================================================<br class="">
--- cfe/trunk/include/clang/Basic/LangOptions.h (original)<br class="">
+++ cfe/trunk/include/clang/Basic/LangOptions.h Mon Feb  2 15:56:15 2015<br class="">
@@ -92,6 +92,10 @@ public:<br class="">
   /// treat this as the CurrentModule.<br class="">
   std::string ImplementationOfModule;<br class="">
<br class="">
+  /// \brief The names of any features to enable in module 'requires' decls<br class="">
+  /// in addition to the hard-coded list in Module.cpp and the target features.<br class="">
+  std::vector<std::string> ModuleFeatures;<br class="">
+<br class="">
   /// \brief Options for parsing comments.<br class="">
   CommentOptions CommentOpts;<br class="">
<br class="">
<br class="">
Modified: cfe/trunk/include/clang/Driver/CC1Options.td<br class="">
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_include_clang_Driver_CC1Options.td-3Frev-3D227868-26r1-3D227867-26r2-3D227868-26view-3Ddiff&d=AwMCAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=eiwTDZ6aPEOwuwsQjuuAiW08KMRfMwd4BdIbhhtQSeI&s=ZIH_C0v-c9Eqs7IaVvnnuaZql1fFbY9vUfcsp-KlheM&e=" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CC1Options.td?rev=227868&r1=227867&r2=227868&view=diff</a><br class="">
==============================================================================<br class="">
--- cfe/trunk/include/clang/Driver/CC1Options.td (original)<br class="">
+++ cfe/trunk/include/clang/Driver/CC1Options.td Mon Feb  2 15:56:15 2015<br class="">
@@ -342,6 +342,9 @@ def fmodule_implementation_of : Separate<br class="">
 def fmodule_map_file_home_is_cwd : Flag<["-"], "fmodule-map-file-home-is-cwd">,<br class="">
   HelpText<"Use the current working directory as the home directory of "<br class="">
            "module maps specified by -fmodule-map-file=<FILE>">;<br class="">
+def fmodule_feature : Separate<["-"], "fmodule-feature">,<br class="">
+  MetaVarName<"<feature>">,<br class="">
+  HelpText<"Enable <feature> in module map requires declarations">;<br class="">
<br class="">
 let Group = Action_Group in {<br class="">
<br class="">
<br class="">
Modified: cfe/trunk/lib/Basic/Module.cpp<br class="">
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_Basic_Module.cpp-3Frev-3D227868-26r1-3D227867-26r2-3D227868-26view-3Ddiff&d=AwMCAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=eiwTDZ6aPEOwuwsQjuuAiW08KMRfMwd4BdIbhhtQSeI&s=SPmLyDPV568vlxqSE6z4hmuxI6FzM1gikaez2HDJ6jw&e=" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Module.cpp?rev=227868&r1=227867&r2=227868&view=diff</a><br class="">
==============================================================================<br class="">
--- cfe/trunk/lib/Basic/Module.cpp (original)<br class="">
+++ cfe/trunk/lib/Basic/Module.cpp Mon Feb  2 15:56:15 2015<br class="">
@@ -58,16 +58,21 @@ Module::~Module() {<br class="">
 /// language options has the given feature.<br class="">
 static bool hasFeature(StringRef Feature, const LangOptions &LangOpts,<br class="">
                        const TargetInfo &Target) {<br class="">
-  return llvm::StringSwitch<bool>(Feature)<br class="">
-           .Case("altivec", LangOpts.AltiVec)<br class="">
-           .Case("blocks", LangOpts.Blocks)<br class="">
-           .Case("cplusplus", LangOpts.CPlusPlus)<br class="">
-           .Case("cplusplus11", LangOpts.CPlusPlus11)<br class="">
-           .Case("objc", LangOpts.ObjC1)<br class="">
-           .Case("objc_arc", LangOpts.ObjCAutoRefCount)<br class="">
-           .Case("opencl", LangOpts.OpenCL)<br class="">
-           .Case("tls", Target.isTLSSupported())<br class="">
-           .Default(Target.hasFeature(Feature));<br class="">
+  bool HasFeature = llvm::StringSwitch<bool>(Feature)<br class="">
+                        .Case("altivec", LangOpts.AltiVec)<br class="">
+                        .Case("blocks", LangOpts.Blocks)<br class="">
+                        .Case("cplusplus", LangOpts.CPlusPlus)<br class="">
+                        .Case("cplusplus11", LangOpts.CPlusPlus11)<br class="">
+                        .Case("objc", LangOpts.ObjC1)<br class="">
+                        .Case("objc_arc", LangOpts.ObjCAutoRefCount)<br class="">
+                        .Case("opencl", LangOpts.OpenCL)<br class="">
+                        .Case("tls", Target.isTLSSupported())<br class="">
+                        .Default(Target.hasFeature(Feature));<br class="">
+  if (!HasFeature)<br class="">
+    HasFeature = std::find(LangOpts.ModuleFeatures.begin(),<br class="">
+                           LangOpts.ModuleFeatures.end(),<br class="">
+                           Feature) != LangOpts.ModuleFeatures.end();<br class="">
+  return HasFeature;<br class="">
 }<br class="">
<br class="">
 bool Module::isAvailable(const LangOptions &LangOpts, const TargetInfo &Target,<br class="">
<br class="">
Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp<br class="">
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_Frontend_CompilerInvocation.cpp-3Frev-3D227868-26r1-3D227867-26r2-3D227868-26view-3Ddiff&d=AwMCAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=eiwTDZ6aPEOwuwsQjuuAiW08KMRfMwd4BdIbhhtQSeI&s=Yhf48LM1bTR1iXGiHmvucqEBY21KxHc-AzihBd6tRQM&e=" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=227868&r1=227867&r2=227868&view=diff</a><br class="">
==============================================================================<br class="">
--- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)<br class="">
+++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Mon Feb  2 15:56:15 2015<br class="">
@@ -1568,6 +1568,7 @@ static void ParseLangArgs(LangOptions &O<br class="">
   Opts.CurrentModule = Args.getLastArgValue(OPT_fmodule_name);<br class="">
   Opts.ImplementationOfModule =<br class="">
       Args.getLastArgValue(OPT_fmodule_implementation_of);<br class="">
+  Opts.ModuleFeatures = Args.getAllArgValues(OPT_fmodule_feature);<br class="">
   Opts.NativeHalfType = Opts.NativeHalfType;<br class="">
   Opts.HalfArgsAndReturns = Args.hasArg(OPT_fallow_half_arguments_and_returns);<br class="">
   Opts.GNUAsm = !Args.hasArg(OPT_fno_gnu_inline_asm);<br class="">
<br class="">
Modified: cfe/trunk/test/Modules/Inputs/DependsOnModule.framework/module.map<br class="">
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_test_Modules_Inputs_DependsOnModule.framework_module.map-3Frev-3D227868-26r1-3D227867-26r2-3D227868-26view-3Ddiff&d=AwMCAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=eiwTDZ6aPEOwuwsQjuuAiW08KMRfMwd4BdIbhhtQSeI&s=owlPrIulXBXt5La-_g8i6WyhMvVyEOSte1vVEOMzmHM&e=" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/DependsOnModule.framework/module.map?rev=227868&r1=227867&r2=227868&view=diff</a><br class="">
==============================================================================<br class="">
--- cfe/trunk/test/Modules/Inputs/DependsOnModule.framework/module.map (original)<br class="">
+++ cfe/trunk/test/Modules/Inputs/DependsOnModule.framework/module.map Mon Feb  2 15:56:15 2015<br class="">
@@ -16,6 +16,12 @@ framework module DependsOnModule {<br class="">
     requires !objc<br class="">
     header "not_objc.h"<br class="">
   }<br class="">
+  explicit module CustomReq1 {<br class="">
+    requires custom_req1<br class="">
+  }<br class="">
+  explicit module CustomReq2 {<br class="">
+    requires custom_req2<br class="">
+  }<br class="">
<br class="">
   explicit framework module SubFramework {<br class="">
     umbrella header "SubFramework.h"<br class="">
<br class="">
Modified: cfe/trunk/test/Modules/requires.m<br class="">
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_test_Modules_requires.m-3Frev-3D227868-26r1-3D227867-26r2-3D227868-26view-3Ddiff&d=AwMCAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=eiwTDZ6aPEOwuwsQjuuAiW08KMRfMwd4BdIbhhtQSeI&s=bH8iFZkHna5J5j8cz7j_BFewhaQnXlkMJcNu2OTcYh0&e=" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/requires.m?rev=227868&r1=227867&r2=227868&view=diff</a><br class="">
==============================================================================<br class="">
--- cfe/trunk/test/Modules/requires.m (original)<br class="">
+++ cfe/trunk/test/Modules/requires.m Mon Feb  2 15:56:15 2015<br class="">
@@ -1,6 +1,8 @@<br class="">
 // RUN: rm -rf %t<br class="">
-// RUN: %clang_cc1 -Wauto-import -fmodules-cache-path=%t -fmodules -F %S/Inputs %s -verify<br class="">
+// RUN: %clang_cc1 -Wauto-import -fmodules-cache-path=%t -fmodules -F %S/Inputs %s -verify -fmodule-feature custom_req1<br class="">
<br class="">
 @import DependsOnModule.CXX; // expected-error{{module 'DependsOnModule.CXX' requires feature 'cplusplus'}}<br class="">
 @import DependsOnModule.NotCXX;<br class="">
 @import DependsOnModule.NotObjC; // expected-error{{module 'DependsOnModule.NotObjC' is incompatible with feature 'objc'}}<br class="">
+@import DependsOnModule.CustomReq1; // OK<br class="">
+@import DependsOnModule.CustomReq2; // expected-error{{module 'DependsOnModule.CustomReq2' requires feature 'custom_req2'}}<br class="">
<br class="">
<br class="">
_______________________________________________<br class="">
cfe-commits mailing list<br class="">
<a href="mailto:cfe-commits@cs.uiuc.edu" class="">cfe-commits@cs.uiuc.edu</a><br class="">
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank" class="">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br class="">
</blockquote></div><br class=""></div></div>
</div></blockquote></div><br class=""></body></html>