As I said in https://gcc.gnu.org/ml/libstdc++/2017-01/msg00109.html
the __GLIBCXX__ macro is useless, but is the closest thing we have to
a version macro for libstdc++. This matters when using libstdc++ with
Clang or Intel icc or other compilers, because you can't check the
__GNUC__ macro. I've seen several requests for a way to check the
libstdc++ version, or complaints that there is no way to do it.

This patch adds a new _GLIBCXX_RELEASE macro that contains the same
value as __GNUC__ i.e. the major release number.

- Yes, it only contains the major number. We could in theory have
 _GLIBCXX_MAJOR and _GLIBCXX_MINOR instead, but between
 _GLIBCXX_RELEASE and __GLIBCXX__ you can identify the release branch
 and a date within that branch.

- The name is "RELEASE" because we used to define _GLIBCXX_VERSION
 many years ago, but it was a string literal and this is an integer.
 To avoid problems for any old code checking for _GLIBCXX_VERSION I
 chose a different name.

Thoughts?


        PR libstdc++/78905
        * include/Makefile.am (_GLIBCXX_RELEASE): Set value.
        * include/Makefile.in: Regenerate.
        * include/bits/c++config (_GLIBCXX_RELEASE): Add #define.
        * testsuite/ext/profile/mutex_extensions_neg.cc: Use lineno of 0 in
        dg-error.

commit 6518efcc098f852310ef15e7cdb563d19803051a
Author: Jonathan Wakely <jwak...@redhat.com>
Date:   Tue Jan 17 15:45:55 2017 +0000

    PR78905 define _GLIBCXX_RELEASE macro
    
        PR libstdc++/78905
        * include/Makefile.am (_GLIBCXX_RELEASE): Set value.
        * include/Makefile.in: Regenerate.
        * include/bits/c++config (_GLIBCXX_RELEASE): Add #define.
        * testsuite/ext/profile/mutex_extensions_neg.cc: Use lineno of 0 in
        dg-error.

diff --git a/libstdc++-v3/include/Makefile.am b/libstdc++-v3/include/Makefile.am
index dfdceb3..3703bd1 100644
--- a/libstdc++-v3/include/Makefile.am
+++ b/libstdc++-v3/include/Makefile.am
@@ -1238,6 +1238,7 @@ ${host_builddir}/c++config.h: ${CONFIG_HEADER} \
                              stamp-cxx11-abi \
                              stamp-allocator-new
        @date=`cat ${toplevel_srcdir}/gcc/DATESTAMP` ;\
+       release=`sed 's/^\([0-9]*\).*$$/\1/' ${toplevel_srcdir}/gcc/BASE-VER` ;\
        ns_version=`cat stamp-namespace-version` ;\
        visibility=`cat stamp-visibility` ;\
        externtemplate=`cat stamp-extern-template` ;\
@@ -1249,6 +1250,7 @@ ${host_builddir}/c++config.h: ${CONFIG_HEADER} \
        ${CONFIG_HEADER} > /dev/null 2>&1 \
        && ldbl_compat='s,^#undef _GLIBCXX_LONG_DOUBLE_COMPAT$$,#define 
_GLIBCXX_LONG_DOUBLE_COMPAT 1,' ;\
        sed -e "s,define __GLIBCXX__,define __GLIBCXX__ $$date," \
+       -e "s,define _GLIBCXX_RELEASE,define _GLIBCXX_RELEASE $$release," \
        -e "s,define _GLIBCXX_INLINE_VERSION, define _GLIBCXX_INLINE_VERSION 
$$ns_version," \
        -e "s,define _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY, define 
_GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY $$visibility," \
        -e "s,define _GLIBCXX_EXTERN_TEMPLATE$$, define 
_GLIBCXX_EXTERN_TEMPLATE $$externtemplate," \
diff --git a/libstdc++-v3/include/bits/c++config 
b/libstdc++-v3/include/bits/c++config
index 0cc1865..691716b 100644
--- a/libstdc++-v3/include/bits/c++config
+++ b/libstdc++-v3/include/bits/c++config
@@ -30,9 +30,12 @@
 #ifndef _GLIBCXX_CXX_CONFIG_H
 #define _GLIBCXX_CXX_CONFIG_H 1
 
-// The current version of the C++ library in compressed ISO date format.
+// The datestamp of the C++ library in compressed ISO date format.
 #define __GLIBCXX__
 
+// The major release number for the GCC release the C++ library belongs to.
+#define _GLIBCXX_RELEASE
+
 // Macros for various attributes.
 //   _GLIBCXX_PURE
 //   _GLIBCXX_CONST
diff --git a/libstdc++-v3/testsuite/ext/profile/mutex_extensions_neg.cc 
b/libstdc++-v3/testsuite/ext/profile/mutex_extensions_neg.cc
index 32a4e91..645aa24 100644
--- a/libstdc++-v3/testsuite/ext/profile/mutex_extensions_neg.cc
+++ b/libstdc++-v3/testsuite/ext/profile/mutex_extensions_neg.cc
@@ -25,7 +25,7 @@
 
 #include <vector>
 
-// { dg-error "multiple inlined namespaces" "" { target *-*-* } 350 }
+// { dg-error "multiple inlined namespaces" "" { target *-*-* } 0 }
 
 // "template argument 1 is invalid"
 // { dg-prune-output "tuple:993" }

Reply via email to