Skip to content

em++ silently fails if function name contains a template #25757

@MartinFillon

Description

@MartinFillon

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions