wabt
wabt copied to clipboard
wabt 1.0.17 fails to compile on RHEL7 with gcc 4.8.5
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?
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.
wabt 1.0.20 fails to compile on Centos7.7 with gcc 4.8.5/ gcc 8.3.1 too
problem sovled by change to Centos8.3.1
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)
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 {
1.0.24 builds for me with gcc-10.2.1 from devtoolset-10 on RHEL7, for the record.
Closing as wontfix.