[libcxx] r249798 - Split <stdio.h> out of <cstdio>.

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Tue Oct 13 16:34:06 PDT 2015


On Tue, Oct 13, 2015 at 3:26 PM, Eric Fiselier <eric at efcs.ca> wrote:

> This change LGTM. Let's hold off on the using "_Static_assert" until we
> understand how that would work with "-pedantic" when the macro is expanded
> in user code.
>

Committed as r250247, thanks.


> /Eric
>
> On Tue, Oct 13, 2015 at 4:19 PM, Richard Smith <richard at metafoo.co.uk>
> wrote:
>
>> On Tue, Oct 13, 2015 at 2:12 PM, Eric Fiselier via cfe-commits <
>> cfe-commits at lists.llvm.org> wrote:
>>
>>> I would rather not do this if possible but I understand why we need to
>>> do it.
>>>
>>> Richard is there a cost associated with the 'extern "C++"' construct? or
>>> by forcing the compiler to switch modes in general?
>>>
>>
>> Not a significant one compared to the cost of the code wrapped in the
>> 'extern "C++"' here. (Also, this is wrapped in an #ifdef that only applies
>> in C++98; we could further reduce the set of cases when this happens by
>> using _Static_assert when available instead of this static_assert
>> emulation.)
>>
>>
>>> On Mon, Oct 12, 2015 at 12:27 PM, Richard Smith <richard at metafoo.co.uk>
>>> wrote:
>>>
>>>> On Mon, Oct 12, 2015 at 9:41 AM, Steven Wu via cfe-commits <
>>>> cfe-commits at lists.llvm.org> wrote:
>>>>
>>>>> Hi Richard
>>>>>
>>>>> Your splitting seems causing problem when using extern "C". Here is a
>>>>> test case:
>>>>>
>>>>> $ cat test.cpp
>>>>> #ifdef __cplusplus
>>>>> extern "C" {
>>>>> #endif
>>>>> #include <stdio.h>
>>>>> #ifdef __cplusplus
>>>>> }
>>>>> #endif
>>>>>
>>>>> Error:
>>>>> clang -fsyntax-only test.cpp
>>>>> In file included from test.cpp:4:
>>>>> In file included from /usr/bin/../include/c++/v1/stdio.h:102:
>>>>> /usr/bin/../include/c++/v1/__config:593:1: error:
>>>>>       templates must have C++ linkage
>>>>> template <bool> struct __static_assert_test;
>>>>> ^~~~~~~~~~~~~~~
>>>>> /usr/bin/../include/c++/v1/__config:594:20: error:
>>>>>       explicit specialization of non-template struct
>>>>> '__static_assert_test'
>>>>> template <> struct __static_assert_test<true> {};
>>>>>                    ^                   ~~~~~~
>>>>> /usr/bin/../include/c++/v1/__config:595:1: error:
>>>>>       templates must have C++ linkage
>>>>> template <unsigned> struct __static_assert_check {};
>>>>> ^~~~~~~~~~~~~~~~~~~
>>>>> 3 errors generated.
>>>>>
>>>>> Because the code is actually compiled in C++, the guard in the header
>>>>> failed to exclude the templates. In the meantime, I don't know if there are
>>>>> ways to detect the header is in extern "C".
>>>>>
>>>>
>>>> This was supposed to work, but apparently I only tested it when
>>>> compiling as C++11; the static_assert emulation in C++98 mode needs some
>>>> massaging to cope with this.
>>>>
>>>> Eric, Marshall: Are you OK with the attached patch? The idea is to make
>>>> <__config> be fine to include in extern "C" or extern "C++" modes (and
>>>> likewise for the <foo.h> headers). This is something that comes up pretty
>>>> often in practice (people wrap an include of a C header in 'extern "C"',
>>>> and that C header includes a <foo.h> file that libc++ provides).
>>>>
>>>>
>>>>> Steven
>>>>>
>>>>>
>>>>> > On Oct 8, 2015, at 6:29 PM, Richard Smith via cfe-commits <
>>>>> cfe-commits at lists.llvm.org> wrote:
>>>>> >
>>>>> > Author: rsmith
>>>>> > Date: Thu Oct  8 20:29:09 2015
>>>>> > New Revision: 249798
>>>>> >
>>>>> > URL: http://llvm.org/viewvc/llvm-project?rev=249798&view=rev
>>>>> > Log:
>>>>> > Split <stdio.h> out of <cstdio>.
>>>>> >
>>>>> > As with <stddef.h>, skip our custom header if __need_FILE or
>>>>> __need___FILE is defined.
>>>>> >
>>>>> > Added:
>>>>> >    libcxx/trunk/include/stdio.h
>>>>> >      - copied, changed from r249736, libcxx/trunk/include/cstdio
>>>>> > Modified:
>>>>> >    libcxx/trunk/include/cstdio
>>>>> >    libcxx/trunk/test/std/depr/depr.c.headers/stdio_h.pass.cpp
>>>>> >
>>>>> > Modified: libcxx/trunk/include/cstdio
>>>>> > URL:
>>>>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/cstdio?rev=249798&r1=249797&r2=249798&view=diff
>>>>> >
>>>>> ==============================================================================
>>>>> > --- libcxx/trunk/include/cstdio (original)
>>>>> > +++ libcxx/trunk/include/cstdio Thu Oct  8 20:29:09 2015
>>>>> > @@ -103,16 +103,6 @@ void perror(const char* s);
>>>>> > #pragma GCC system_header
>>>>> > #endif
>>>>> >
>>>>> > -// snprintf
>>>>> > -#if defined(_LIBCPP_MSVCRT)
>>>>> > -#include "support/win32/support.h"
>>>>> > -#endif
>>>>> > -
>>>>> > -#undef getc
>>>>> > -#undef putc
>>>>> > -#undef clearerr
>>>>> > -#undef feof
>>>>> > -#undef ferror
>>>>> > _LIBCPP_BEGIN_NAMESPACE_STD
>>>>> >
>>>>> > using ::FILE;
>>>>> >
>>>>> > Copied: libcxx/trunk/include/stdio.h (from r249736,
>>>>> libcxx/trunk/include/cstdio)
>>>>> > URL:
>>>>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/stdio.h?p2=libcxx/trunk/include/stdio.h&p1=libcxx/trunk/include/cstdio&r1=249736&r2=249798&rev=249798&view=diff
>>>>> >
>>>>> ==============================================================================
>>>>> > --- libcxx/trunk/include/cstdio (original)
>>>>> > +++ libcxx/trunk/include/stdio.h Thu Oct  8 20:29:09 2015
>>>>> > @@ -1,5 +1,5 @@
>>>>> > // -*- C++ -*-
>>>>> > -//===---------------------------- cstdio
>>>>> ----------------------------------===//
>>>>> > +//===---------------------------- stdio.h
>>>>> ---------------------------------===//
>>>>> > //
>>>>> > //                     The LLVM Compiler Infrastructure
>>>>> > //
>>>>> > @@ -8,11 +8,19 @@
>>>>> > //
>>>>> >
>>>>> //===----------------------------------------------------------------------===//
>>>>> >
>>>>> > -#ifndef _LIBCPP_CSTDIO
>>>>> > -#define _LIBCPP_CSTDIO
>>>>> > +#if defined(__need_FILE) || defined(__need___FILE)
>>>>> > +
>>>>> > +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
>>>>> > +#pragma GCC system_header
>>>>> > +#endif
>>>>> > +
>>>>> > +#include_next <stdio.h>
>>>>> > +
>>>>> > +#elif !defined(_LIBCPP_STDIO_H)
>>>>> > +#define _LIBCPP_STDIO_H
>>>>> >
>>>>> > /*
>>>>> > -    cstdio synopsis
>>>>> > +    stdio.h synopsis
>>>>> >
>>>>> > Macros:
>>>>> >
>>>>> > @@ -33,9 +41,6 @@ Macros:
>>>>> >     stdin
>>>>> >     stdout
>>>>> >
>>>>> > -namespace std
>>>>> > -{
>>>>> > -
>>>>> > Types:
>>>>> >
>>>>> > FILE
>>>>> > @@ -92,20 +97,23 @@ void clearerr(FILE* stream);
>>>>> > int feof(FILE* stream);
>>>>> > int ferror(FILE* stream);
>>>>> > void perror(const char* s);
>>>>> > -
>>>>> > -}  // std
>>>>> > */
>>>>> >
>>>>> > #include <__config>
>>>>> > -#include <stdio.h>
>>>>> >
>>>>> > #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
>>>>> > #pragma GCC system_header
>>>>> > #endif
>>>>> >
>>>>> > +#include_next <stdio.h>
>>>>> > +
>>>>> > +#ifdef __cplusplus
>>>>> > +
>>>>> > // snprintf
>>>>> > #if defined(_LIBCPP_MSVCRT)
>>>>> > +extern "C++" {
>>>>> > #include "support/win32/support.h"
>>>>> > +}
>>>>> > #endif
>>>>> >
>>>>> > #undef getc
>>>>> > @@ -113,72 +121,7 @@ void perror(const char* s);
>>>>> > #undef clearerr
>>>>> > #undef feof
>>>>> > #undef ferror
>>>>> > -_LIBCPP_BEGIN_NAMESPACE_STD
>>>>> > -
>>>>> > -using ::FILE;
>>>>> > -using ::fpos_t;
>>>>> > -using ::size_t;
>>>>> > -
>>>>> > -using ::fclose;
>>>>> > -using ::fflush;
>>>>> > -using ::setbuf;
>>>>> > -using ::setvbuf;
>>>>> > -using ::fprintf;
>>>>> > -using ::fscanf;
>>>>> > -using ::snprintf;
>>>>> > -using ::sprintf;
>>>>> > -using ::sscanf;
>>>>> > -#ifndef _LIBCPP_MSVCRT
>>>>> > -using ::vfprintf;
>>>>> > -using ::vfscanf;
>>>>> > -using ::vsscanf;
>>>>> > -#endif // _LIBCPP_MSVCRT
>>>>> > -using ::vsnprintf;
>>>>> > -using ::vsprintf;
>>>>> > -using ::fgetc;
>>>>> > -using ::fgets;
>>>>> > -using ::fputc;
>>>>> > -using ::fputs;
>>>>> > -using ::getc;
>>>>> > -using ::putc;
>>>>> > -using ::ungetc;
>>>>> > -using ::fread;
>>>>> > -using ::fwrite;
>>>>> > -using ::fgetpos;
>>>>> > -using ::fseek;
>>>>> > -using ::fsetpos;
>>>>> > -using ::ftell;
>>>>> > -using ::rewind;
>>>>> > -using ::clearerr;
>>>>> > -using ::feof;
>>>>> > -using ::ferror;
>>>>> > -using ::perror;
>>>>> > -
>>>>> > -#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
>>>>> > -using ::fopen;
>>>>> > -using ::freopen;
>>>>> > -using ::remove;
>>>>> > -using ::rename;
>>>>> > -using ::tmpfile;
>>>>> > -using ::tmpnam;
>>>>> > -#endif
>>>>> >
>>>>> > -#ifndef _LIBCPP_HAS_NO_STDIN
>>>>> > -using ::getchar;
>>>>> > -#if _LIBCPP_STD_VER <= 11
>>>>> > -using ::gets;
>>>>> > #endif
>>>>> > -using ::scanf;
>>>>> > -using ::vscanf;
>>>>> > -#endif
>>>>> > -
>>>>> > -#ifndef _LIBCPP_HAS_NO_STDOUT
>>>>> > -using ::printf;
>>>>> > -using ::putchar;
>>>>> > -using ::puts;
>>>>> > -using ::vprintf;
>>>>> > -#endif
>>>>> > -
>>>>> > -_LIBCPP_END_NAMESPACE_STD
>>>>> >
>>>>> > -#endif  // _LIBCPP_CSTDIO
>>>>> > +#endif  // _LIBCPP_STDIO_H
>>>>> >
>>>>> > Modified: libcxx/trunk/test/std/depr/depr.c.headers/stdio_h.pass.cpp
>>>>> > URL:
>>>>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/depr/depr.c.headers/stdio_h.pass.cpp?rev=249798&r1=249797&r2=249798&view=diff
>>>>> >
>>>>> ==============================================================================
>>>>> > --- libcxx/trunk/test/std/depr/depr.c.headers/stdio_h.pass.cpp
>>>>> (original)
>>>>> > +++ libcxx/trunk/test/std/depr/depr.c.headers/stdio_h.pass.cpp Thu
>>>>> Oct  8 20:29:09 2015
>>>>> > @@ -13,6 +13,26 @@
>>>>> > #include <type_traits>
>>>>> > #include "test_macros.h"
>>>>> >
>>>>> > +#ifdef getc
>>>>> > +#error getc is defined
>>>>> > +#endif
>>>>> > +
>>>>> > +#ifdef putc
>>>>> > +#error putc is defined
>>>>> > +#endif
>>>>> > +
>>>>> > +#ifdef clearerr
>>>>> > +#error clearerr is defined
>>>>> > +#endif
>>>>> > +
>>>>> > +#ifdef feof
>>>>> > +#error feof is defined
>>>>> > +#endif
>>>>> > +
>>>>> > +#ifdef ferror
>>>>> > +#error ferror is defined
>>>>> > +#endif
>>>>> > +
>>>>> > #ifndef BUFSIZ
>>>>> > #error BUFSIZ not defined
>>>>> > #endif
>>>>> >
>>>>> >
>>>>> > _______________________________________________
>>>>> > cfe-commits mailing list
>>>>> > cfe-commits at lists.llvm.org
>>>>> > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>>>
>>>>> _______________________________________________
>>>>> cfe-commits mailing list
>>>>> cfe-commits at lists.llvm.org
>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>>>
>>>>
>>>>
>>>
>>> _______________________________________________
>>> cfe-commits mailing list
>>> cfe-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20151013/1cb71d9c/attachment-0001.html>


More information about the cfe-commits mailing list