From: muraken@... Date: 2016-01-07T12:33:38+00:00 Subject: [ruby-core:72760] [Ruby trunk - Bug #11962] Ruby 2.3.0 causing compile failure on extensions using a C++ compiler Issue #11962 has been updated by Kenta Murata. I found the other place to be fixed. The following patch is the complete version. ```diff diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h index 7aabf5b..a2f42c8 100644 --- a/include/ruby/ruby.h +++ b/include/ruby/ruby.h @@ -620,7 +620,7 @@ int ruby_safe_level_2_warning(void) __attribute__((warning("$SAFE=2 to 4 are obs # ifdef RUBY_EXPORT # define ruby_safe_level_2_warning() ruby_safe_level_2_error() # endif -#if defined(HAVE_BUILTIN___BUILTIN_CHOOSE_EXPR_CONSTANT_P) +#if defined(HAVE_BUILTIN___BUILTIN_CHOOSE_EXPR_CONSTANT_P) && !defined(__cplusplus) # define RUBY_SAFE_LEVEL_INVALID_P(level) \ __extension__(\ __builtin_choose_expr(\ @@ -874,7 +874,7 @@ struct RBasic { VALUE rb_obj_hide(VALUE obj); VALUE rb_obj_reveal(VALUE obj, VALUE klass); /* do not use this API to change klass information */ -#if defined(HAVE_BUILTIN___BUILTIN_CHOOSE_EXPR_CONSTANT_P) +#if defined(HAVE_BUILTIN___BUILTIN_CHOOSE_EXPR_CONSTANT_P) && !defined(__cplusplus) # define RB_OBJ_WB_UNPROTECT_FOR(type, obj) \ __extension__( \ __builtin_choose_expr( \ @@ -1376,7 +1376,7 @@ rb_data_object_wrap_warning(VALUE klass, void *ptr, RUBY_DATA_FUNC mark, RUBY_DA return rb_data_object_wrap(klass, ptr, mark, free); } -#if defined(HAVE_BUILTIN___BUILTIN_CHOOSE_EXPR_CONSTANT_P) +#if defined(HAVE_BUILTIN___BUILTIN_CHOOSE_EXPR_CONSTANT_P) && !defined(__cplusplus) #define rb_data_object_wrap_warning(klass, ptr, mark, free) \ __extension__( \ __builtin_choose_expr( \ diff --git a/include/ruby/st.h b/include/ruby/st.h index 190bad2..97c08b1 100644 --- a/include/ruby/st.h +++ b/include/ruby/st.h @@ -59,7 +59,7 @@ struct st_hash_type { #define ST_INDEX_BITS (sizeof(st_index_t) * CHAR_BIT) -#if defined(HAVE_BUILTIN___BUILTIN_CHOOSE_EXPR) && defined(HAVE_BUILTIN___BUILTIN_TYPES_COMPATIBLE_P) +#if defined(HAVE_BUILTIN___BUILTIN_CHOOSE_EXPR) && defined(HAVE_BUILTIN___BUILTIN_TYPES_COMPATIBLE_P) && !defined(__cplusplus) # define ST_DATA_COMPATIBLE_P(type) \ __builtin_choose_expr(__builtin_types_compatible_p(type, st_data_t), 1, 0) #else ``` ---------------------------------------- Bug #11962: Ruby 2.3.0 causing compile failure on extensions using a C++ compiler https://bugs.ruby-lang.org/issues/11962#change-56007 * Author: Sameer Deshmukh * Status: Open * Priority: Normal * Assignee: Nobuyoshi Nakada * ruby -v: 2.3.0 * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN ---------------------------------------- Hello, I'm a contributor with the SciRuby foundation, and we have a gem called [nmatrix](https://github.com/SciRuby/nmatrix), which is a ruby gem for linear algebra processing in Ruby. For representing different types of data, nmatrix makes heavy use of C++ templates, which requires compilation with g++. Currently we wrap the code that defines ruby functions at C level in an `extern "C" {}` block in a .cpp file and use g++ to compile the file as a whole. Upgrading to ruby 2.3.0 has caused a problem because of [this change implemented in the internals of the ruby C API](https://github.com/ruby/ruby/commit/334710c155ad19cfd947ce6bcd7127b97cbe37da#diff-3b256c5581538dcd834697c766a2b1aaR879). As specified in the GCC docs (https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html) the function "__builtin_choose_expr" (that has been introduced in the latest Ruby C API) is available only for C. Thus the change is rendering our C++ extensions useless. You can see the compile error being caused in nmatrix here: https://github.com/SciRuby/nmatrix/issues/429 I have come up with [a temporary fix for this](https://github.com/SciRuby/nmatrix/pull/432/files#diff-cc867f54069967617c44c1ca31a5969aR37), but its only patch work and will need to be done by every single extension employing a C++ compiler. Looking forward to a positive response from you. -- https://bugs.ruby-lang.org/ Unsubscribe: