> On Oct 14, 2015, at 3:32 PM, Richard Smith <rich...@metafoo.co.uk> wrote: > > On Wed, Oct 14, 2015 at 2:03 PM, Adrian Prantl via cfe-commits > <cfe-commits@lists.llvm.org <mailto:cfe-commits@lists.llvm.org>> wrote: >> On Oct 14, 2015, at 11:37 AM, Adrian Prantl via cfe-commits >> <cfe-commits@lists.llvm.org <mailto: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: > <http://llvm.org/_build.ninja.release/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?
Doing that results in an entirely different set of errors: While building module 'LLVM_Utils' imported from ../lib/Support/APFloat.cpp:15: While building module 'std' imported from ../include/llvm/ADT/iterator_range.h:22: While building module 'Darwin' imported from /Users/buildslave/adrian/llvm.org/_build.ninja.release/bin/../include/c++/v1/cstddef:43: In file included from <module-includes>:2: In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/sys/cdefs.h:533: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/sys/_symbol_aliasing.h:29:3: error: "Never use <sys/_symbol_aliasing.h> directly. Use <sys/cdefs.h> instead." # error "Never use <sys/_symbol_aliasing.h> directly. Use <sys/cdefs.h> instead." ^ While building module 'LLVM_Utils' imported from ../lib/Support/APFloat.cpp:15: While building module 'std' imported from ../include/llvm/ADT/iterator_range.h:22: While building module 'Darwin' imported from /Users/buildslave/adrian/llvm.org/_build.ninja.release/bin/../include/c++/v1/cstddef:43: In file included from <module-includes>:2: In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/sys/cdefs.h:599: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/sys/_posix_availability.h:29:3: error: "Never use <sys/_posix_availability.h> directly. Use <sys/cdefs.h> instead." # error "Never use <sys/_posix_availability.h> directly. Use <sys/cdefs.h> instead." ^ While building module 'LLVM_Utils' imported from ../lib/Support/APFloat.cpp:15: While building module 'std' imported from ../include/llvm/ADT/iterator_range.h:22: While building module 'Darwin' imported from /Users/buildslave/adrian/llvm.org/_build.ninja.release/bin/../include/c++/v1/cstddef:43: In file included from <module-includes>:8: In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/copyfile.h:36: In file included from /Users/buildslave/adrian/llvm.org/_build.ninja.release/bin/../lib/clang/3.8.0/include/stdint.h:63: In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/stdint.h:53: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/sys/_types/_intptr_t.h:30:9: error: declaration of '__darwin_intptr_t' must be imported from module 'Darwin.machine._types' before it is required typedef __darwin_intptr_t intptr_t; ^ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/i386/_types.h:49:16: note: previous declaration is here typedef long __darwin_intptr_t; [...] ^ -- adrian > > 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/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/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. > > -- 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 <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