mescc: Tinycc support: Fix sizeof interesting expressions.
* module/language/c99/compiler.mes (ast->type): Return type for sizeof-expr, sizeof-type. * scaffold/tests/85-sizeof.c: Test it.
This commit is contained in:
parent
0f87473105
commit
010ab2032f
|
@ -189,16 +189,8 @@
|
|||
((char ,value) (get-type "char" info))
|
||||
((enum-ref . _) (get-type "int" info))
|
||||
((fixed ,value) (get-type "int" info))
|
||||
((sizeof-expr . _) (get-type "int" info))
|
||||
((sizeof-type . _) (get-type "int" info))
|
||||
((string ,string) (make-c-array (get-type "char" info) (1+ (string-length string))))
|
||||
((void) (get-type "void" info))
|
||||
|
||||
((type-name ,type) (ast->type type info))
|
||||
((type-name ,type (abs-declr ,pointer))
|
||||
(let ((rank (pointer->rank pointer)))
|
||||
(rank+= (ast->type type info) rank)))
|
||||
|
||||
((ident ,name) (ident->type info name))
|
||||
((tag ,name) (or (get-type o info)
|
||||
o))
|
||||
|
@ -207,6 +199,21 @@
|
|||
(let ((type (get-type name info)))
|
||||
(ast->type type info)))
|
||||
|
||||
((type-name (decl-spec-list ,type) (abs-declr (pointer . ,pointer)))
|
||||
(let ((rank (pointer->rank `(pointer ,@pointer)))
|
||||
(type (ast->type type info)))
|
||||
(rank+= type rank)))
|
||||
|
||||
((type-name ,type) (ast->type type info))
|
||||
((type-spec ,type) (ast->type type info))
|
||||
|
||||
((sizeof-expr ,expr) (ast->type expr info))
|
||||
((sizeof-type ,type) (ast->type type info))
|
||||
|
||||
((string ,string) (make-c-array (get-type "char" info) (1+ (string-length string))))
|
||||
|
||||
((decl-spec-list (type-spec ,type)) (ast->type type info))
|
||||
|
||||
((fctn-call (p-expr (ident ,name)) . _)
|
||||
(or (and=> (assoc-ref (.functions info) name) function:type)
|
||||
(get-type "int" info)))
|
||||
|
@ -1586,9 +1593,7 @@
|
|||
(_ (error "struct-field: not supported: " o)))))
|
||||
|
||||
(define (->size o)
|
||||
(cond ((and (type? o) (eq? (type:type o) 'struct))
|
||||
(apply + (map (compose ->size cdr) (struct->fields o))))
|
||||
((and (type? o) (eq? (type:type o) 'union))
|
||||
(cond ((and (type? o) (eq? (type:type o) 'union))
|
||||
(apply max (map (compose ->size cdr) (struct->fields o))))
|
||||
((type? o) (type:size o))
|
||||
((pointer? o) %pointer-size)
|
||||
|
|
|
@ -24,13 +24,31 @@ struct foo
|
|||
char buf[16];
|
||||
};
|
||||
|
||||
struct bar
|
||||
{
|
||||
struct
|
||||
{
|
||||
int x;
|
||||
int y;
|
||||
int z;
|
||||
};
|
||||
};
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
char **p;
|
||||
if (sizeof (*p) != 4) return 1;
|
||||
if (sizeof (**p) != 1) return 2;
|
||||
if (sizeof (*p) != 4)
|
||||
return 1;
|
||||
if (sizeof (**p) != 1)
|
||||
return 2;
|
||||
puts ("size: "); puts (itoa (sizeof (struct foo))); puts ("\n");
|
||||
if (sizeof (struct foo) != 20) return 3;
|
||||
if (sizeof (struct foo) != 20)
|
||||
return 3;
|
||||
struct foo f;
|
||||
if (sizeof f != 20)
|
||||
return 4;
|
||||
if (sizeof (struct bar) != 12)
|
||||
return 5;
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue