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

Sean Silva via cfe-commits cfe-commits at lists.llvm.org
Tue Oct 13 19:06:22 PDT 2015


(and assert.h probably isn't the best example, since it is textual)

On Tue, Oct 13, 2015 at 7:00 PM, Sean Silva <chisophugis at gmail.com> wrote:

>
>
> On Tue, Oct 13, 2015 at 6:54 PM, Sean Silva <chisophugis at gmail.com> wrote:
>
>>
>>
>> On Tue, Oct 13, 2015 at 6:14 PM, Richard Smith <richard at metafoo.co.uk>
>> wrote:
>>
>>> On Tue, Oct 13, 2015 at 5:31 PM, Sean Silva <chisophugis at gmail.com>
>>> wrote:
>>>
>>>> On Tue, Oct 13, 2015 at 3:17 PM, Richard Smith via cfe-commits <
>>>> cfe-commits at lists.llvm.org> wrote:
>>>>
>>>>> On Tue, Oct 13, 2015 at 2:10 PM, Adrian Prantl via cfe-commits <
>>>>> cfe-commits at lists.llvm.org> wrote:
>>>>>
>>>>>> Hi Richard,
>>>>>>
>>>>>> this commit appears to break the module self-host on Darwin.
>>>>>>
>>>>>> When compiling the following program generated by clang’s own cmake
>>>>>> script:
>>>>>>
>>>>>> > #undef NDEBUG
>>>>>> > #include <cassert>
>>>>>> > #define NDEBUG
>>>>>> > #include <cassert>
>>>>>> > int main() { assert(this code is not compiled); }
>>>>>>
>>>>>> with clang++ -std=c++11 -fmodules -fcxx-modules test.cpp
>>>>>>
>>>>>
>>>>> (You don't need -fcxx-modules here.)
>>>>>
>>>>>
>>>>>> I get
>>>>>>
>>>>>> > While building module 'std' imported from /Users/buildslave/adrian/
>>>>>> llvm.org/_build.ninja.release/bin/../include/c++/v1/cassert:20:
>>>>>> > While building module 'Darwin' imported from
>>>>>> /Users/buildslave/adrian/
>>>>>> llvm.org/_build.ninja.release/bin/../include/c++/v1/cstddef:39:
>>>>>> > In file included from <module-includes>:98:
>>>>>> > In file included from
>>>>>> /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/wchar.h:92:
>>>>>> > In file included from
>>>>>> /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/_wctype.h:57:
>>>>>
>>>>> > /Users/buildslave/adrian/
>>>>>> llvm.org/_build.ninja.release/bin/../include/c++/v1/ctype.h:33:10:
>>>>>> fatal error: cyclic dependency in module 'std': std -> Darwin -> std
>>>>>> > #include <__config>
>>>>>> >          ^
>>>>>> > While building module 'std' imported from /Users/buildslave/adrian/
>>>>>> llvm.org/_build.ninja.release/bin/../include/c++/v1/cassert:20:
>>>>>> > In file included from <module-includes>:1:
>>>>>> > In file included from /Users/buildslave/adrian/
>>>>>> llvm.org/_build.ninja.release/bin/../include/c++/v1/algorithm:624:
>>>>>> > In file included from /Users/buildslave/adrian/
>>>>>> llvm.org/_build.ninja.release/bin/../include/c++/v1/initializer_list:47
>>>>>> :
>>>>>> > /Users/buildslave/adrian/
>>>>>> llvm.org/_build.ninja.release/bin/../include/c++/v1/cstddef:39:10:
>>>>>> fatal error: could not build module 'Darwin'
>>>>>> > #include <stddef.h>
>>>>>> >  ~~~~~~~~^
>>>>>> > In file included from test.cpp:2:
>>>>>> > /Users/buildslave/adrian/
>>>>>> llvm.org/_build.ninja.release/bin/../include/c++/v1/cassert:20:10:
>>>>>> fatal error: could not build module 'std'
>>>>>> > #include <__config>
>>>>>> >  ~~~~~~~~^
>>>>>> > 3 errors generated.
>>>>>>
>>>>>> Let me know how I can help in diagnosing what’s going on here.
>>>>>>
>>>>>
>>>>> OK, I see what's wrong. Is this working any better for you in r250236?
>>>>>
>>>>
>>>> We're still seeing:
>>>>
>>>> While building module 'Darwin' imported from /usr/include/assert.h:42:
>>>> While building module 'std' imported from
>>>> /path/to/build_cmake/stage1/bin/../include/c++/v1/math.h:309:
>>>>
>>>
>>> Argh, this is including <type_traits>, which is in the std module. Can
>>> you try removing the header "type_traits" line from the libc++ module map
>>> and see if that helps?
>>>
>>
>> I've run into this issue in the past, and I don't think that will fix it
>> (see below). Just to be sure, here is the output with type_traits removed
>> from the module map::
>>
>> While building module 'Darwin' imported from /usr/include/assert.h:42:
>> While building module 'std' imported from
>> /path/to/build_cmake/stage1/bin/../include/c++/v1/type_traits:211:
>> In file included from <module-includes>:1:
>> In file included from
>> /path/to/build_cmake/stage1/bin/../include/c++/v1/algorithm:624:
>> In file included from
>> /path/to/build_cmake/stage1/bin/../include/c++/v1/initializer_list:47:
>> In file included from
>> /path/to/build_cmake/stage1/bin/../include/c++/v1/cstddef:43:
>> /path/to/build_cmake/stage1/bin/../include/c++/v1/stddef.h:46:15: fatal
>> error: cyclic dependency in module 'Darwin': Darwin -> std -> Darwin
>> #include_next <stddef.h>
>>               ^
>> While building module 'Darwin' imported from /usr/include/assert.h:42:
>> In file included from <module-includes>:80:
>> In file included from
>> /path/to/build_cmake/stage1/bin/../lib/clang/3.8.0/include/tgmath.h:29:
>> In file included from
>> /path/to/build_cmake/stage1/bin/../include/c++/v1/math.h:309:
>> /path/to/build_cmake/stage1/bin/../include/c++/v1/type_traits:211:10:
>> fatal error: could not build module 'std'
>> #include <cstddef>
>>  ~~~~~~~~^
>> In file included from modules.cpp:2:
>> In file included from
>> /path/to/build_cmake/stage1/bin/../include/c++/v1/cassert:21:
>> /usr/include/assert.h:42:10: fatal error: could not build module 'Darwin'
>> #include <sys/cdefs.h>
>>  ~~~~~~~~^
>> 3 errors generated.
>>
>>
>>
>>> What we really need here is a way to get the Darwin blah.h headers to
>>> only include each other, and not find the libc++ headers. Do you need
>>> something that works with new libc++ and old Clang, or would a Clang
>>> feature to prevent the Darwin module from finding the std module's headers
>>> work for you?
>>>
>>
>> I've run into this issue in the wild with the modularized PS4 SDK, so I
>> think that a clang feature that prevents this is the best fit. I think I
>> may have already mentioned this to you at one of the socials but just to
>> have it in writing here for everybody else, the root cause of the issue is
>> that `-Imylib` will cause mylib/assert.h to be selected for `#include
>> <assert.h>`, even when building the system module. Hence some random user
>> header will end up as being part of the system module and the seed for
>> problems has been planted.
>>
>> If the random user header then ends up including code from a module that
>> depends on the system module, then clang will go off and build this other
>> module, which itself (say) depends on the system module, which triggers the
>> recursive dependency error.
>>
>> There's nothing special about system headers for this issue, but due to
>> their position at the root of the dependency tree they seem to be the ones
>> affected in practice. The fundamental problem is that some random header
>> outside the module is interposing for the header listed in the module map.
>> I think the feature basically needs to be about making the module more
>> "hermetically sealed" in this scenario. Off the top of my head, maybe
>> something like putting the module map's directory at the front of the
>> search path for includes? That seems sort of hacky. Any ideas?
>>
>
>
> Just noticed that I had somehow overlooked the first sentence of your last
> paragraph. Apologies for the redundancy (although maybe the extra
> explanation will be helpful for onlookers).
>
> -- Sean Silva
>
>
>>
>> -- Sean Silva
>>
>>
>>
>>>
>>>
>>>> In file included from <module-includes>:1:
>>>> In file included from
>>>> /path/to/build_cmake/stage1/bin/../include/c++/v1/algorithm:624:
>>>> In file included from
>>>> /path/to/build_cmake/stage1/bin/../include/c++/v1/initializer_list:47:
>>>> In file included from
>>>> /path/to/build_cmake/stage1/bin/../include/c++/v1/cstddef:43:
>>>> /path/to/build_cmake/stage1/bin/../include/c++/v1/stddef.h:46:15: fatal
>>>> error: cyclic dependency in module 'Darwin': Darwin -> std -> Darwin
>>>> #include_next <stddef.h>
>>>>               ^
>>>> While building module 'Darwin' imported from /usr/include/assert.h:42:
>>>> In file included from <module-includes>:80:
>>>> In file included from
>>>> /path/to/build_cmake/stage1/bin/../lib/clang/3.8.0/include/tgmath.h:29:
>>>> /path/to/build_cmake/stage1/bin/../include/c++/v1/math.h:309:10: fatal
>>>> error: could not build module 'std'
>>>> #include <type_traits>
>>>>  ~~~~~~~~^
>>>> In file included from modules.cpp:2:
>>>> In file included from
>>>> /path/to/build_cmake/stage1/bin/../include/c++/v1/cassert:21:
>>>> /usr/include/assert.h:42:10: fatal error: could not build module
>>>> 'Darwin'
>>>> #include <sys/cdefs.h>
>>>>  ~~~~~~~~^
>>>> 3 errors generated.
>>>>
>>>>
>>>> Looks like the system headers are being interposed.
>>>>
>>>> -- Sean Silva
>>>>
>>>>
>>>>>
>>>>>
>>>>>> Once this works, I’d like to to set up a green dragon bot that builds
>>>>>> clang with LLVM_ENABLE_MODULES to catch similar problems earlier.
>>>>>>
>>>>>> -- adrian
>>>>>>
>>>>>> > On Oct 8, 2015, at 1:36 PM, Richard Smith via cfe-commits <
>>>>>> cfe-commits at lists.llvm.org> wrote:
>>>>>> >
>>>>>> > Author: rsmith
>>>>>> > Date: Thu Oct  8 15:36:30 2015
>>>>>> > New Revision: 249738
>>>>>> >
>>>>>> > URL: http://llvm.org/viewvc/llvm-project?rev=249738&view=rev
>>>>>> > Log:
>>>>>> > Split <ctype.h> out of <cctype>.
>>>>>> >
>>>>>> > Added:
>>>>>> >    libcxx/trunk/include/ctype.h
>>>>>> >      - copied, changed from r249736, libcxx/trunk/include/cctype
>>>>>> > Modified:
>>>>>> >    libcxx/trunk/include/cctype
>>>>>> >    libcxx/trunk/test/std/strings/c.strings/cctype.pass.cpp
>>>>>> >
>>>>>> > Modified: libcxx/trunk/include/cctype
>>>>>> > URL:
>>>>>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/cctype?rev=249738&r1=249737&r2=249738&view=diff
>>>>>> >
>>>>>> ==============================================================================
>>>>>> > --- libcxx/trunk/include/cctype (original)
>>>>>> > +++ libcxx/trunk/include/cctype Thu Oct  8 15:36:30 2015
>>>>>> > @@ -37,10 +37,6 @@ int toupper(int c);
>>>>>> >
>>>>>> > #include <__config>
>>>>>> > #include <ctype.h>
>>>>>> > -#if defined(_LIBCPP_MSVCRT)
>>>>>> > -#include "support/win32/support.h"
>>>>>> > -#include "support/win32/locale_win32.h"
>>>>>> > -#endif // _LIBCPP_MSVCRT
>>>>>> >
>>>>>> > #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
>>>>>> > #pragma GCC system_header
>>>>>> > @@ -48,33 +44,19 @@ int toupper(int c);
>>>>>> >
>>>>>> > _LIBCPP_BEGIN_NAMESPACE_STD
>>>>>> >
>>>>>> > -#undef isalnum
>>>>>> > using ::isalnum;
>>>>>> > -#undef isalpha
>>>>>> > using ::isalpha;
>>>>>> > -#undef isblank
>>>>>> > using ::isblank;
>>>>>> > -#undef iscntrl
>>>>>> > using ::iscntrl;
>>>>>> > -#undef isdigit
>>>>>> > using ::isdigit;
>>>>>> > -#undef isgraph
>>>>>> > using ::isgraph;
>>>>>> > -#undef islower
>>>>>> > using ::islower;
>>>>>> > -#undef isprint
>>>>>> > using ::isprint;
>>>>>> > -#undef ispunct
>>>>>> > using ::ispunct;
>>>>>> > -#undef isspace
>>>>>> > using ::isspace;
>>>>>> > -#undef isupper
>>>>>> > using ::isupper;
>>>>>> > -#undef isxdigit
>>>>>> > using ::isxdigit;
>>>>>> > -#undef tolower
>>>>>> > using ::tolower;
>>>>>> > -#undef toupper
>>>>>> > using ::toupper;
>>>>>> >
>>>>>> > _LIBCPP_END_NAMESPACE_STD
>>>>>> >
>>>>>> > Copied: libcxx/trunk/include/ctype.h (from r249736,
>>>>>> libcxx/trunk/include/cctype)
>>>>>> > URL:
>>>>>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/ctype.h?p2=libcxx/trunk/include/ctype.h&p1=libcxx/trunk/include/cctype&r1=249736&r2=249738&rev=249738&view=diff
>>>>>> >
>>>>>> ==============================================================================
>>>>>> > --- libcxx/trunk/include/cctype (original)
>>>>>> > +++ libcxx/trunk/include/ctype.h Thu Oct  8 15:36:30 2015
>>>>>> > @@ -1,5 +1,5 @@
>>>>>> > // -*- C++ -*-
>>>>>> > -//===---------------------------- cctype
>>>>>> ----------------------------------===//
>>>>>> > +//===---------------------------- ctype.h
>>>>>> ---------------------------------===//
>>>>>> > //
>>>>>> > //                     The LLVM Compiler Infrastructure
>>>>>> > //
>>>>>> > @@ -8,14 +8,11 @@
>>>>>> > //
>>>>>> >
>>>>>> //===----------------------------------------------------------------------===//
>>>>>> >
>>>>>> > -#ifndef _LIBCPP_CCTYPE
>>>>>> > -#define _LIBCPP_CCTYPE
>>>>>> > +#ifndef _LIBCPP_CTYPE_H
>>>>>> > +#define _LIBCPP_CTYPE_H
>>>>>> >
>>>>>> > /*
>>>>>> > -    cctype synopsis
>>>>>> > -
>>>>>> > -namespace std
>>>>>> > -{
>>>>>> > +    ctype.h synopsis
>>>>>> >
>>>>>> > int isalnum(int c);
>>>>>> > int isalpha(int c);
>>>>>> > @@ -31,52 +28,41 @@ int isupper(int c);
>>>>>> > int isxdigit(int c);
>>>>>> > int tolower(int c);
>>>>>> > int toupper(int c);
>>>>>> > -
>>>>>> > -}  // std
>>>>>> > */
>>>>>> >
>>>>>> > #include <__config>
>>>>>> > -#include <ctype.h>
>>>>>> > -#if defined(_LIBCPP_MSVCRT)
>>>>>> > -#include "support/win32/support.h"
>>>>>> > -#include "support/win32/locale_win32.h"
>>>>>> > -#endif // _LIBCPP_MSVCRT
>>>>>> > +#include_next <ctype.h>
>>>>>> >
>>>>>> > #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
>>>>>> > #pragma GCC system_header
>>>>>> > #endif
>>>>>> >
>>>>>> > -_LIBCPP_BEGIN_NAMESPACE_STD
>>>>>> > +#ifdef __cplusplus
>>>>>> > +
>>>>>> > +#if defined(_LIBCPP_MSVCRT)
>>>>>> > +// We support including .h headers inside 'extern "C"' contexts,
>>>>>> so switch
>>>>>> > +// back to C++ linkage before including these C++ headers.
>>>>>> > +extern "C++" {
>>>>>> > +  #include "support/win32/support.h"
>>>>>> > +  #include "support/win32/locale_win32.h"
>>>>>> > +}
>>>>>> > +#endif // _LIBCPP_MSVCRT
>>>>>> >
>>>>>> > #undef isalnum
>>>>>> > -using ::isalnum;
>>>>>> > #undef isalpha
>>>>>> > -using ::isalpha;
>>>>>> > #undef isblank
>>>>>> > -using ::isblank;
>>>>>> > #undef iscntrl
>>>>>> > -using ::iscntrl;
>>>>>> > #undef isdigit
>>>>>> > -using ::isdigit;
>>>>>> > #undef isgraph
>>>>>> > -using ::isgraph;
>>>>>> > #undef islower
>>>>>> > -using ::islower;
>>>>>> > #undef isprint
>>>>>> > -using ::isprint;
>>>>>> > #undef ispunct
>>>>>> > -using ::ispunct;
>>>>>> > #undef isspace
>>>>>> > -using ::isspace;
>>>>>> > #undef isupper
>>>>>> > -using ::isupper;
>>>>>> > #undef isxdigit
>>>>>> > -using ::isxdigit;
>>>>>> > #undef tolower
>>>>>> > -using ::tolower;
>>>>>> > #undef toupper
>>>>>> > -using ::toupper;
>>>>>> >
>>>>>> > -_LIBCPP_END_NAMESPACE_STD
>>>>>> > +#endif
>>>>>> >
>>>>>> > -#endif  // _LIBCPP_CCTYPE
>>>>>> > +#endif  // _LIBCPP_CTYPE_H
>>>>>> >
>>>>>> > Modified: libcxx/trunk/test/std/strings/c.strings/cctype.pass.cpp
>>>>>> > URL:
>>>>>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/strings/c.strings/cctype.pass.cpp?rev=249738&r1=249737&r2=249738&view=diff
>>>>>> >
>>>>>> ==============================================================================
>>>>>> > --- libcxx/trunk/test/std/strings/c.strings/cctype.pass.cpp
>>>>>> (original)
>>>>>> > +++ libcxx/trunk/test/std/strings/c.strings/cctype.pass.cpp Thu
>>>>>> Oct  8 15:36:30 2015
>>>>>> > @@ -86,18 +86,18 @@ int main()
>>>>>> >     static_assert((std::is_same<decltype(std::tolower(0)),
>>>>>> int>::value), "");
>>>>>> >     static_assert((std::is_same<decltype(std::toupper(0)),
>>>>>> int>::value), "");
>>>>>> >
>>>>>> > -    assert(isalnum('a'));
>>>>>> > -    assert(isalpha('a'));
>>>>>> > -    assert(isblank(' '));
>>>>>> > -    assert(!iscntrl(' '));
>>>>>> > -    assert(!isdigit('a'));
>>>>>> > -    assert(isgraph('a'));
>>>>>> > -    assert(islower('a'));
>>>>>> > -    assert(isprint('a'));
>>>>>> > -    assert(!ispunct('a'));
>>>>>> > -    assert(!isspace('a'));
>>>>>> > -    assert(!isupper('a'));
>>>>>> > -    assert(isxdigit('a'));
>>>>>> > -    assert(tolower('A') == 'a');
>>>>>> > -    assert(toupper('a') == 'A');
>>>>>> > +    assert(std::isalnum('a'));
>>>>>> > +    assert(std::isalpha('a'));
>>>>>> > +    assert(std::isblank(' '));
>>>>>> > +    assert(!std::iscntrl(' '));
>>>>>> > +    assert(!std::isdigit('a'));
>>>>>> > +    assert(std::isgraph('a'));
>>>>>> > +    assert(std::islower('a'));
>>>>>> > +    assert(std::isprint('a'));
>>>>>> > +    assert(!std::ispunct('a'));
>>>>>> > +    assert(!std::isspace('a'));
>>>>>> > +    assert(!std::isupper('a'));
>>>>>> > +    assert(std::isxdigit('a'));
>>>>>> > +    assert(std::tolower('A') == 'a');
>>>>>> > +    assert(std::toupper('a') == 'A');
>>>>>> > }
>>>>>> >
>>>>>> >
>>>>>> > _______________________________________________
>>>>>> > cfe-commits mailing list
>>>>>> > cfe-commits at lists.llvm.org
>>>>>> > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>>>>
>>>>>> _______________________________________________
>>>>>> cfe-commits mailing list
>>>>>> cfe-commits at lists.llvm.org
>>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>>>>
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> cfe-commits mailing list
>>>>> cfe-commits at lists.llvm.org
>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>>>
>>>>>
>>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20151013/47d65706/attachment-0001.html>


More information about the cfe-commits mailing list