On Tue, Oct 13, 2015 at 6:54 PM, Sean Silva <chisophu...@gmail.com> wrote:
> > > On Tue, Oct 13, 2015 at 6:14 PM, Richard Smith <rich...@metafoo.co.uk> > wrote: > >> On Tue, Oct 13, 2015 at 5:31 PM, Sean Silva <chisophu...@gmail.com> >> wrote: >> >>> On Tue, Oct 13, 2015 at 3:17 PM, Richard Smith via cfe-commits < >>> cfe-commits@lists.llvm.org> wrote: >>> >>>> On Tue, Oct 13, 2015 at 2:10 PM, Adrian Prantl via cfe-commits < >>>> cfe-commits@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@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@lists.llvm.org >>>>> > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >>>>> >>>>> _______________________________________________ >>>>> cfe-commits mailing list >>>>> cfe-commits@lists.llvm.org >>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >>>>> >>>> >>>> >>>> _______________________________________________ >>>> cfe-commits mailing list >>>> cfe-commits@lists.llvm.org >>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >>>> >>>> >>> >> >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits