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 <rich...@metafoo.co.uk> wrote: > On Tue, Oct 13, 2015 at 2:12 PM, Eric Fiselier via cfe-commits < > cfe-commits@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 <rich...@metafoo.co.uk> >> wrote: >> >>> On Mon, Oct 12, 2015 at 9:41 AM, Steven Wu via cfe-commits < >>> cfe-commits@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@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@lists.llvm.org >>>> > 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 >>>> >>> >>> >> >> _______________________________________________ >> cfe-commits mailing list >> cfe-commits@lists.llvm.org >> 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