Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 25 Aug 2017 00:46:50 -0700
From:      Mark Millard <markmi@dsl-only.net>
To:        David Chisnall <theraven@FreeBSD.org>
Cc:        imp@FreeBSD.org, svn-src-head@freebsd.org, FreeBSD Current <freebsd-current@freebsd.org>, FreeBSD-STABLE Mailing List <freebsd-stable@freebsd.org>, freebsd-hackers <freebsd-hackers@freebsd.org>
Subject:   Re: svn commit: r322875 - head/sys/dev/nvme
Message-ID:  <E4AB54D2-9535-4345-BB1A-96CE9AADC2F8@dsl-only.net>
In-Reply-To: <DCD7947D-DA37-4255-A147-4B9E3B1631ED@FreeBSD.org>
References:  <1C5A448F-C91A-4599-8500-E4E46E6F5205@dsl-only.net> <DCD7947D-DA37-4255-A147-4B9E3B1631ED@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help

On 2017-Aug-25, at 12:14 AM, David Chisnall <theraven at FreeBSD.org> =
wrote:

> On 25 Aug 2017, at 07:32, Mark Millard <markmi at dsl-only.net> wrote:
>>=20
>> As I remember _Static_assert is from C11, not
>> the older C99.
>=20
> In pre-C11 dialects of C, _Static_assert is an identifier reserved for =
the implementation.  sys/cdefs.h defines it to generate a zero-length =
array if the condition is true or a negative-length array if it is =
false, emulating the behaviour (though giving less helpful error =
messages)
>=20
>>=20
>> As I understand head/sys/dev/nvme/nvme.h use by
>> C++ code could now reject attempts to use
>> _Static_assert .
>=20
> In C++, _Static_assert is an identifier reserved for the =
implementation, but in C++11 or newer static_assert is a keyword.  =
sys/cdefs.h defines _Static_assert to static_assert for newer versions =
of C++ and defines it to the C-before-11-compatible version for =
C++-before-11.
>=20
> TL;DR: We have gone to a lot of effort to ensure that these keywords =
work in all C/C++ dialects, please use them, please report bugs if you =
find a case where they don=E2=80=99t work.

It appears that at least 11.1-STABLE -r322807 does not handle
-std=3Dc++98 styles of use of _Static_assert for g++7 in that
g++7 reports an error:

# uname -apKU
FreeBSD hzFreeBSD11S 11.1-STABLE FreeBSD 11.1-STABLE  r322807  amd64 =
amd64 1101501 1101501

# more main.cc
#include "/usr/include/sys/cdefs.h"
_Static_assert(1,"Test");
int main(void)
{
   return 0;
}

# g++7 -std=3Dc++98 main.cc
main.cc:2:15: error: expected constructor, destructor, or type =
conversion before '(' token
 _Static_assert(1,"Test");
               ^

So it appears that as stands the _Static_assert
implementation requires a more modern C++ standard
vintage.


With the likes of -Wpedantic clang++ from 11.1-STABLE
-r322807 reports a warning:

# clang++ -Wpedantic -std=3Dc++11 main.cc
main.cc:2:1: warning: _Static_assert is a C11-specific feature =
[-Wc11-extensions]
_Static_assert(1,"Test");
^
1 warning generated.

# clang++ -Wpedantic -std=3Dc++98 main.cc
In file included from main.cc:1:
/usr/include/sys/cdefs.h:852:27: warning: variadic macros are a C99 =
feature [-Wvariadic-macros]
#define __locks_exclusive(...) \
                          ^
. . . (more such macro reports) . . .
main.cc:2:1: warning: _Static_assert is a C11-specific feature =
[-Wc11-extensions]
_Static_assert(1,"Test");
^
11 warnings generated.

By contrast "g++7 -Wpedantic -std=3Dc++11 main.cc" is silent about it.


=3D=3D=3D
Mark Millard
markmi at dsl-only.net




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?E4AB54D2-9535-4345-BB1A-96CE9AADC2F8>