I compiled this program (fact.bitc)
--- snip ---
(bitc-version "0.10")
(import bitc.main as main)
(provide bitc.main main)

(define (factorial x:int32)
  (letrec
    ((fac (lambda (n r)
            (if (<= n 0) 1 (fac (- n 1) (* n r))))))
    (fac x 1)))

(define main.main:(fn (vector string) -> int32)
  (lambda (argv)
    (factorial 10)
    0))
--- snip ---
with
        bitcc --emit c fact.bitc
and expected to see the tail call of 'fac' compiled to a 'goto'.
But I found the following code for the 'if'-expression:
--- snip ---
  if (__t11241) {
    __t11245 = 1;
  }
  else {
    __t11252 = _16bitc_DTprelude_DT___HY_SHFN2_5int32_5int32_5int32
(_1n_SH_5int32_SH7462, 1);
    __t11256 = _16bitc_DTprelude_DT___ST_SHFN2_5int32_5int32_5int32
(_1n_SH_5int32_SH7462, _1r_SH_5int32_SH7464);
    __t11260 = (* __clArg_SH9094->_3fac_SHFN2_5int32_5int32_5int32)(__t11252, 
__t11256);
    __t11245 = __t11260;
  }
--- snip ---
and __t11245 really is returned without further operations apart from copying. 
So 'fac' is in tail position but is called. And as far as i can see 12.2 of 
the spec v0.10+ applies here.

Another bug?

-- 
MfG Marvin H. Sielenkemper
_______________________________________________
bitc-dev mailing list
[email protected]
http://www.coyotos.org/mailman/listinfo/bitc-dev

Reply via email to