Fix unportable usage of __has_attribute
authorDavid Rowley <drowley@postgresql.org>
Tue, 24 Nov 2020 00:09:35 +0000 (13:09 +1300)
committerDavid Rowley <drowley@postgresql.org>
Tue, 24 Nov 2020 00:09:35 +0000 (13:09 +1300)
This should fix the breakages caused by 697e1d02f, which seems to break
the build for GCC version < 5.

It seems, according to the GCC manual that __has_attribute is a "special
operator" and must be tested without any other conditions in the
preprocessor test.

Per recommendation from the GCC manual via Greg Nancarrow

Reported-by: Greg Nancarrow
Discussion: https://postgr.es/m/CAJcOf-euSu8fhC10v476o9dqnjqKysVs1_vRms-_fvajpZ3kFw@mail.gmail.com

src/include/c.h

index ff7c2eddcec6ff6b32f3204b349d06c6ff4b5ec7..2c2451d11e153bed8a759316985b9b1d2622c0d8 100644 (file)
  * Marking certain functions as "hot" or "cold" can be useful to assist the
  * compiler in arranging the assembly code in a more efficient way.
  */
-#if defined(__has_attribute) && __has_attribute (cold)
+#if defined(__has_attribute)
+
+#if __has_attribute (cold)
 #define pg_attribute_cold __attribute__((cold))
 #else
 #define pg_attribute_cold
 #endif
 
-#if defined(__has_attribute) && __has_attribute (hot)
+#if __has_attribute (hot)
 #define pg_attribute_hot __attribute__((hot))
 #else
 #define pg_attribute_hot
 #endif
 
+#else
+#define pg_attribute_hot
+#define pg_attribute_cold
+#endif
+
 /*
  * Mark a point as unreachable in a portable fashion.  This should preferably
  * be something that the compiler understands, to aid code generation.