wabt icon indicating copy to clipboard operation
wabt copied to clipboard

wabt 1.0.17 fails to compile on RHEL7 with gcc 4.8.5

Open rathann opened this issue 3 years ago • 6 comments

I'm getting a compilation error:

[ 80%] Building CXX object CMakeFiles/wasm.dir/src/interp/interp-wasm-c-api.cc.o
/usr/bin/c++  -DWASM_API_EXTERN="__attribute__((visibility(\"default\")))" -D__STDC_FORMAT_MACROS=1 -D__STDC_LIMIT_MACROS=1 -Dwasm_EXPORTS -I/builddir/build/BUILD/wabt-1.0.17 -I/builddir/build/BUILD/wabt-1.0.17/build -I/builddir/build/BUILD/wabt-1.0.17/third_party/wasm-c-api/include  -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches   -m64 -mtune=generic -std=c++11 -Wold-style-cast -fno-exceptions -fPIC -fvisibility=hidden   -Wall -Wextra -Wno-unused-parameter -Wpointer-arith -g -Wuninitialized -Wno-clobbered -Wno-old-style-cast -o CMakeFiles/wasm.dir/src/interp/interp-wasm-c-api.cc.o -c /builddir/build/BUILD/wabt-1.0.17/src/interp/interp-wasm-c-api.cc
/builddir/build/BUILD/wabt-1.0.17/src/interp/interp-wasm-c-api.cc: In constructor 'wasm_globaltype_t::wasm_globaltype_t(wasm_valtype_t*, wasm_mutability_t)':
/builddir/build/BUILD/wabt-1.0.17/src/interp/interp-wasm-c-api.cc:129:22: error: could not convert '* type' from 'wasm_valtype_t' to 'wabt::interp::ValueType {aka wabt::Type}'
         valtype{*type} {
                      ^
/builddir/build/BUILD/wabt-1.0.17/src/interp/interp-wasm-c-api.cc: In constructor 'wasm_tabletype_t::wasm_tabletype_t(wabt::interp::TableType)':
/builddir/build/BUILD/wabt-1.0.17/src/interp/interp-wasm-c-api.cc:152:41: error: cannot convert 'wasm_limits_t' to 'uint32_t {aka unsigned int}' in initialization
         limits{FromWabtLimits(tt.limits)} {}
                                         ^
/builddir/build/BUILD/wabt-1.0.17/src/interp/interp-wasm-c-api.cc:152:41: warning: missing initializer for member 'wasm_limits_t::max' [-Wmissing-field-initializers]
/builddir/build/BUILD/wabt-1.0.17/src/interp/interp-wasm-c-api.cc: In constructor 'wasm_memorytype_t::wasm_memorytype_t(const wasm_limits_t*)':
/builddir/build/BUILD/wabt-1.0.17/src/interp/interp-wasm-c-api.cc:162:23: error: cannot convert 'const wasm_limits_t' to 'uint32_t {aka unsigned int}' in initialization
         limits{*limits} {}
                       ^
/builddir/build/BUILD/wabt-1.0.17/src/interp/interp-wasm-c-api.cc:162:23: warning: missing initializer for member 'wasm_limits_t::max' [-Wmissing-field-initializers]
/builddir/build/BUILD/wabt-1.0.17/src/interp/interp-wasm-c-api.cc: In constructor 'wasm_memorytype_t::wasm_memorytype_t(wabt::interp::MemoryType)':
/builddir/build/BUILD/wabt-1.0.17/src/interp/interp-wasm-c-api.cc:166:41: error: cannot convert 'wasm_limits_t' to 'uint32_t {aka unsigned int}' in initialization
         limits{FromWabtLimits(mt.limits)} {}
                                         ^
/builddir/build/BUILD/wabt-1.0.17/src/interp/interp-wasm-c-api.cc:166:41: warning: missing initializer for member 'wasm_limits_t::max' [-Wmissing-field-initializers]
/builddir/build/BUILD/wabt-1.0.17/src/interp/interp-wasm-c-api.cc: In function 'wasm_frame_t* wasm_frame_copy(const wasm_frame_t*)':
/builddir/build/BUILD/wabt-1.0.17/src/interp/interp-wasm-c-api.cc:981:33: error: could not convert '* frame' from 'const wasm_frame_t' to 'wabt::interp::Frame'
   return new wasm_frame_t{*frame};
                                 ^
make[2]: *** [CMakeFiles/wasm.dir/src/interp/interp-wasm-c-api.cc.o] Error 1

Is gcc-4.8.5 a supported compiler version?

rathann avatar Jul 15 '20 13:07 rathann

It looks like the default copy constructor is not supported using brace initializer syntax. It looks like this doesn't work in gcc 4.x, but was fixed in gcc-5: https://godbolt.org/z/W7oGjP. A simple fix for now is to avoid brace initializer syntax.

binji avatar Jul 15 '20 18:07 binji

wabt 1.0.20 fails to compile on Centos7.7 with gcc 4.8.5/ gcc 8.3.1 too

leeveel avatar Feb 08 '21 10:02 leeveel

problem sovled by change to Centos8.3.1

leeveel avatar Feb 08 '21 14:02 leeveel

You can use the devtoolset-9 SCL, which has a newer GCC. For example, devtoolset-9-gcc-c++ package brings in g++ 9.3.1.

# yum install devtoolset-9-gcc-c++
$ . /opt/rh/devtoolset-9/enable
$ g++ --version
g++ (GCC) 9.3.1 20200408 (Red Hat 9.3.1-2)

rathann avatar Feb 09 '21 11:02 rathann

Did exactly that but still got

[ 27%] Building CXX object CMakeFiles/wasm.dir/src/interp/interp-wasm-c-api.cc.o
/home/zcw100/git/wabt/src/interp/interp-wasm-c-api.cc:129:17: error: no viable conversion from 'wasm_valtype_t' to 'ValueType' (aka 'wabt::Type')
        valtype{*type} {
                ^~~~~
/home/zcw100/git/wabt/src/type.h:33:7: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'wasm_valtype_t' to 'const wabt::Type &' for 1st argument
class Type {
      ^
/home/zcw100/git/wabt/src/type.h:33:7: note: candidate constructor (the implicit move constructor) not viable: no known conversion from 'wasm_valtype_t' to 'wabt::Type &&' for 1st argument
class Type {
      ^
/home/zcw100/git/wabt/src/type.h:59:3: note: candidate constructor not viable: no known conversion from 'wasm_valtype_t' to 'int32_t' (aka 'int') for 1st argument
  Type(int32_t code) : enum_(static_cast<Enum>(code)) {}
  ^
/home/zcw100/git/wabt/src/type.h:60:3: note: candidate constructor not viable: no known conversion from 'wasm_valtype_t' to 'wabt::Type::Enum' for 1st argument
  Type(Enum e) : enum_(e) {}
  ^
/home/zcw100/git/wabt/src/interp/interp-wasm-c-api.cc:152:16: error: no viable conversion from 'wasm_limits_t' to 'uint32_t' (aka 'unsigned int')
        limits{FromWabtLimits(tt.limits)} {}
               ^~~~~~~~~~~~~~~~~~~~~~~~~
/home/zcw100/git/wabt/src/interp/interp-wasm-c-api.cc:152:41: warning: missing field 'max' initializer [-Wmissing-field-initializers]
        limits{FromWabtLimits(tt.limits)} {}
                                        ^
/home/zcw100/git/wabt/src/interp/interp-wasm-c-api.cc:162:16: error: no viable conversion from 'const wasm_limits_t' to 'uint32_t' (aka 'unsigned int')
        limits{*limits} {}
               ^~~~~~~
/home/zcw100/git/wabt/src/interp/interp-wasm-c-api.cc:162:23: warning: missing field 'max' initializer [-Wmissing-field-initializers]
        limits{*limits} {}
                      ^
/home/zcw100/git/wabt/src/interp/interp-wasm-c-api.cc:166:16: error: no viable conversion from 'wasm_limits_t' to 'uint32_t' (aka 'unsigned int')
        limits{FromWabtLimits(mt.limits)} {}
               ^~~~~~~~~~~~~~~~~~~~~~~~~
/home/zcw100/git/wabt/src/interp/interp-wasm-c-api.cc:166:41: warning: missing field 'max' initializer [-Wmissing-field-initializers]
        limits{FromWabtLimits(mt.limits)} {}
                                        ^
/home/zcw100/git/wabt/src/interp/interp-wasm-c-api.cc:1024:27: error: no viable conversion from 'const wasm_frame_t' to 'wabt::interp::Frame'
  return new wasm_frame_t{*frame};
                          ^~~~~~
/home/zcw100/git/wabt/src/interp/interp.h:380:8: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'const wasm_frame_t' to 'const wabt::interp::Frame &' for 1st
      argument
struct Frame {
       ^
/home/zcw100/git/wabt/src/interp/interp.h:380:8: note: candidate constructor (the implicit move constructor) not viable: no known conversion from 'const wasm_frame_t' to 'wabt::interp::Frame &&' for 1st
      argument
struct Frame {

zacharywhitley avatar Mar 22 '21 19:03 zacharywhitley

1.0.24 builds for me with gcc-10.2.1 from devtoolset-10 on RHEL7, for the record.

rathann avatar Aug 20 '21 13:08 rathann

Closing as wontfix.

keithw avatar Sep 18 '22 05:09 keithw