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

Nico Weber via cfe-commits cfe-commits at lists.llvm.org
Wed Dec 30 13:17:14 PST 2015


One problem with this patch: stdio.h can be used in .c files, and when
building .c files with -gnu99 -pedantic, clang will complain about //
comments. Not only does this stdio.h have // comments, it also pulls in
some libc++ headers (__config) that have // comments as well. I suppose all
the comments in header files pulled in by C headers need to become /* */
comments?

On Tue, Oct 13, 2015 at 7:34 PM, Richard Smith via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> 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
>>>>
>>>>
>>>
>>
>
> _______________________________________________
> 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/20151230/7531d468/attachment-0001.html>


More information about the cfe-commits mailing list