forked from Lainports/freebsd-ports
lang/ruby{26,27}: work around clang 12 -Wcompound-token-split-by-macro warning
During an exp-run for llvm 12 (see bug 255570), it turned out that
several ruby gem extensions do not build with clang 12.0.0, for example
devel/rubygem-thrift:
compiling binary_protocol_accelerated.c
binary_protocol_accelerated.c:404:68: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
VALUE thrift_binary_protocol_class = rb_const_get(thrift_module, rb_intern("BinaryProtocol"));
^~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/include/ruby-2.7/ruby/ruby.h:1847:23: note: expanded from macro 'rb_intern'
__extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
^
binary_protocol_accelerated.c:404:68: note: '{' token is here
VALUE thrift_binary_protocol_class = rb_const_get(thrift_module, rb_intern("BinaryProtocol"));
^~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/include/ruby-2.7/ruby/ruby.h:1847:24: note: expanded from macro 'rb_intern'
__extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/include/ruby-2.7/ruby/ruby.h:1832:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
{ \
^
and similarly www/unit-ruby:
src/ruby/nxt_ruby.c:242:21: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
nxt_ruby_call = rb_intern("call");
^~~~~~~~~~~~~~~~~
/usr/local/include/ruby-2.7/ruby/ruby.h:1847:23: note: expanded from macro 'rb_intern'
__extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
^
src/ruby/nxt_ruby.c:242:21: note: '{' token is here
nxt_ruby_call = rb_intern("call");
^~~~~~~~~~~~~~~~~
/usr/local/include/ruby-2.7/ruby/ruby.h:1847:24: note: expanded from macro 'rb_intern'
__extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/include/ruby-2.7/ruby/ruby.h:1832:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
{ \
^
The gem extensions appear to purposefully compile using -Werror, and
this new -Wcompound-token-split-by-macro is enabled by default in clang
12 and later. Of course we could go over all these extensions, and
either remove -Werror or add -Wno-compound-token-split-by-macro, but
that seems quite a lot of effort.
Instead, I have submitted a pull request to ruby's GitHub, which fixes
this by modifying the main ruby.h header:
* Add RUBY_CONST_ID_CACHE_NB() (i.e. no-brace) which contains the code
itself, without any braces
* RUBY_CONST_ID_CACHE() which uses RUBY_CONST_ID_CACHE_NB(), but puts
braces around it (so no existing code using this macro breaks)
* Finally, change rb_intern() so the __extension__ directly creates a
gcc statement expression, using the RUBY_CONST_ID_CACHE_NB() macro
Patch this locally in our lang/ruby26 and lang/ruby27 ports for now,
until upstream manages to get this in.
Approved by: maintainer timeout (2 weeks)
PR: 255910
MFH: 2021Q2
This commit is contained in:
parent
6601c2af09
commit
6f95cc5245
2 changed files with 58 additions and 0 deletions
29
lang/ruby26/files/patch-include_ruby_ruby.h
Normal file
29
lang/ruby26/files/patch-include_ruby_ruby.h
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
--- include/ruby/ruby.h.orig 2021-04-05 11:48:34 UTC
|
||||
+++ include/ruby/ruby.h
|
||||
@@ -1807,12 +1807,14 @@ VALUE rb_sym2str(VALUE);
|
||||
VALUE rb_to_symbol(VALUE name);
|
||||
VALUE rb_check_symbol(volatile VALUE *namep);
|
||||
|
||||
-#define RUBY_CONST_ID_CACHE(result, str) \
|
||||
- { \
|
||||
+#define RUBY_CONST_ID_CACHE_NB(result, str) \
|
||||
static ID rb_intern_id_cache; \
|
||||
if (!rb_intern_id_cache) \
|
||||
rb_intern_id_cache = rb_intern2((str), (long)strlen(str)); \
|
||||
- result rb_intern_id_cache; \
|
||||
+ result rb_intern_id_cache;
|
||||
+#define RUBY_CONST_ID_CACHE(result, str) \
|
||||
+ { \
|
||||
+ RUBY_CONST_ID_CACHE_NB(result, str) \
|
||||
}
|
||||
#define RUBY_CONST_ID(var, str) \
|
||||
do RUBY_CONST_ID_CACHE((var) =, (str)) while (0)
|
||||
@@ -1823,7 +1825,7 @@ VALUE rb_check_symbol(volatile VALUE *namep);
|
||||
* since gcc-2.7.2.3 at least. */
|
||||
#define rb_intern(str) \
|
||||
(__builtin_constant_p(str) ? \
|
||||
- __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
|
||||
+ __extension__ ({RUBY_CONST_ID_CACHE_NB((ID), (str))}) : \
|
||||
rb_intern(str))
|
||||
#define rb_intern_const(str) \
|
||||
(__builtin_constant_p(str) ? \
|
||||
29
lang/ruby27/files/patch-include_ruby_ruby.h
Normal file
29
lang/ruby27/files/patch-include_ruby_ruby.h
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
--- include/ruby/ruby.h.orig 2021-04-05 12:39:38 UTC
|
||||
+++ include/ruby/ruby.h
|
||||
@@ -1828,12 +1828,14 @@ VALUE rb_sym2str(VALUE);
|
||||
VALUE rb_to_symbol(VALUE name);
|
||||
VALUE rb_check_symbol(volatile VALUE *namep);
|
||||
|
||||
-#define RUBY_CONST_ID_CACHE(result, str) \
|
||||
- { \
|
||||
+#define RUBY_CONST_ID_CACHE_NB(result, str) \
|
||||
static ID rb_intern_id_cache; \
|
||||
if (!rb_intern_id_cache) \
|
||||
rb_intern_id_cache = rb_intern2((str), (long)strlen(str)); \
|
||||
- result rb_intern_id_cache; \
|
||||
+ result rb_intern_id_cache;
|
||||
+#define RUBY_CONST_ID_CACHE(result, str) \
|
||||
+ { \
|
||||
+ RUBY_CONST_ID_CACHE_NB(result, str) \
|
||||
}
|
||||
#define RUBY_CONST_ID(var, str) \
|
||||
do RUBY_CONST_ID_CACHE((var) =, (str)) while (0)
|
||||
@@ -1844,7 +1846,7 @@ VALUE rb_check_symbol(volatile VALUE *namep);
|
||||
* since gcc-2.7.2.3 at least. */
|
||||
#define rb_intern(str) \
|
||||
(__builtin_constant_p(str) ? \
|
||||
- __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
|
||||
+ __extension__ ({RUBY_CONST_ID_CACHE_NB((ID), (str))}) : \
|
||||
rb_intern(str))
|
||||
#define rb_intern_const(str) \
|
||||
(__builtin_constant_p(str) ? \
|
||||
Loading…
Add table
Reference in a new issue