]> granicus.if.org Git - postgresql/commitdiff
Fix 8a934d677 for libc++ and make more include order resistant.
authorAndres Freund <andres@anarazel.de>
Fri, 31 Aug 2018 23:56:11 +0000 (16:56 -0700)
committerAndres Freund <andres@anarazel.de>
Sat, 1 Sep 2018 00:10:52 +0000 (17:10 -0700)
The previous definition was used in C++ mode, which causes problems
when using clang with libc++ (rather than libstdc++), due to bugs
therein.  So just avoid in C++ mode.

A second problem is that depending on include order and implicit
includes the previous definition did not guarantee that the current
hack was effective by the time isinf was used, fix that by forcing
math.h to be included.  This can cause clang using builds, or gcc
using ones with JIT enabled, to slow down noticably.

It's likely that we at some point want a better solution for the
performance problem, but while it's there it should better work.

Reported-By: Steven Winfield
Bug: #15270
Discussion: https://postgr.es/m/153116283147.1401.360416241833049560@wrigleys.postgresql.org
Author: Andres Freund
Backpatch: 11, like the previous commit.

src/include/port.h

index 74a9dc4d4d546fed94570c24f3770fb9c78fc419..0ce72e50e5e85cdb0956d17252534468fcca067d 100644 (file)
@@ -347,15 +347,18 @@ extern int        isinf(double x);
 /*
  * Glibc doesn't use the builtin for clang due to a *gcc* bug in a version
  * newer than the gcc compatibility clang claims to have. This would cause a
- * *lot* of superfluous function calls, therefore revert when using clang.
+ * *lot* of superfluous function calls, therefore revert when using clang. In
+ * C++ there's issues with libc++ (not libstdc++), so disable as well.
  */
-#ifdef __clang__
+#if defined(__clang__) && !defined(__cplusplus)
 /* needs to be separate to not confuse other compilers */
 #if __has_builtin(__builtin_isinf)
+/* need to include before, to avoid getting overwritten */
+#include <math.h>
 #undef isinf
 #define isinf __builtin_isinf
 #endif                                                 /* __has_builtin(isinf) */
-#endif                                                 /* __clang__ */
+#endif                                                 /* __clang__ && !__cplusplus*/
 #endif                                                 /* !HAVE_ISINF */
 
 #ifndef HAVE_MKDTEMP