From: "Eregon (Benoit Daloze)" Date: 2021-09-06T15:16:02+00:00 Subject: [ruby-core:105160] [Ruby master Bug#17865] clang 12 -Wcompound-token-split-by-macro warning in ruby.h Issue #17865 has been updated by Eregon (Benoit Daloze). This looks like it was not yet backported to 2.7: https://github.com/ruby/ruby/blob/ruby_2_7/include/ruby/ruby.h#L1847 However it seems the PR is ready: https://github.com/ruby/ruby/pull/4504 @nobu Could you review/approve that PR? @nagachika Could you integrate it? ---------------------------------------- Bug #17865: clang 12 -Wcompound-token-split-by-macro warning in ruby.h https://bugs.ruby-lang.org/issues/17865#change-93567 * Author: _dim (Dimitry Andric) * Status: Closed * Priority: Normal * ruby -v: ruby 2.7.3p183 (2021-04-05 revision 6847ee089d) [amd64-freebsd14] * Backport: 2.6: REQUIRED, 2.7: REQUIRED, 3.0: DONTNEED ---------------------------------------- As reported in [pull request \#4504](https://github.com/ruby/ruby/pull/4504) (originally via [FreeBSD PR 255910](https://bugs.freebsd.org/255910)), certain ruby gem native extensions (such as thrift, see [here](http://package22.nyi.freebsd.org/data/mainamd64PR255570-default/2021-05-08_16h02m24s/logs/errors/rubygem-thrift-0.14.0,1.log) and [here](http://package22.nyi.freebsd.org/data/mainamd64PR255570-default/2021-05-08_16h02m24s/logs/errors/unit-ruby2.7-1.23.0.log)), with clang 12.0.0 or later fails, because they have -Werror in their CFLAGS, resulting in complaints about the expansion of the `rb_intern()` macro: ``` current directory: /wrkdirs/usr/ports/devel/rubygem-thrift/work/stage/usr/local/lib/ruby/gems/2.7/gems/thrift-0.14.0/ext make "DESTDIR=" 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' { \ ^ ``` Part of the `rb_intern()` macro expands to `(RUBY_CONST_ID_CACHE((ID), (str)))`, and in turn `RUBY_CONST_ID_CACHE()` expands to a brace enclosed compound statement. The intended effect is to get a gcc statement expression, which is normally delimited by `({ ... })`. However, clang 12.0.0 and later have a warning enabled by default, about pasting together the `(` and `{` tokens via different macros (see [llvm-project@0e00a95](https://github.com/llvm/llvm-project/commit/0e00a95b4fad5e72851de012d3a0b2c2d01f8685)). In the [pull request](https://github.com/ruby/ruby/pull/4504) I have submitted a possible fix for ruby 2.7 (and 2.6), because the above warnings do *not* occur on 3.0 and master: in [GitHub commit 6ecf07ab35](https://github.com/ruby/ruby/commit/6ecf07ab3538bfb74d298121ac0a1b2079b1d3fa) (for [pull request \#2991](https://github.com/ruby/ruby/pull/2991)) the `symbol.h` header got split off from the main `ruby.h`, and at the same time the code that emits the warning was removed. Later in commit commit:9e6e39c351 this got merged into master. -- https://bugs.ruby-lang.org/ Unsubscribe: