Files
ww/test/wcc/data/r949_xmod_fnptr_const_table/case.ww
Hojun-Cho a4839d0176 test: port 915/949 module-global access carriers to corpus fixtures
915_arr_module_index_run.c -> r915_arr_mod_idx0 (run), r915_arr_mod_
  idx2 (run-exit 1), r915_arr_mod_idx4 (run-exit 6); the single-file
  rows were already owned by r915_arr_local_* + test-data-byteid.
949_xmod_fnptr_const_run.c -> r949_xmod_fnptr_const_table (run),
  r949_xmod_fnptr_wrong_sig, r949_xmod_fnptr_nonfn_dotted (error
  'not assignable' both stages).

The 915 module rows upgrade from 994-delegated to per-fixture cs==ww
byte identity; 949's 2-file -I tree was not load-bearing — inline
packages exercise the same N_DOT &mod.fn mangle (mafn(leaf, module)).
2026-08-08 14:33:23 +09:00

24 lines
783 B
Plaintext

//ww:run
// migrated from test/wcc/949_xmod_fnptr_const_run.c: cross-module &cc.fn inside const table + scalar emits the &fn->DATAR reloc (#124); DISTINCT predicates catch a swapped reloc.
package cc;
export fn isa(c: rune) bool = { return c == 'a'; };
export fn isz(c: rune) bool = { return c == 'z'; };
package main;
import cc;
const tbl: [](str, *fn(c: rune) bool) = [(":a", &cc.isa), (":z", &cc.isz)];
const pf: *fn(c: rune) bool = &cc.isa;
export fn main() i32 = {
if (len(tbl) != 2) { return 10; };
let e0 = tbl[0];
let e1 = tbl[1];
let f0 = e0.1;
let f1 = e1.1;
if (!(*f0)('a')) { return 1; };
if ((*f0)('z')) { return 2; };
if (!(*f1)('z')) { return 3; };
if ((*f1)('a')) { return 4; };
if (!(*pf)('a')) { return 5; };
if ((*pf)('z')) { return 6; };
return 0;
};