> 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?
I'm NOT OK with this in general. These are C++ standard library headers that are written in C++. These headers should *tolerate* being compiled as C *system-headers*, but thats it. If your passing "-std=c89 -pedantic" then your asking the compiler to diagnose incompatibilities in *non-system-header* code. The assumption is that code that compiles cleanly should be portable to systems/compilers that only provide C89 compilation. However libc++'s C headers can never compile as pedantic C89 because they use "include_next". The reason you haven't seen a -Wgnu-include-next diagnostic is because libc++ headers manually turn on #pragma system_header near the top of the file. Unfortunately since the license header comments appear before the pragma they emit the "-Wcomment" diagnostics. Installed libc++ headers are only included during C++ compilation so C conformance is only an issue for projects that manually include a custom libc++.These projects can include these headers as either "user-headers" or "system-headers" by using "-I <path>" or "-isystem <path>" respectively (ignoring -cxx-isystem for now). "user-headers" should compile with the warning flags provided by the project, "system-headers" should not. Including libc++ as "user-code" while compiling pedantic C89 that's a bug because your project cannot actually compile with a C89 compiler. Emitting warnings/errors in this case seems correct and desired behavior. If the choice to treat lib++ as "user-code" was not a conscious one then it's even more important to diagnose it. If I had my way we would turn off "#pragma system_header" all together during C compilation and force the user to use -isystem. /Eric On Tue, Jan 26, 2016 at 12:14 PM, Hans Wennborg via cfe-commits < cfe-commits@lists.llvm.org> wrote: > Eric, Marshall: has there been any progress here? > > On Wed, Jan 20, 2016 at 10:29 AM, Hans Wennborg <h...@chromium.org> wrote: > > /sub > > > > On Wed, Jan 20, 2016 at 4:45 AM, Nico Weber via cfe-commits > > <cfe-commits@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" <tha...@chromium.org> wrote: > >>> > >>> On Wed, Dec 30, 2015 at 8:28 PM, Richard Smith <rich...@metafoo.co.uk> > >>> wrote: > >>>> > >>>> On Wed, Dec 30, 2015 at 1:17 PM, Nico Weber <tha...@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@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 > >> > _______________________________________________ > 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