> On Oct 14, 2015, at 11:37 AM, Adrian Prantl via cfe-commits > <cfe-commits@lists.llvm.org> wrote: > >> >> On Oct 13, 2015, at 7:43 PM, Richard Smith <rich...@metafoo.co.uk >> <mailto: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?
To answer my previous question, removing the type_traits module allows us to finish all the cmake checks, but it then fails when building the LLVM_Utils module: While building module 'LLVM_Utils' imported from ../lib/Support/APFloat.cpp:15: In file included from <module-includes>:1: In file included from ../include/llvm/ADT/APFloat.h:20: In file included from ../include/llvm/ADT/APInt.h:19: In file included from ../include/llvm/ADT/ArrayRef.h:14: In file included from ../include/llvm/ADT/SmallVector.h:17: ../include/llvm/ADT/iterator_range.h:63:36: error: declaration of 'declval' must be imported from module 'Darwin.C.tgmath' before it is required iterator_range<decltype(begin(std::declval<T>()))> drop_begin(T &&t, int n) { ^ /Users/buildslave/adrian/llvm.org/_build.ninja.release/bin/../include/c++/v1/type_traits:700:1: note: previous declaration is here declval() _NOEXCEPT; ^ While building module 'LLVM_Utils' imported from ../lib/Support/APFloat.cpp:15: In file included from <module-includes>:1: In file included from ../include/llvm/ADT/APFloat.h:20: In file included from ../include/llvm/ADT/APInt.h:19: In file included from ../include/llvm/ADT/ArrayRef.h:14: In file included from ../include/llvm/ADT/SmallVector.h:20: In file included from ../include/llvm/Support/MathExtras.h:21: /Users/buildslave/adrian/llvm.org/_build.ninja.release/bin/../include/c++/v1/type_traits:220:8: error: redefinition of '__void_t' struct __void_t { typedef void type; }; ^ /Users/buildslave/adrian/llvm.org/_build.ninja.release/bin/../include/c++/v1/type_traits:220:8: note: previous definition is here struct __void_t { typedef void type; }; ^ If there is a way to prevent Clang from going into std when building Darwin, it looks like that’d be the way to go. -- 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 <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