emscripten-core / emscripten-core/emscripten
em++ silently fails if function name contains a template
- Dominant language
- C++
- Stars
- 27.6k
- Forks
- 3.6k
- Avg merge
- 1d 1h
- Merged PRs (30d)
- 105
Description
Hi, I am currently experimenting with em++ and found out that when a function (see following code) name contains a template the compilation will succeed but you cannot access the function. Javascript will say that the symbol doesn't exists. Embind will generate the right types but the function is unreachable. Is it intended that it is not reachable ? Is it intended to fail silently ?
The relevant code:
```cpp
emscripten::register_type("Component", "{name: string, [key: string]: any}");
emscripten::register_type(
"ComponentNames", "T extends [infer First, ...infer Rest] ? First[\"name\"] | ComponentNames : never"
);
emscripten::register_type(
"ComponentForName",
"T extends [infer First, ...infer Rest] ? First[\"name\"] extends N ? First : ComponentForName : never;"
);
emscripten::register_type(
"ZipperResult", "{ [K in ComponentNames]: ComponentForName; };"
);
emscripten::register_type("ZipperResult");
// Class definition...
.function("getZipper", &Registry::get_zipper)
```
The same thing happens with a function such as:
```cpp
int add(int a, int b) {
return a + b;
}
// yes this doesn't make sens but this is an example
emscripten::function("add", &add);
```
**Version of emscripten/emsdk:**
```
emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 4.0.19 (08e2de1031913e4ba7963b1c56f35f036a7d4d56)
clang version 22.0.0git (https:/github.com/llvm/llvm-project 12f392cff10fcc70b4ec4f01ab386922742e9136)
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: /home/fexkoser/dev/emsdk/upstream/bin
```
**Full link command and output with `-v` appended:**
```
em++ wasm/SparseArray.o wasm/Entity.o wasm/Utils.o wasm/Registry.o -O3 --no-entry --bind -sNO_DISABLE_EXCEPTION_CATCHING -sEXPORT_EXCEPTION_HANDLING_HELPERS -v -s MODULARIZE=1 -s EXPORT_ES6=1 -s ENVIRONMENT=web --emit-tsd libecs.d.ts -o lib/libecs.js
/home/fexkoser/dev/emsdk/upstream/bin/clang --version
/home/fexkoser/dev/emsdk/upstream/bin/wasm-ld -o lib/libecs.wasm wasm/SparseArray.o wasm/Entity.o wasm/Utils.o wasm/Registry.o -lembind-rtti -L/home/fexkoser/dev/emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten -L/home/fexkoser/dev/emsdk/upstream/emscripten/src/lib -lGL-getprocaddr -lal -lhtml5 -lstubs -lnoexit -lc -ldlmalloc -lcompiler_rt -lc++ -lc++abi -lsockets -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-cxx-exceptions -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr /tmp/tmpbhxqv5tplibemscripten_js_symbols.so --strip-debug --export=_emscripten_stack_alloc --export=__getTypeName --export=__cxa_can_catch --export=__cxa_increment_exception_refcount --export=__cxa_decrement_exception_refcount --export=setThrew --export=__cxa_free_exception --export=__wasm_call_ctors --export=emscripten_stack_get_current --export=_emscripten_stack_restore --export=__get_exception_message --export=free --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-table -z stack-size=65536 --no-growable-memory --initial-heap=16777216 --no-entry --table-base=1 --global-base=1024
/home/fexkoser/dev/emsdk/upstream/bin/llvm-objcopy lib/libecs.wasm lib/libecs.wasm '--remove-section=.debug*' --remove-section=producers --remove-section=name
/home/fexkoser/dev/emsdk/node/22.16.0_64bit/bin/node /home/fexkoser/dev/emsdk/upstream/emscripten/tools/compiler.mjs -
/home/fexkoser/dev/emsdk/node/22.16.0_64bit/bin/node /home/fexkoser/dev/emsdk/upstream/emscripten/tools/compiler.mjs -
/home/fexkoser/dev/emsdk/node/22.16.0_64bit/bin/node /tmp/emscripten_temp_x1yssint/tsgen.js /tmp/emscripten_temp_x1yssint/embind_generated_output.js
/home/fexkoser/dev/emsdk/upstream/bin/wasm-opt --strip-target-features --post-emscripten -O3 --low-memory-unused --zero-filled-memory --pass-arg=directize-initial-contents-immutable --no-stack-ir lib/libecs.wasm -o lib/libecs.wasm --mvp-features --enable-bulk-memory --enable-bulk-memory-opt --enable-call-indirect-overlong --enable-multivalue --enable-mutable-globals --enable-nontrapping-float-to-int --enable-reference-types --enable-sign-ext
/home/fexkoser/dev/emsdk/node/22.16.0_64bit/bin/node /home/fexkoser/dev/emsdk/upstream/emscripten/tools/acorn-optimizer.mjs /tmp/emscripten_temp_x1yssint/libecs.js AJSDCE --minify-whitespace --export-es6 -o /tmp/emscripten_temp_x1yssint/libecs.jso1.js
/home/fexkoser/dev/emsdk/node/22.16.0_64bit/bin/node /home/fexkoser/dev/emsdk/upstream/emscripten/tools/acorn-optimizer.mjs /tmp/emcc_acorn_info_dga6tfir.js emitDCEGraph --no-print --export-es6
/home/fexkoser/dev/emsdk/upstream/bin/wasm-metadce --graph-file=/tmp/emcc_dce_graph_vs_5wk_8.json lib/libecs.wasm -o lib/libecs.wasm --mvp-features --enable-bulk-memory --enable-bulk-memory-opt --enable-call-indirect-overlong --enable-multivalue --enable-mutable-globals --enable-nontrapping-float-to-int --enable-reference-types --enable-sign-ext
/home/fexkoser/dev/emsdk/node/22.16.0_64bit/bin/node /home/fexkoser/dev/emsdk/upstream/emscripten/tools/acorn-optimizer.mjs /tmp/emcc_acorn_info_2rq8jhen.js applyDCEGraphRemovals --minify-whitespace --export-es6 -o /tmp/emscripten_temp_x1yssint/libecs.jso2.js
/home/fexkoser/dev/emsdk/node/22.16.0_64bit/bin/node /home/fexkoser/dev/emsdk/upstream/emscripten/tools/acorn-optimizer.mjs /tmp/emscripten_temp_x1yssint/libecs.jso2.js AJSDCE --minify-whitespace --export-es6 -o /tmp/emscripten_temp_x1yssint/libecs.jso3.js
/home/fexkoser/dev/emsdk/upstream/bin/wasm-opt --minify-imports-and-exports-and-modules --optimize-level=3 --shrink-level=0 --optimize-stack-ir lib/libecs.wasm -o lib/libecs.wasm --mvp-features --enable-bulk-memory --enable-bulk-memory-opt --enable-call-indirect-overlong --enable-multivalue --enable-mutable-globals --enable-nontrapping-float-to-int --enable-reference-types --enable-sign-ext
/home/fexkoser/dev/emsdk/node/22.16.0_64bit/bin/node /home/fexkoser/dev/emsdk/upstream/emscripten/tools/acorn-optimizer.mjs /tmp/emcc_acorn_info_gkis97g3.js applyImportAndExportNameChanges --minify-whitespace --export-es6 -o /tmp/emscripten_temp_x1yssint/libecs.jso4.js
/home/fexkoser/dev/emsdk/node/22.16.0_64bit/bin/node /home/fexkoser/dev/emsdk/upstream/emscripten/tools/preprocessor.mjs - modularize.js --expand-macros
/home/fexkoser/dev/emsdk/node/22.16.0_64bit/bin/node /home/fexkoser/dev/emsdk/upstream/emscripten/tools/acorn-optimizer.mjs /tmp/tmpe20c6_10.js --minify-whitespace --export-es6 -o /tmp/tmpe20c6_10.jso5.js
```
Contributor guide
Assessment
This issue has not been assessed yet.