diff --git a/build-aux/check-mescc.sh b/build-aux/check-mescc.sh index 2c96e0d7..1de60a9a 100755 --- a/build-aux/check-mescc.sh +++ b/build-aux/check-mescc.sh @@ -114,6 +114,7 @@ t 82-define 83-heterogenoous-init 84-struct-field-list +85-sizeof " broken="$broken diff --git a/module/language/c99/compiler.mes b/module/language/c99/compiler.mes index f88946cd..f68b77c3 100644 --- a/module/language/c99/compiler.mes +++ b/module/language/c99/compiler.mes @@ -979,23 +979,8 @@ ((ref-to ,expr) ((expr->accu* info) expr)) - ((sizeof-expr (p-expr (ident ,name))) - (let* ((type (ident->type info name)) - (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-expr ,expr) + (append-text info (wrap-as (i386:value->accu (expr->size info expr))))) ((sizeof-type (type-name (decl-spec-list (type-spec (fixed-type ,name))))) (let* ((type name) diff --git a/scaffold/tests/85-sizeof.c b/scaffold/tests/85-sizeof.c new file mode 100644 index 00000000..12d58e55 --- /dev/null +++ b/scaffold/tests/85-sizeof.c @@ -0,0 +1,27 @@ +/* -*-comment-start: "//";comment-end:""-*- + * Mes --- Maxwell Equations of Software + * Copyright © 2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +int +main () +{ + char **p; + if (sizeof (*p) != 4) return 2; + return sizeof (**p) - 1; +}