From: "Hal Finkel via cfe-dev" <cfe-dev@lists.llvm.org>
To: "Richard Smith" <richard@metafoo.co.uk>
Cc: "Clang Dev" <cfe-dev@lists.llvm.org>, "cfe-commits"
<cfe-commits@lists.llvm.org>
Sent: Wednesday, June 29, 2016 4:17:18 PM
Subject: Re: [cfe-dev] RFC: Default language standard mode policy
> From: "Richard Smith" <richard@metafoo.co.uk>
> To: "Hal Finkel" <hfinkel@anl.gov>
> Cc: "Clang Dev" <cfe-dev@lists.llvm.org>, "cfe-commits"
> <cfe-commits@lists.llvm.org>
> Sent: Wednesday, June 29, 2016 3:01:46 PM
> Subject: Re: [cfe-dev] RFC: Default language standard mode policy
> > > From: "Richard Smith via cfe-commits" <
> > > cfe-commits@lists.llvm.org
> > > >
> >
>
> > > To: "cfe-commits" < cfe-commits@lists.llvm.org >, "Clang Dev" <
> > > cfe-dev@lists.llvm.org >
> >
>
> > > Sent: Wednesday, June 29, 2016 2:09:37 PM
> >
>
> > > Subject: RFC: Default language standard mode policy
> >
>
> > > Hi all!
> >
>
> > > I'd like to establish a policy for Clang's default language
> > > standard
> > > (if none is specified with -std), as follows:
> >
>
> > > Clang defaults to the most recent published standard for the
> > > selected
> > > language that it fully implements.
> >
>
> > > The practical impact of this is that clang++ will default to
> > > C++14
> > > for C++ compilations (for version 3.9 onwards) and will default
> > > to
> > > C++17 once our implementation support is complete and the
> > > standard
> > > is published (whichever happens later).
> >
>
> > I think that we need to include libc++ in this criteria as well.
> > I
> > think we'll also need some CMake flags to adjust the default for
> > builds for systems on which this won't work.
>
> Right, it doesn't make sense to change our default in a way that
> breaks use of the same version of libc++, or a supported version of
> libstdc++ (and we should establish how old a version of libstdc++
> we
> support here).
> However, I don't immediately see that we need to wait for libc++ to
> be feature-complete before we enable the new standard in Clang. If
> that's what you're suggesting, can you expand on why? We already
> have the SD-6 feature test macros to test for implementation of
> specific features.
I think it is completely reasonable for an application to test
__cplusplus for both language and library features. There are plenty
of reasons why this won't always work on all systems, but I think we
should endeavor to make this possible. I think that the SD-6 macros
are useful is many circumstances, but I think it is unreasonable to
expect users to detect all of the features they're using separately
using SD-6 macros.
We can't control what libstdc++ and others do, but if we can't even
provide a complete implementation (including the library), I don't
think we should switch the default.
> > > I'd suggest that we apply the same policy for clang-cl, but if
> > > it's
> > > important that we enable a not-yet-fully-implemented standard
> > > for
> > > cl
> > > compatibility, that seems reasonable.
> >
>
> > > The question of whether the default mode for the GCC-compatible
> > > driver should be -std=gnuXXX or -std=cXXX is separate, but also
> > > likely worth discussing. Enabling GNU keywords by default is a
> > > very
> > > odd choice, and if we believe we can change our defaults
> > > without
> > > breaking the world then this seems like a good time to do so.
> >
>
> > Unfortunately, on many systems, some standard system headers
> > won't
> > even parse without GNU extensions enabled. I think we'll need to
> > leave the GNU extensions on by default (at least for parsing
> > system
> > headers).
>
> Can you give an example? -std=c++11 works fine on a broad range of
> systems. Note that this is not about GNU *extensions*, which are
> enabled in both modes; it's about GNU *keywords* (and a small
> number
> of non-conforming extensions) -- in particular, the 'typeof' GNU
> keyword, and support for the asm keyword in C and the inline
> keyword
> in C89 (without __decoration__).
I recall having problems with this with fenv.h on various systems.
They might just be older systems, however. We should check the
current state of the world.
A quick data point:
$ rpm -q --whatprovides /usr/include/aio.h
glibc-headers-2.12-1.166.el6_7.7.ppc64
$ clang -fsyntax-only -std=c11 -w /usr/include/aio.h
/usr/include/aio.h:42:19: error: field has incomplete type 'struct sigevent'
struct sigevent aio_sigevent; /* Signal number and value. */
^
/usr/include/aio.h:42:10: note: forward declaration of 'struct sigevent'
struct sigevent aio_sigevent; /* Signal number and value. */
^
1 error generated.
$ clang -fsyntax-only -std=gnu11 -w /usr/include/aio.h
(works)
$ rpm -q --whatprovides /usr/include/aio.h
glibc-headers-2.17-106.el7_2.4.x86_64
$ clang -fsyntax-only -std=c11 -w /usr/include/aio.h
(works)
$ clang -fsyntax-only -std=gnu11 -w /usr/include/aio.h
(works)
So I might have problems with a c11 default on my older systems, but hopefully not on the newer ones.
-Hal