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

Eric Fiselier via cfe-commits cfe-commits at lists.llvm.org
Tue Oct 13 15:26:31 PDT 2015


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.

/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/630745fb/attachment-0001.html>


More information about the cfe-commits mailing list