[libcxx] r249738 - Split <ctype.h> out of <cctype>.

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Fri Oct 16 17:28:21 PDT 2015


On Fri, Oct 16, 2015 at 5:17 PM, Adrian Prantl via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> On Oct 16, 2015, at 5:13 PM, Richard Smith <richard at metafoo.co.uk> wrote:
>
> On Fri, Oct 16, 2015 at 4:48 PM, Adrian Prantl via cfe-commits <
> cfe-commits at lists.llvm.org> wrote:
>
>> On Oct 16, 2015, at 3:27 PM, Richard Smith <richard at metafoo.co.uk> wrote:
>>
>> On Thu, Oct 15, 2015 at 11:14 AM, Adrian Prantl <aprantl at apple.com>
>> wrote:
>>
>>>
>>> On Oct 14, 2015, at 5:07 PM, Richard Smith <richard at metafoo.co.uk>
>>> wrote:
>>>
>>> Ack, there are non-modular headers in the Darwin module. =( I seem to
>>> recall that they're not version-locked to your compiler, so we've got to
>>> support them as-is?
>>>
>>> If we can't turn on local submodule visibility, then we need a module
>>> map for libc++ that covers all of its headers. I'll look into pruning the
>>> include path when building a module from an implicitly-loaded module map.
>>>
>>>
>>> The attached patch implements this in the most hacky way; with it I can
>>> successfully compile the first few hundred files of LLVM.
>>>
>>
>> Slightly less hacky approach attached, does this also unstick you?
>> <no-undeclared-includes.diff>
>>
>>
>> Unfortunately, no. After looking at it in the debugger, I believe the
>> problem is that HeaderSearch looks
>> at RequestingModule->NoUndeclaredIncludes, but the RequestingModule is a
>> nullptr (while looking for cdefs.h included via assert.h, for example).
>>
>
> I see; can you try changing the call to getModuleForLocation at the start
> of Preprocessor::LookupFile to call getModuleContainingLocation instead?
> (That change will break decl/use checking, but that's not hard to fix.)
>
>
> This seems to break other things, but I do get a different result:
>
> In file included from <module-includes>:71:
> */Volumes/Data/llvm/_build.ninja.release/bin/../lib/clang/3.8.0/include/stddef.h:118:10:
> **fatal error: *
> *      '__stddef_max_align_t.h' file not found*
> #include "__stddef_max_align_t.h"
> *         ^*
> In file included from test.cpp:2:
> In file included from
> /Volumes/Data/llvm/_build.ninja.release/bin/../include/c++/v1/cassert:21:
> */Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/assert.h:42:10:
> **fatal error: *
> *      could not build module 'Darwin'*
> #include <sys/cdefs.h>
> * ~~~~~~~~^*
> 2 errors generated.
>

Ha, yes, it would break that :) We need an implicit dependency on clang's
_Builtin_stddef_max_align_t module to make that work. That's a pre-existing
bug; try adding the attached patch.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20151016/34822e6e/attachment.html>
-------------- next part --------------
Index: lib/Basic/Module.cpp
===================================================================
--- lib/Basic/Module.cpp	(revision 250139)
+++ lib/Basic/Module.cpp	(working copy)
@@ -32,7 +32,8 @@
       IsFramework(IsFramework), IsExplicit(IsExplicit), IsSystem(false),
       IsExternC(false), IsInferred(false), InferSubmodules(false),
       InferExplicitSubmodules(false), InferExportWildcard(false),
-      ConfigMacrosExhaustive(false), NameVisibility(Hidden) {
+      ConfigMacrosExhaustive(false), NoUndeclaredIncludes(false),
+      NameVisibility(Hidden) {
   if (Parent) {
     if (!Parent->isAvailable())
       IsAvailable = false;
@@ -40,6 +41,8 @@
       IsSystem = true;
     if (Parent->IsExternC)
       IsExternC = true;
+    if (Parent->NoUndeclaredIncludes)
+      NoUndeclaredIncludes = true;
     IsMissingRequirement = Parent->IsMissingRequirement;
     
     Parent->SubModuleIndex[Name] = Parent->SubModules.size();
@@ -178,6 +181,11 @@
   for (auto *Use : Top->DirectUses)
     if (Requested->isSubModuleOf(Use))
       return true;
+
+  // Anyone is allowed to use our builtin stddef.h and its accompanying module.
+  if (!Requested->Parent && Requested->Name == "_Builtin_stddef_max_align_t")
+    return true;
+
   return false;
 }
 


More information about the cfe-commits mailing list