sunder icon indicating copy to clipboard operation
sunder copied to clipboard

Remove dependence on GNU C statement expressions in generated C

Open ashn-dot-dev opened this issue 10 months ago • 0 comments

Currently, generated C relies on GNU C statement expressions for non-trivial expressions.

~/test$ cat test.sunder 
func main() void {
    var x = 1s;
    var y = 2s;
    var _ = x + y;
}
~/test$ sunder-compile -k test.sunder
~/test$ cat a.out.tmp.c
#include "sys.h"

_Static_assert(sizeof(__sunder_bool) == 1, "sizeof(bool)");
_Static_assert(_Alignof(__sunder_bool) == 1, "alignof(bool)");
_Static_assert(sizeof(__sunder_byte) == 1, "sizeof(byte)");
_Static_assert(_Alignof(__sunder_byte) == 1, "alignof(byte)");
_Static_assert(sizeof(__sunder_u8) == 1, "sizeof(u8)");
_Static_assert(_Alignof(__sunder_u8) == 1, "alignof(u8)");
_Static_assert(sizeof(__sunder_s8) == 1, "sizeof(s8)");
_Static_assert(_Alignof(__sunder_s8) == 1, "alignof(s8)");
_Static_assert(sizeof(__sunder_u16) == 2, "sizeof(u16)");
_Static_assert(_Alignof(__sunder_u16) == 2, "alignof(u16)");
_Static_assert(sizeof(__sunder_s16) == 2, "sizeof(s16)");
_Static_assert(_Alignof(__sunder_s16) == 2, "alignof(s16)");
_Static_assert(sizeof(__sunder_u32) == 4, "sizeof(u32)");
_Static_assert(_Alignof(__sunder_u32) == 4, "alignof(u32)");
_Static_assert(sizeof(__sunder_s32) == 4, "sizeof(s32)");
_Static_assert(_Alignof(__sunder_s32) == 4, "alignof(s32)");
_Static_assert(sizeof(__sunder_u64) == 8, "sizeof(u64)");
_Static_assert(_Alignof(__sunder_u64) == 8, "alignof(u64)");
_Static_assert(sizeof(__sunder_s64) == 8, "sizeof(s64)");
_Static_assert(_Alignof(__sunder_s64) == 8, "alignof(s64)");
_Static_assert(sizeof(__sunder_usize) == 8, "sizeof(usize)");
_Static_assert(_Alignof(__sunder_usize) == 8, "alignof(usize)");
_Static_assert(sizeof(__sunder_ssize) == 8, "sizeof(ssize)");
_Static_assert(_Alignof(__sunder_ssize) == 8, "alignof(ssize)");
_Static_assert(sizeof(__sunder_f32) == 4, "sizeof(f32)");
_Static_assert(_Alignof(__sunder_f32) == 4, "alignof(f32)");
_Static_assert(sizeof(__sunder_f64) == 8, "sizeof(f64)");
_Static_assert(_Alignof(__sunder_f64) == 8, "alignof(f64)");
typedef __sunder_byte* __sunder_pointer_to_byte; // *byte
_Static_assert(sizeof(__sunder_pointer_to_byte) == 8, "sizeof(*byte)");
_Static_assert(_Alignof(__sunder_pointer_to_byte) == 8, "alignof(*byte)");
typedef struct {__sunder_pointer_to_byte start; __sunder_usize count;} __sunder_slice_of_byte; // []byte
_Static_assert(sizeof(__sunder_slice_of_byte) == 16, "sizeof([]byte)");
_Static_assert(_Alignof(__sunder_slice_of_byte) == 8, "alignof([]byte)");
typedef __sunder_void (*__sunder_func__returning_void)(void); // func() void
_Static_assert(sizeof(__sunder_func__returning_void) == 8, "sizeof(func() void)");
_Static_assert(_Alignof(__sunder_func__returning_void) == 8, "alignof(func() void)");

__sunder_void __sunder_main(void);
__sunder_void
__sunder_main(void)
{
    // var return: void
    int __sunder_return = /* zero-sized local */0;
    // var x: ssize
    __sunder_ssize __sunder_local_0_x = /* uninit */0;
    // var y: ssize
    __sunder_ssize __sunder_local_1_y = /* uninit */0;
    // var _: ssize
    __sunder_ssize __sunder_local_2__ = /* uninit */0;
    *((&__sunder_local_0_x)) = (__sunder_ssize)1LL;
    *((&__sunder_local_1_y)) = (__sunder_ssize)2LL;
    *((&__sunder_local_2__)) = ({__sunder_ssize __sunder___lhs = __sunder_local_0_x; __sunder_ssize __sunder___rhs = __sunder_local_1_y; __sunder___add___sunder_ssize(__sunder___lhs, __sunder___rhs);});
}

int
main(int argc, char** argv, char** envp)
{
    sys_argc = argc;
    sys_argv = argv;
    sys_envp = envp;
    __sunder_main();
    return 0;
}

ashn-dot-dev avatar May 02 '24 16:05 ashn-dot-dev