lately, i got interested in ats2. i wrote some trivia code and stumbled upon the following:
i would say
- [bp1.dats] output is wrong?
- [bp2.dats] should not compile, but does?
- [bp3.dats] is correct (this was my "fix" for bp1.dats)?
is it because of the actual template params not beeing used?? is this wanted behaviour or a bug?
especially bp2.dats looks extremely suspicous.
bp1.dats:
// patscc -DATS_MEMALLOC_LIBC -Ofast -flto -o bp bp.dats
#include "share/atspre_staload.hats"
staload UN = "prelude/SATS/unsafe.sats"
absvt@ype be = ptr
absvt@ype le = ptr
typedef u16 = uint16
extern fun{env:vt0p} rd16 ( env: &env >> _ ) : u16
implmnt{be} rd16 ( env ) = $UN.cast{u16}(23)
implmnt{le} rd16 ( env ) = $UN.cast{u16}(42)
assume be = @{a=int}
assume le = @{b=int}
implmnt main0 ( argc, argv ) : void =
let val odd = argc % 2 = 0
var env_be: be = @{a=0}
var env_le: le = @{b=0}
in
if odd
then (
print!("be: ")
; println!(rd16(env_be))
)
else (
print!("le: ")
; println!(rd16(env_le))
)
end
$ patscc -DATS_MEMALLOC_LIBC -Ofast -flto -o bp1 bp1.dats
$ ./bp1 x
be: 42
$ ./bp1 x y
le: 42
bp2.dats:
// patscc -DATS_MEMALLOC_LIBC -Ofast -flto -o bp bp.dats
#include "share/atspre_staload.hats"
staload UN = "prelude/SATS/unsafe.sats"
absvt@ype be = ptr
absvt@ype le = ptr
typedef u16 = uint16
extern fun{env:vt0p} rd16 ( env: &env >> _ ) : u16
assume be = @{a=int}
assume le = @{b=int}
implmnt main0 ( argc, argv ) : void =
let val odd = argc % 2 = 0
var env_be: be = @{a=0}
var env_le: le = @{b=0}
in
if odd
then let implmnt{be} rd16 ( env ) = $UN.cast{u16}(23) in (
print!("be: ")
; println!(rd16(env_be))
) end
else let implmnt{be} rd16 ( env ) = $UN.cast{u16}(42) in (
print!("le: ")
; println!(rd16(env_le))
) end
end
$ patscc -DATS_MEMALLOC_LIBC -Ofast -flto -o bp2 bp2.dats
$ ./bp2 x
be: 23
$ ./bp2 x y
le: 42
bp3.dats
// patscc -DATS_MEMALLOC_LIBC -Ofast -flto -o bp bp.dats
#include "share/atspre_staload.hats"
staload UN = "prelude/SATS/unsafe.sats"
absvt@ype be = ptr
absvt@ype le = ptr
typedef u16 = uint16
extern fun{env:vt0p} rd16 ( env: &env >> _ ) : u16
assume be = @{a=int}
assume le = @{b=int}
implmnt main0 ( argc, argv ) : void =
let val odd = argc % 2 = 0
var env_be: be = @{a=0}
var env_le: le = @{b=0}
in
if odd
then let implmnt{be} rd16 ( env ) = $UN.cast{u16}(23) in (
print!("be: ")
; println!(rd16(env_be))
) end
else let implmnt{le} rd16 ( env ) = $UN.cast{u16}(42) in (
print!("le: ")
; println!(rd16(env_le))
) end
end
$ patscc -DATS_MEMALLOC_LIBC -Ofast -flto -o bp3 bp3.dats
$ ./bp3 x
be: 23
$ ./bp3 x y
le: 42