]> sourceware.org Git - glibc.git/commitdiff
Define __CORRECT_ISO_CPP_STRING_H_PROTO correctly for Clang.
authorBrooks Moses <bmoses@google.com>
Thu, 12 Dec 2013 01:46:46 +0000 (17:46 -0800)
committerBrooks Moses <bmoses@google.com>
Mon, 23 Dec 2013 23:50:54 +0000 (15:50 -0800)
In the string/string.h and string/strings.h headers, we have a couple
of macros that "tell the caller that we provide correct C++
prototypes" according to the comment; they are used to determine
whether to wrap some prototypes in "extern "C++"" (and provide
multiple overloads of them, and some other magic) when __cplusplus is
defined.

The macros are set to check for sufficiently-recent GCC versions (4.4
and later), but this is not the right check for non-GCC compilers.  In
particular, these macros should also be set when using Clang -- if
they are not set, then Clang will be unable to correctly diagnose a
number of subtle bugs that will be errors in GCC compilations.

As per discussion on earlier versions of this patch, rather than
restrict the fix to Clang per se, we assume that all C++ compilers that
claim to fully support C++98 are using a standard-conforming C++
standard library, which seems pretty reasonable.  Clang has been
providing an appropriate value of __cplusplus since May 2012.

ChangeLog
string/string.h
string/strings.h

index 9528f88097d58723a513d6c9476eff296866f53c..584f5896fd0d7683a62714c4a31abc415785a756 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2013-12-24  Brooks Moses  <bmoses@google.com>
+
+       * string/string.h (__CORRECT_ISO_CPP_STRING_H_PROTO): Define for
+       all compilers that claim C++98 compliance, not just GCC.
+       * string/strings.h (__CORRECT_ISO_CPP_STRINGS_H_PROTO):
+       Likewise.
+
 2013-12-24  Maxim Kuvyrkov  <maxim@kugelworks.com>
 
        * NEWS: Restore accidentally deleted bug-fix entries.
index ecc3fef1bd2a5bb85517caf6ca737d30571bb1de..33d01ad71c42bcba86aa535bfb891c8a88589d19 100644 (file)
@@ -31,8 +31,12 @@ __BEGIN_DECLS
 #define        __need_NULL
 #include <stddef.h>
 
-/* Tell the caller that we provide correct C++ prototypes.  */
-#if defined __cplusplus && __GNUC_PREREQ (4, 4)
+/* Provide correct C++ prototypes, and indicate this to the caller.  This
+   requires a compatible C++ standard library.  As a heuristic, we provide
+   these when the compiler indicates full conformance with C++98 or later,
+   and for older GCC versions that are known to provide a compatible
+   libstdc++.  */
+#if defined __cplusplus && (__cplusplus >= 199711L || __GNUC_PREREQ (4, 4))
 # define __CORRECT_ISO_CPP_STRING_H_PROTO
 #endif
 
index dad0a04467edbc8795c44ab9cd0104a587b845fe..0d2b5bf2a73c83683a97ccaee142b10c998a54df 100644 (file)
 # define __need_size_t
 # include <stddef.h>
 
-/* Tell the caller that we provide correct C++ prototypes.  */
-# if defined __cplusplus && __GNUC_PREREQ (4, 4)
+/* Provide correct C++ prototypes, and indicate this to the caller.  This
+   requires a compatible C++ standard library.  As a heuristic, we provide
+   these when the compiler indicates full conformance with C++98 or later,
+   and for older GCC versions that are known to provide a compatible
+   libstdc++.  */
+# if defined __cplusplus && (__cplusplus >= 199711L || __GNUC_PREREQ (4, 4))
 #  define __CORRECT_ISO_CPP_STRINGS_H_PROTO
 # endif
 
This page took 0.131782 seconds and 5 git commands to generate.