mescc: Handle sizeof expression.

* module/language/c99/compiler.mes (expr->accu): Handle sizeof
  expression.
* scaffold/tests/85-sizeof.c: Test it.
This commit is contained in:
Jan Nieuwenhuizen 2018-05-05 00:59:31 +02:00
parent 2311b8bd20
commit 1b8d59fd0f
No known key found for this signature in database
GPG key ID: F3C1A0D9C1D65273
3 changed files with 30 additions and 17 deletions

View file

@ -114,6 +114,7 @@ t
82-define 82-define
83-heterogenoous-init 83-heterogenoous-init
84-struct-field-list 84-struct-field-list
85-sizeof
" "
broken="$broken broken="$broken

View file

@ -979,23 +979,8 @@
((ref-to ,expr) ((ref-to ,expr)
((expr->accu* info) expr)) ((expr->accu* info) expr))
((sizeof-expr (p-expr (ident ,name))) ((sizeof-expr ,expr)
(let* ((type (ident->type info name)) (append-text info (wrap-as (i386:value->accu (expr->size info expr)))))
(size (ast-type->size info type)))
(append-text info (wrap-as (i386:value->accu size)))))
((sizeof-expr (p-expr (string ,string)))
(append-text info (wrap-as (i386:value->accu (1+ (string-length string))))))
((sizeof-expr (i-sel (ident ,field) (p-expr (ident ,struct))))
(let* ((type (ident->type info struct))
(size (field-size info type field)))
(append-text info (wrap-as (i386:value->accu size)))))
((sizeof-expr (d-sel (ident ,field) (p-expr (ident ,struct))))
(let* ((type (ident->type info struct))
(size (field-size info type field)))
(append-text info (wrap-as (i386:value->accu size)))))
((sizeof-type (type-name (decl-spec-list (type-spec (fixed-type ,name))))) ((sizeof-type (type-name (decl-spec-list (type-spec (fixed-type ,name)))))
(let* ((type name) (let* ((type name)

View file

@ -0,0 +1,27 @@
/* -*-comment-start: "//";comment-end:""-*-
* Mes --- Maxwell Equations of Software
* Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of Mes.
*
* Mes is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* Mes is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
*/
int
main ()
{
char **p;
if (sizeof (*p) != 4) return 2;
return sizeof (**p) - 1;
}