[前][次][番号順一覧][スレッド一覧]

ruby-changes:59512

From: =E5=8D=9C=E9=83=A8=E6=98=8C=E5=B9=B3 <ko1@a...>
Date: Fri, 27 Dec 2019 07:23:38 +0900 (JST)
Subject: [ruby-changes:59512] 0958e19ffb (master): add several __has_something macro

https://git.ruby-lang.org/ruby.git/commit/?id=0958e19ffb

From 0958e19ffb047781fe1506760c7cbd8d7fe74e57 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=8D=9C=E9=83=A8=E6=98=8C=E5=B9=B3?=
 <shyouhei@r...>
Date: Mon, 2 Dec 2019 14:58:43 +0900
Subject: add several __has_something macro

With these macros implemented we can write codes just like we can assume
the compiler being clang.  MSC_VERSION_SINCE is defined to implement
those macros, but turned out to be handy for other places.  The -fdeclspec
compiler flag is necessary for clang to properly handle __has_declspec().

diff --git a/bignum.c b/bignum.c
index 4569183..370c63c 100644
--- a/bignum.c
+++ b/bignum.c
@@ -5373,11 +5373,9 @@ rb_integer_float_cmp(VALUE x, VALUE y) https://github.com/ruby/ruby/blob/trunk/bignum.c#L5373
 
 #if SIZEOF_LONG * CHAR_BIT >= DBL_MANT_DIG /* assume FLT_RADIX == 2 */
 COMPILER_WARNING_PUSH
-#ifdef __has_warning
 #if __has_warning("-Wimplicit-int-float-conversion")
 COMPILER_WARNING_IGNORED(-Wimplicit-int-float-conversion)
 #endif
-#endif
 static const double LONG_MAX_as_double = LONG_MAX;
 COMPILER_WARNING_POP
 #endif
diff --git a/configure.ac b/configure.ac
index f1ed36b..f9e8573 100644
--- a/configure.ac
+++ b/configure.ac
@@ -481,6 +481,8 @@ AS_IF([test x"${RPATHFLAG}" = x], [ https://github.com/ruby/ruby/blob/trunk/configure.ac#L481
     rpathflag=`echo "$RPATHFLAG" | sed 's/%.*//'`
 ])
 
+RUBY_TRY_CFLAGS(-fdeclspec, [RUBY_APPEND_OPTIONS(XCFLAGS, -fdeclspec)])
+
 AS_CASE([$RUBY_PATCHLEVEL], [-*],
 	[RUBY_DEVEL=yes], [RUBY_DEVEL=no])
 particular_werror_flags=$RUBY_DEVEL
diff --git a/internal/compilers.h b/internal/compilers.h
index 697bad5..5a9e566 100644
--- a/internal/compilers.h
+++ b/internal/compilers.h
@@ -10,22 +10,111 @@ https://github.com/ruby/ruby/blob/trunk/internal/compilers.h#L10
  *             file COPYING are met.  Consult the file for details.
  */
 
-#ifndef MAYBE_UNUSED
-# define MAYBE_UNUSED(x) x
+#include "ruby/defines.h"       /* for GCC_VERSION_SINCE */
+
+#ifdef _MSC_VER
+# define MSC_VERSION_SINCE(_)  (_MSC_VER >= _)
+# define MSC_VERSION_BEFORE(_) (_MSC_VER <  _)
+#else
+# define MSC_VERSION_SINCE(_)  0
+# define MSC_VERSION_BEFORE(_) 0
 #endif
 
