> On Oct 14, 2015, at 5:07 PM, Richard Smith <rich...@metafoo.co.uk> wrote:
> 
> On Wed, Oct 14, 2015 at 3:58 PM, Adrian Prantl via cfe-commits 
> <cfe-commits@lists.llvm.org <mailto:cfe-commits@lists.llvm.org>> wrote:
>> On Oct 14, 2015, at 3:32 PM, Richard Smith <rich...@metafoo.co.uk 
>> <mailto: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:
>  <http://llvm.org/_build.ninja.release/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:
>  <http://llvm.org/_build.ninja.release/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:
>  <http://llvm.org/_build.ninja.release/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:
>  <http://llvm.org/_build.ninja.release/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
> 
> Ack, there are non-modular headers in the Darwin module. =( I seem to recall 
> that they're not version-locked to your compiler, so we've got to support 
> them as-is?

The Darwin module is part of the SDK and as such is generally distributed 
together with the compiler but I need to investigate how easy/feasible it is to 
change them. Even if we can update them it may take quite some time.

> If we can't turn on local submodule visibility, then we need a module map for 
> libc++ that covers all of its headers. I'll look into pruning the include 
> path when building a module from an implicitly-loaded module map.

Let me know how I can help.

thanks,
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 <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

Reply via email to