On Wed, Oct 14, 2015 at 3:32 PM, Richard Smith via cfe-commits < cfe-commits@lists.llvm.org> wrote:
> On Wed, Oct 14, 2015 at 2:03 PM, Adrian Prantl via cfe-commits < > cfe-commits@lists.llvm.org> wrote: > >> 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> wrote: >> >> 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 >>>>>>> <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: >> <http://llvm.org/_build.ninja.release/bin/../include/c++/v1/type_traits:700:1:> >> note: *previous declaration is here >> declval() _NOEXCEPT; >> *^* >> > > Can you try adding -fmodules-local-submodule-visibility to your CXXFLAGS? > > >> 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: >> <http://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: >> <http://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. >> > > There is no such way currently, but we could add one. The question is, is > it OK that newer versions of libc++ would only work with newer versions of > Clang if modules are enabled? I'm inclined to think this is fine, since > Clang's modules support is still advertised as being experimental, but if > (say) you or the Sony folks tell me you need new versions of libc++ to work > with some already-shipped Clang binary then we'll need to reconsider. > >From our side, we don't use libc++ right now, so changes in the libc++ tree don't affect PS4-targeting compiles. Right now our interest is self-hosting with modules enabled for e.g. build speedups. -- Sean Silva > > -- 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> 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 >> >> >> >> _______________________________________________ >> 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