-#ifndef WARN_UNUSED_RESULT
-# define WARN_UNUSED_RESULT(x) x
+#ifndef __has_attribute
+# define __has_attribute(...) __has_attribute_##__VA_ARGS__
+# /* GCC  <= 4  lacks __has_attribute  predefined macro,  while has  attributes
+#  * themselves.  We can simulate the macro like the following: */
+# define __has_attribute_aligned                    GCC_VERSION_SINCE(0, 0, 0)
+# define __has_attribute_alloc_size                 GCC_VERSION_SINCE(4, 3, 0)
+# define __has_attribute_artificial                 GCC_VERSION_SINCE(4, 3, 0)
+# define __has_attribute_always_inline              GCC_VERSION_SINCE(3, 1, 0)
+# define __has_attribute_cdecl                      GCC_VERSION_SINCE(0, 0, 0)
+# define __has_attribute_cold                       GCC_VERSION_SINCE(4, 3, 0)
+# define __has_attribute_const                      GCC_VERSION_SINCE(2, 6, 0)
+# define __has_attribute_deprecated                 GCC_VERSION_SINCE(3, 1, 0)
+# define __has_attribute_dllexport                  GCC_VERSION_SINCE(0, 0, 0)
+# define __has_attribute_dllimport                  GCC_VERSION_SINCE(0, 0, 0)
+# define __has_attribute_error                      GCC_VERSION_SINCE(4, 3, 0)
+# define __has_attribute_format                     GCC_VERSION_SINCE(0, 0, 0)
+# define __has_attribute_hot                        GCC_VERSION_SINCE(4, 3, 0)
+# define __has_attribute_leaf                       GCC_VERSION_SINCE(4, 6, 0)
+# define __has_attribute_malloc                     GCC_VERSION_SINCE(3, 0, 0)
+# define __has_attribute_no_address_safety_analysis GCC_VERSION_SINCE(4, 8, 0)
+# define __has_attribute_no_sanitize_address        GCC_VERSION_SINCE(4, 8, 0)
+# define __has_attribute_no_sanitize_undefined      GCC_VERSION_SINCE(4, 9, 0)
+# define __has_attribute_noinline                   GCC_VERSION_SINCE(3, 1, 0)
+# define __has_attribute_nonnull                    GCC_VERSION_SINCE(3, 3, 0)
+# define __has_attribute_noreturn                   GCC_VERSION_SINCE(2, 5, 0)
+# define __has_attribute_nothrow                    GCC_VERSION_SINCE(3, 3, 0)
+# define __has_attribute_pure                       GCC_VERSION_SINCE(2, 96, 0)
+# define __has_attribute_returns_nonnull            GCC_VERSION_SINCE(4, 9, 0)
+# define __has_attribute_returns_twice              GCC_VERSION_SINCE(4, 1, 0)
+# define __has_attribute_stdcall                    GCC_VERSION_SINCE(0, 0, 0)
+# define __has_attribute_unused                     GCC_VERSION_SINCE(0, 0, 0)
+# define __has_attribute_visibility                 GCC_VERSION_SINCE(3, 3, 0)
+# define __has_attribute_visibility                 GCC_VERSION_SINCE(3, 3, 0)
+# define __has_attribute_warn_unused_result         GCC_VERSION_SINCE(3, 4, 0)
+# define __has_attribute_warning                    GCC_VERSION_SINCE(4, 3, 0)
+# define __has_attribute_weak                       GCC_VERSION_SINCE(0, 0, 0)
+# /* Note that 0,0,0 might be inaccurate. */
+#endif
+
+#ifndef __has_c_attribute
+# /* As  of writing  everything  that lacks  __has_c_attribute also  completely
+#  * lacks C2x attributes as well.  Might change in future? */
+# define __has_c_attribute(...) 0
+#endif
+
+#ifndef __has_declspec_attribute
+# define __has_declspec_attribute(...) __has_declspec_attribute_##__VA_ARGS__
+# define __has_declspec_attribute_align      MSC_VERSION_SINCE( 800)
+# define __has_declspec_attribute_deprecated MSC_VERSION_SINCE(1300)
+# define __has_declspec_attribute_dllexport  MSC_VERSION_SINCE( 800)
+# define __has_declspec_attribute_dllimport  MSC_VERSION_SINCE( 800)
+# define __has_declspec_attribute_noalias    MSC_VERSION_SINCE( 800)
+# define __has_declspec_attribute_noinline   MSC_VERSION_SINCE(1300)
+# define __has_declspec_attribute_noreturn   MSC_VERSION_SINCE(1100)
+# define __has_declspec_attribute_nothrow    MSC_VERSION_SINCE( 800)
+# define __has_declspec_attribute_restrict   MSC_VERSION_SINCE( 800)
+# /* Note that 800 might be inaccurate. */
+#endif
+
+#ifndef __has_builtin
+# /* :FIXME:  Historically GCC  has had  tons of  builtins, but  it implemented
+#  * __has_builtin  only  since  GCC  10.    This  section  can  be  made  more
+#  * granular. */
+# /* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66970 */
+# define __has_builtin(...) GCC_VERSION_SINCE(0, 0, 0)
 #endif
 
 #ifndef __has_feature
-# define __has_feature(x) 0
+# define __has_feature(...) 0
 #endif
 
 #ifndef __has_extension
+# /* Pre-3.0 clang had __has_feature but not __has_extension. */
 # define __has_extension __has_feature
 #endif
 
+#ifndef __has_warning
+# /* We cannot  simulate __has_warning  like the ones  above, because  it takes
+#  * string liteals  (we can stringize  a macro arugment  but there is  no such
+#  * thing like an unquote of strrings). */
+# define __has_warning(...) 0
+#endif
+
+#ifndef __GNUC__
+# define __extension__ /* void */
+#endif
+
+#ifndef MAYBE_UNUSED
+# define MAYBE_UNUSED(x) x
+#endif
+
+#ifndef WARN_UNUSED_RESULT
+# define WARN_UNUSED_RESULT(x) x
+#endif
+
 #define RB_OBJ_BUILTIN_TYPE(obj) rb_obj_builtin_type(obj)
 #define OBJ_BUILTIN_TYPE(obj) RB_OBJ_BUILTIN_TYPE(obj)
 #ifdef __GNUC__
