-
Notifications
You must be signed in to change notification settings - Fork 3.5k
Open
Labels
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:
emscripten::register_type<Component>("Component", "{name: string, [key: string]: any}");
emscripten::register_type<ComponentNames>(
"ComponentNames<T extends Component[]>", "T extends [infer First, ...infer Rest] ? First[\"name\"] | ComponentNames<Rest> : never"
);
emscripten::register_type<ComponentForName>(
"ComponentForName<T extends Component[], N extends string>",
"T extends [infer First, ...infer Rest] ? First[\"name\"] extends N ? First : ComponentForName<Rest, N> : never;"
);
emscripten::register_type<ZZ>(
"ZipperResult<T extends Component[]>", "{ [K in ComponentNames<T>]: ComponentForName<T, K extends string ? K : never>; };"
);
emscripten::register_type<ZipperOutput>("ZipperResult<T>");
// Class definition...
.function("getZipper<T extends Component[]>", &Registry::get_zipper)The same thing happens with a function such as:
int add(int a, int b) {
return a + b;
}
// yes this doesn't make sens but this is an example
emscripten::function("add<N>", &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