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

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Tue Jan 26 11:14:55 PST 2016


Eric, Marshall: has there been any progress here?

On Wed, Jan 20, 2016 at 10:29 AM, Hans Wennborg <hans at chromium.org> wrote:
> /sub
>
> On Wed, Jan 20, 2016 at 4:45 AM, Nico Weber via cfe-commits
> <cfe-commits at lists.llvm.org> wrote:
>> Eric, Marshall: another ping. This should be fixed on the 3.8 branch, so it
>> needs to be resolved soon.
>>
>> On Jan 5, 2016 5:25 PM, "Nico Weber" <thakis at chromium.org> wrote:
>>>
>>> On Wed, Dec 30, 2015 at 8:28 PM, Richard Smith <richard at metafoo.co.uk>
>>> wrote:
>>>>
>>>> On Wed, Dec 30, 2015 at 1:17 PM, Nico Weber <thakis at chromium.org> wrote:
>>>>>
>>>>> One problem with this patch: stdio.h can be used in .c files, and when
>>>>> building .c files with -gnu99 -pedantic,
>>>>
>>>>
>>>> Do you mean -std=gnu89?
>>>>
>>>>>
>>>>> 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?
>>>>
>>>>
>>>> I suppose so too. Your configuration is probably somewhat broken if
>>>> libc++'s headers are in your include path while building C code, but it
>>>> doesn't seem unreasonable to properly support that mode, and my changes were
>>>> already trying to do so.
>>>>
>>>> Eric, Marshall, what do you think about using only /*...*/-style comments
>>>> in these headers, to handle the case where libc++ is somehow in the include
>>>> path for a C89 compilation?
>>>
>>>
>>> Eric, Marshall: Ping ^
>>>
>>>>
>>>>
>>>>>
>>>>> 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
>>>>>>
>>>>>
>>>>
>>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>


More information about the cfe-commits mailing list