diff --git a/internal/gc.h b/internal/gc.h
index cf59eae..6e3fb89 100644
--- a/internal/gc.h
+++ b/internal/gc.h
@@ -47,11 +47,9 @@ RUBY_SYMBOL_EXPORT_END https://github.com/ruby/ruby/blob/trunk/internal/gc.h#L47
                         rb_wb_unprotected_newobj_of(klass, flags))
 #define NEWOBJ_OF(obj,type,klass,flags) RB_NEWOBJ_OF(obj,type,klass,flags)
 
-#ifdef __has_attribute
 #if __has_attribute(alloc_align)
 __attribute__((__alloc_align__(1)))
 #endif
-#endif
 void *rb_aligned_malloc(size_t, size_t) RUBY_ATTR_MALLOC RUBY_ATTR_ALLOC_SIZE((2));
 
 size_t rb_size_mul_or_raise(size_t, size_t, VALUE); /* used in compile.c */
diff --git a/numeric.c b/numeric.c
index fa89616..218dabe 100644
--- a/numeric.c
+++ b/numeric.c
@@ -1389,7 +1389,7 @@ rb_float_equal(VALUE x, VALUE y) https://github.com/ruby/ruby/blob/trunk/numeric.c#L1389
     }
     else if (RB_TYPE_P(y, T_FLOAT)) {
 	b = RFLOAT_VALUE(y);
-#if defined(_MSC_VER) && _MSC_VER < 1300
+#if MSC_VERSION_BEFORE(1300)
 	if (isnan(b)) return Qfalse;
 #endif
     }
@@ -1397,7 +1397,7 @@ rb_float_equal(VALUE x, VALUE y) https://github.com/ruby/ruby/blob/trunk/numeric.c#L1397
 	return num_equal(x, y);
     }
     a = RFLOAT_VALUE(x);
-#if defined(_MSC_VER) && _MSC_VER < 1300
+#if MSC_VERSION_BEFORE(1300)
     if (isnan(a)) return Qfalse;
 #endif
     return (a == b)?Qtrue:Qfalse;
@@ -1513,14 +1513,14 @@ rb_float_gt(VALUE x, VALUE y) https://github.com/ruby/ruby/blob/trunk/numeric.c#L1513
     }
     else if (RB_TYPE_P(y, T_FLOAT)) {
 	b = RFLOAT_VALUE(y);
-#if defined(_MSC_VER) && _MSC_VER < 1300
+#if MSC_VERSION_BEFORE(1300)
 	if (isnan(b)) return Qfalse;
 #endif
     }
     else {
 	return rb_num_coerce_relop(x, y, '>');
     }
-#if defined(_MSC_VER) && _MSC_VER < 1300
+#if MSC_VERSION_BEFORE(1300)
     if (isnan(a)) return Qfalse;
 #endif
     return (a > b)?Qtrue:Qfalse;
@@ -1550,14 +1550,14 @@ flo_ge(VALUE x, VALUE y) https://github.com/ruby/ruby/blob/trunk/numeric.c#L1550
     }
     else if (RB_TYPE_P(y, T_FLOAT)) {
 	b = RFLOAT_VALUE(y);
-#if defined(_MSC_VER) && _MSC_VER < 1300
+#if MSC_VERSION_BEFORE(1300)
 	if (isnan(b)) return Qfalse;
 #endif
     }
     else {
 	return rb_num_coerce_relop(x, y, idGE);
     }
-#if defined(_MSC_VER) && _MSC_VER < 1300
+#if MSC_VERSION_BEFORE(1300)
     if (isnan(a)) return Qfalse;
 #endif
     return (a >= b)?Qtrue:Qfalse;
@@ -1587,14 +1587,14 @@ flo_lt(VALUE x, VALUE y) https://github.com/ruby/ruby/blob/trunk/numeric.c#L1587
     }
     else if (RB_TYPE_P(y, T_FLOAT)) {
 	b = RFLOAT_VALUE(y);
-#if defined(_MSC_VER) && _MSC_VER < 1300
+#if MSC_VERSION_BEFORE(1300)
 	if (isnan(b)) return Qfalse;
 #endif
     }
     else {
 	return rb_num_coerce_relop(x, y, '<');
     }
-#if defined(_MSC_VER) && _MSC_VER < 1300
+#if MSC_VERSION_B (... truncated)

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]