--- /dev/null
+3 =>
+const int i;
+2 => const int y;
+switch(i) {
+ case 1: <<<1>>>;break;
+ case 3: <<<3>>>;break;
+ case y: <<<2>>>;break;
+ default:
+ <<<"0">>>;
+}
+<<<y>>>;
--- /dev/null
+fun void test(C cc) { <<< cc.test(2) >>>; }
+
+fun void test(C cc, int i) { <<<1>>>; <<<cc.test(i, i)>>>; }
+
+
+class C {
+ template<~A~>
+ fun int test(A a) { <<<" A ", a>>>; }
+ template<~A~>
+ fun int test(A a, int i) { <<<" ", a >>>; }
+ template<~A~>
+ fun int test(A a, int i, int j) { <<<a>>>; }
+}
+class D extends C {
+ template<~A~>
+ fun int test(A a, int i) { <<<this, " extent ", a, __func__>>>; }
+}
+class E extends D {
+ template<~A~>
+ fun int test(A a, int i) { <<<this, " Extent ", a, __func__>>>; }
+}
+
+
+<<<C c>>>;
+<<<D d>>>;
+<<<E e>>>;
+
+test(c);
+test(d);
+test(e);
+test(c,1);
+test(d,2);
+test(e,3);
+<<<test>>>;
+
+
+c.test(1);
+c.test(123,1);
+c.test(1, 2, 3);
+
+d.test(2);
+d.test(123,3);
+d.test(2, 2, 3);
+
+e.test(3);
+e.test(123,3);
+e.test(3, 2, 3);
+
+fun void _test() {<<<"test">>>; }
+fun void test() { _test(); }
+test();
+
while((e = switch_expget(emit->env)))
CHECK_BB(emit_exp(emit, e, 0))
*instr = emit_add_instr(emit, SwitchIni);
- (*instr)->m_val = (m_uint)switch_vec(emit->env);
} else {
const Instr instr = emit_add_instr(emit, RegPushImm);
instr->m_val = (m_uint)switch_map(emit->env);
ANN static void emit_switch_map(const Instr instr, const Map map) {
const Map m = new_map();
for(m_uint i = map_size(map) + 1; --i;)
- map_set(m, VKEY(map, i), VVAL(map, i -1));
+ map_set(m, VKEY(map, i-1), VVAL(map, i -1));
instr->m_val2 = (m_uint)m;
}
instr->m_val = switch_idx(emit->env) ?: emit_code_size(emit);
if(push) {
emit_switch_map(push, (Map)instr->m_val2);
+ (push)->m_val = (m_uint)switch_vec(emit->env);
}
switch_end(emit->env);
pop_vector(&emit->code->stack_break, emit_code_size(emit));
const Vector v = (Vector)instr->m_val;
const m_uint size = vector_size(v);
const Map m = (Map)instr->m_val2;
- POP_REG(shred, SZ_INT * (size - 1));
+ POP_REG(shred, SZ_INT * (size-1));
for(m_uint i = 0; i < size; ++i)
map_set(m, *(vtype*)REG((i-1) * SZ_INT), vector_at(v, i));
*(Map*)REG(-SZ_INT) = m;