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@lists.llvm.org> wrote: > On Tue, Oct 13, 2015 at 3:26 PM, Eric Fiselier <e...@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 <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 > >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits