summaryrefslogtreecommitdiff
path: root/include/ruby
diff options
context:
space:
mode:
author卜部昌平 <shyouhei@ruby-lang.org>2020-04-16 17:00:13 +0900
committer卜部昌平 <shyouhei@ruby-lang.org>2020-04-16 17:19:37 +0900
commit3eb05a8071815cfbb2500e624ad675f324cc72fa (patch)
treec771b99fa064c1e88aff6f4fc6228638b41c43e4 /include/ruby
parent4ab14aece4ee96354b3f10da7083caf7a7bf74dd (diff)
fix compiler error on gcc 4.x
It seems gcc prior to 5 suffered from preprocessor bug. We have to provide workarounds. See https://github.com/ruby/ruby/runs/591138012 ---- Here is something interesting. According to C99, strictly speaking, the gcc behaviour was in fact legal(!) and everything else were wrong. This was not a bug of gcc, rather a bug of the ISO C Standard. This defect was reported to the committee as DR#412, and fixed accordingly. All tested compilers now conform C17's updated preprocessor description. See http://www.open-std.org/JTC1/SC22/WG14/www/docs/dr_412.htm
Diffstat (limited to 'include/ruby')
-rw-r--r--include/ruby/3/has/attribute.h15
-rw-r--r--include/ruby/3/has/builtin.h24
2 files changed, 19 insertions, 20 deletions
diff --git a/include/ruby/3/has/attribute.h b/include/ruby/3/has/attribute.h
index 39ce321a4f..8fa70257ce 100644
--- a/include/ruby/3/has/attribute.h
+++ b/include/ruby/3/has/attribute.h
@@ -24,14 +24,13 @@
#include "ruby/3/compiler_since.h"
#include "ruby/3/token_paste.h"
-#ifndef __has_attribute
-# /* Don't bother. */
-#elif RUBY3_COMPILER_IS(GCC) && ! __has_attribute(pure)
-# /* FreeBSD's <sys/cdefs.h> defines its own *broken* version of
-# * __has_attribute. Cygwin copied that content to be a victim of the broken-
-# * ness. We don't take them into account. */
-#else
-# define RUBY3_HAVE___HAS_ATTRIBUTE 1
+#if defined(__has_attribute)
+# if __has_attribute(pure) || RUBY3_COMPILER_IS(GCC)
+# /* FreeBSD's <sys/cdefs.h> defines its own *broken* version of
+# * __has_attribute. Cygwin copied that content to be a victim of the
+# * broken-ness. We don't take them into account. */
+# define RUBY3_HAVE___HAS_ATTRIBUTE 1
+# endif
#endif
/** Wraps (or simulates) `__has_attribute`. */
diff --git a/include/ruby/3/has/builtin.h b/include/ruby/3/has/builtin.h
index cce6435881..e3f01ed8aa 100644
--- a/include/ruby/3/has/builtin.h
+++ b/include/ruby/3/has/builtin.h
@@ -24,18 +24,18 @@
#include "ruby/3/compiler_since.h"
#include "ruby/3/token_paste.h"
-#ifndef __has_builtin
-# /* Don't bother. */
-#elif RUBY3_COMPILER_IS(Intel)
-# /* :TODO: Intel C Compiler has __has_builtin (since 19.1 maybe?), and is
-# * reportedly broken. We have to skip them. However the situation can
-# * change. They might improve someday. We need to revisit here later. */
-#elif RUBY3_COMPILER_IS(GCC) && ! __has_builtin(__builtin_alloca)
-# /* FreeBSD's <sys/cdefs.h> defines its own *broken* version of __has_builtin.
-# * Cygwin copied that content to be a victim of the broken-ness. We don't
-# * take them into account. */
-#else
-# define RUBY3_HAVE___HAS_BUILTIN 1
+#if defined(__has_builtin)
+# if RUBY3_COMPILER_IS(Intel)
+# /* :TODO: Intel C Compiler has __has_builtin (since 19.1 maybe?), and is
+# * reportedly broken. We have to skip them. However the situation can
+# * change. They might improve someday. We need to revisit here later. */
+# elif RUBY3_COMPILER_IS(GCC) && ! __has_builtin(__builtin_alloca)
+# /* FreeBSD's <sys/cdefs.h> defines its own *broken* version of
+# * __has_builtin. Cygwin copied that content to be a victim of the
+# * broken-ness. We don't take them into account. */
+# else
+# define RUBY3_HAVE___HAS_BUILTIN 1
+# endif
#endif
/** Wraps (or simulates) `__has_builtin`. */