Hi Bruno, > Le 19 mars 2019 à 07:07, Akim Demaille <a...@lrde.epita.fr> a écrit : > > Hi Bruno, > >> Le 18 mars 2019 à 22:03, Bruno Haible <br...@clisp.org> a écrit : >> >> Hi Akim, >> >>> Also, the relationship with noreturn.h is not completely clear for >>> me either. >> >> There are a couple of comment in noreturn.h lines 33..41. But I agree, >> some text in the documentation would be better. >> >>> Clang 7 pretends to be GCC 4.2 (__GNUC__ __GNUC_MINOR__). >> >>> For instance I see it already has the above fix for >>> GCC 4.7, but in a different way. >>> >>> /* Use ISO C++11 syntax when the compiler supports it. */ >>> # if (__cplusplus >= 201103 && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \ >>> || (_MSC_VER >= 1900) >>> # define _GL_NORETURN_FUNC [[noreturn]] >> >> Right, this snippet gets clang++ and MSVC++ support right. How about this >> patch? > > Yes, I agree this is the best option so far, thanks!
Well, it does not work with G++ in C++98 mode: _Noreturn is not supported there. This works with Bison's CI: commit b2a7dec46c0b702b5f7618994641e7381c8ff86f Author: Akim Demaille <akim.demai...@gmail.com> Date: Fri Mar 22 08:25:53 2019 +0100 _Noreturn: beware of C's _Noreturn in C++ pre C++11 * lib/_Noreturn.h, m4/gnulib-common.m4: Using C's _Noreturn in C++98 appears to be supported by Clang, but not by GCC nor ICC. diff --git a/ChangeLog b/ChangeLog index 62c522e65..b694c3512 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2019-03-22 Akim Demaille <a...@lrde.epita.fr> + + _Noreturn: beware of C's _Noreturn in C++ pre C++11. + * lib/_Noreturn.h, m4/gnulib-common.m4: Using C's _Noreturn in + C++98 appears to be supported by Clang, but not by GCC nor ICC. + 2019-03-19 Akim Demaille <a...@lrde.epita.fr> bitset: fix memory leaks diff --git a/lib/_Noreturn.h b/lib/_Noreturn.h index 1629cef39..7594e4b0c 100644 --- a/lib/_Noreturn.h +++ b/lib/_Noreturn.h @@ -3,8 +3,9 @@ && ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \ || (defined _MSC_VER && 1900 <= _MSC_VER))) # define _Noreturn [[noreturn]] -# elif (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \ - || 4 < __GNUC__ + (7 <= __GNUC_MINOR__)) +# elif ((!defined __cplusplus || defined __clang__) \ + && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \ + || 4 < __GNUC__ + (7 <= __GNUC_MINOR__))) /* _Noreturn works as-is. */ # elif 2 < __GNUC__ + (8 <= __GNUC_MINOR__) || 0x5110 <= __SUNPRO_C # define _Noreturn __attribute__ ((__noreturn__)) diff --git a/m4/gnulib-common.m4 b/m4/gnulib-common.m4 index 8ad963e35..57b94ed53 100644 --- a/m4/gnulib-common.m4 +++ b/m4/gnulib-common.m4 @@ -21,8 +21,9 @@ AC_DEFUN([gl_COMMON_BODY], [ && ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \ || (defined _MSC_VER && 1900 <= _MSC_VER))) # define _Noreturn [[noreturn]] -# elif (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \ - || 4 < __GNUC__ + (7 <= __GNUC_MINOR__)) +# elif ((!defined __cplusplus || defined __clang__) \ + && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \ + || 4 < __GNUC__ + (7 <= __GNUC_MINOR__))) /* _Noreturn works as-is. */ # elif 2 < __GNUC__ + (8 <= __GNUC_MINOR__) || 0x5110 <= __SUNPRO_C # define _Noreturn __attribute__ ((__noreturn__))