> On Oct 13, 2015, at 7:43 PM, Richard Smith <rich...@metafoo.co.uk> wrote: > > On Tue, Oct 13, 2015 at 6:54 PM, Sean Silva <chisophu...@gmail.com > <mailto:chisophu...@gmail.com>> wrote: > On Tue, Oct 13, 2015 at 6:14 PM, Richard Smith <rich...@metafoo.co.uk > <mailto:rich...@metafoo.co.uk>> wrote: > On Tue, Oct 13, 2015 at 5:31 PM, Sean Silva <chisophu...@gmail.com > <mailto:chisophu...@gmail.com>> wrote: > On Tue, Oct 13, 2015 at 3:17 PM, Richard Smith via cfe-commits > <cfe-commits@lists.llvm.org <mailto: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 <mailto: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 > > <http://llvm.org/_build.ninja.release/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 > > <http://llvm.org/_build.ninja.release/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 > > <http://llvm.org/_build.ninja.release/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 > > <http://llvm.org/_build.ninja.release/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 > > <http://llvm.org/_build.ninja.release/include/c++/v1/algorithm:624>: > > In file included from > > /Users/buildslave/adrian/llvm.org/_build.ninja.release/bin/../include/c++/v1/initializer_list:47 > > <http://llvm.org/_build.ninja.release/include/c++/v1/initializer_list:47>: > > /Users/buildslave/adrian/llvm.org/_build.ninja.release/bin/../include/c++/v1/cstddef:39:10 > > <http://llvm.org/_build.ninja.release/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 > > <http://llvm.org/_build.ninja.release/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: > > That's an include of <cstddef>. We'd need to apply this workaround to that > header too (but I think the buck stops there).
After commenting out the cstddef module as well, the test case compiles again. Should I commit that and the type_traits change to libcxx, or are you working on a better fix? -- adrian > > 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? > > I was thinking: if we found the module map for a module in some include path, > then we should build that module with only the directories from the header > search path at or before that directory in the list of include dirs. That's > probably a fairly simple change. > > -- 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 <mailto: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 > > <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 > > > > <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 > > > > <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 > > > > <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 <mailto:cfe-commits@lists.llvm.org> > > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > > <http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits> > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org <mailto:cfe-commits@lists.llvm.org> > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > <http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits> > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org <mailto:cfe-commits@lists.llvm.org> > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > <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