emscripten-core / emscripten-core/emscripten

Closure Compiler Fails with Public Fields in ES6 Classes

Open
#18,725 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
C++
Stars
27.6k
Forks
3.6k
Avg merge
1d 1h
Merged PRs (30d)
105

Description

The closure compiler fails when an ES6 class declares a public field outside of a constructor. You can avoid this issue by declaring the field in the constructor, though I don't think that will work for static fields.

The error message from the closure compiler indicates that public class fields are only supported with ES_NEXT mode or better. I'm not sure what to do to enable that mode or if it's even something a user can control.

I've attached a file with code that exposes the issue. Here's the output from compile and link:

```
em++ -v -o main.o -c main.cpp
"/home/jeff/dev/emsdk/upstream/bin/clang" --version
"/home/jeff/dev/emsdk/upstream/bin/clang++" -target wasm32-unknown-emscripten -fignore-exceptions -fvisibility=default -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr -DEMSCRIPTEN --sysroot=/home/jeff/dev/emsdk/upstream/emscripten/cache/sysroot -Xclang -iwithsysroot/include/fakesdl -Xclang -iwithsysroot/include/compat -v -c main.cpp -o main.o
clang version 17.0.0 (https://github.com/llvm/llvm-project 1142e6c7c795de7f80774325a07ed49bc95a48c9)
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: /home/jeff/dev/emsdk/upstream/bin
(in-process)
"/home/jeff/dev/emsdk/upstream/bin/clang-17" -cc1 -triple wasm32-unknown-emscripten -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name main.cpp -mrelocation-model static -mframe-pointer=none -ffp-contract=on -fno-rounding-math -mconstructor-aliases -target-cpu generic -mllvm -treat-scalable-fixed-error-as-warning -debugger-tuning=gdb -v -fcoverage-compilation-dir=/home/jeff/acorn -resource-dir /home/jeff/dev/emsdk/upstream/lib/clang/17 -D EMSCRIPTEN -isysroot /home/jeff/dev/emsdk/upstream/emscripten/cache/sysroot -internal-isystem /home/jeff/dev/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten/c++/v1 -internal-isystem /home/jeff/dev/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1 -internal-isystem /home/jeff/dev/emsdk/upstream/lib/clang/17/include -internal-isystem /home/jeff/dev/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten -internal-isystem /home/jeff/dev/emsdk/upstream/emscripten/cache/sysroot/include -fdeprecated-macro -fdebug-compilation-dir=/home/jeff/acorn -ferror-limit 19 -fvisibility=default -fgnuc-version=4.2.1 -fcxx-exceptions -fignore-exceptions -fexceptions -iwithsysroot/include/fakesdl -iwithsysroot/include/compat -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr -o main.o -x c++ main.cpp
clang -cc1 version 17.0.0 based upon LLVM 17.0.0git default target x86_64-unknown-linux-gnu
ignoring nonexistent directory "/home/jeff/dev/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten/c++/v1"
ignoring nonexistent directory "/home/jeff/dev/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten"
#include "..." search starts here:
#include <...> search starts here:
/home/jeff/dev/emsdk/upstream/emscripten/cache/sysroot/include/fakesdl
/home/jeff/dev/emsdk/upstream/emscripten/cache/sysroot/include/compat
/home/jeff/dev/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1
/home/jeff/dev/emsdk/upstream/lib/clang/17/include
/home/jeff/dev/emsdk/upstream/emscripten/cache/sysroot/include
End of search list.
em++ ./main.o -o ./public.min.js -v --closure 1 --pre-js ./public.js
"/home/jeff/dev/emsdk/upstream/bin/clang" --version
"/home/jeff/dev/emsdk/upstream/bin/wasm-ld" -o ./public.min.wasm ./main.o -L/home/jeff/dev/emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten -lGL -lal -lhtml5 -lstubs-debug -lnoexit -lc-debug -ldlmalloc -lcompiler_rt -lc++-noexcept -lc++abi-debug-noexcept -lsockets -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr --allow-undefined-file=/tmp/tmpi9mk0otx.undefined --strip-debug --export-if-defined=main --export-if-defined=__start_em_asm --export-if-defined=__stop_em_asm --export-if-defined=__start_em_lib_deps --export-if-defined=__stop_em_lib_deps --export-if-defined=__start_em_js --export-if-defined=__stop_em_js --export-if-defined=__main_argc_argv --export-if-defined=fflush --export=emscripten_stack_get_end --export=emscripten_stack_get_free --export=emscripten_stack_get_base --export=emscripten_stack_get_current --export=emscripten_stack_init --export=stackSave --export=stackRestore --export=stackAlloc --export=__wasm_call_ctors --export=__errno_location --export=__get_temp_ret --export=__set_temp_ret --export-table -z stack-size=65536 --initial-memory=16777216 --no-entry --max-memory=16777216 --stack-first
"/home/jeff/dev/emsdk/upstream/bin/wasm-emscripten-finalize" --dyncalls-i64 --pass-arg=legalize-js-interface-exported-helpers ./public.min.wasm -o ./public.min.wasm --detect-features
"/home/jeff/dev/emsdk/node/14.18.2_64bit/bin/node" /home/jeff/dev/emsdk/upstream/emscripten/src/compiler.js /tmp/tmp3bpwvrzu.json
"/home/jeff/dev/emsdk/upstream/bin/llvm-objcopy" ./public.min.wasm ./public.min.wasm --remove-section=.debug* --remove-section=producers
"/home/jeff/dev/emsdk/node/14.18.2_64bit/bin/node" --max_old_space_size=8192 /home/jeff/dev/emsdk/upstream/emscripten/node_modules/.bin/google-closure-compiler --compilation_level ADVANCED_OPTIMIZATIONS --language_in ECMASCRIPT_2020 --language_out NO_TRANSPILE --emit_use_strict=false --externs /home/jeff/dev/emsdk/upstream/emscripten/src/closure-externs/closure-externs.js --externs /home/jeff/dev/emsdk/upstream/emscripten/src/closure-externs/node-externs.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/assert.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/net.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/http.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/dns.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/buffer.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/punycode.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/fs.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/events.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/stream.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/process.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/url.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/path.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/string_decoder.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/tty.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/domain.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/zlib.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/https.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/os.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/util.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/dgram.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/readline.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/cluster.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/querystring.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/core.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/repl.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/tls.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/vm.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/child_process.js --js /tmp/emscripten_temp_epf1lic2/public.min.js --js_output_file tmpk1ryc9q2.cc.js --formatting PRETTY_PRINT
building:ERROR: Closure compiler run failed:

building:ERROR: /tmp/emscripten_temp_epf1lic2/public.min.js:37:2: ERROR - [JSC_LANGUAGE_FEATURE] This language feature is only supported for ES_NEXT mode or better: Public class fields.
37| data = {};
^

1 error(s), 0 warning(s)

em++: error: closure compiler failed (rc: 1): /home/jeff/dev/emsdk/node/14.18.2_64bit/bin/node --max_old_space_size=8192 /home/jeff/dev/emsdk/upstream/emscripten/node_modules/.bin/google-closure-compiler --compilation_level ADVANCED_OPTIMIZATIONS --language_in ECMASCRIPT_2020 --language_out NO_TRANSPILE --emit_use_strict=false --externs /home/jeff/dev/emsdk/upstream/emscripten/src/closure-externs/closure-externs.js --externs /home/jeff/dev/emsdk/upstream/emscripten/src/closure-externs/node-externs.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/assert.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/net.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/http.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/dns.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/buffer.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/punycode.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/fs.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/events.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/stream.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/process.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/url.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/path.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/string_decoder.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/tty.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/domain.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/zlib.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/https.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/os.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/util.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/dgram.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/readline.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/cluster.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/querystring.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/core.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/repl.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/tls.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/vm.js --externs /home/jeff/dev/emsdk/upstream/emscripten/third_party/closure-compiler/node-externs/child_process.js --js /tmp/emscripten_temp_epf1lic2/public.min.js --js_output_file tmpk1ryc9q2.cc.js --formatting PRETTY_PRINT
make: *** [Makefile:76: index.html] Error 1
```
[public.zip](https://github.com/emscripten-core/emscripten/files/10715412/public.zip)

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.