mescc: Support heterogeneous variable init.

* module/language/c99/compiler.mes (decl->info): Support heterogeneous
  variable init.
* scaffold/tests/83-heterogenoous-init.c: Test it.
* build-aux/check-mescc.sh (tests): Add it.
This commit is contained in:
Jan Nieuwenhuizen 2018-05-04 22:38:01 +02:00
parent 5fba6d1a70
commit 13edbaf4d8
No known key found for this signature in database
GPG key ID: F3C1A0D9C1D65273
3 changed files with 33 additions and 11 deletions

View file

@ -112,6 +112,7 @@ t
80-setjmp 80-setjmp
81-qsort 81-qsort
82-define 82-define
83-heterogenoous-init
" "
broken="$broken broken="$broken

View file

@ -2131,17 +2131,8 @@
(globals (append globals (list global)))) (globals (append globals (list global))))
(clone info #:globals globals))))) (clone info #:globals globals)))))
;; int i = 0, j = 0; ((decl (decl-spec-list (type-spec ,type)) (init-declr-list . ,inits))
((decl (decl-spec-list (type-spec ,type)) (init-declr-list (init-declr (ident ,name) . ,initzer) . ,rest)) (let loop ((inits inits) (info info))
(let loop ((inits `((init-declr (ident ,name) ,@initzer) ,@rest)) (info info))
(if (null? inits) info
(loop (cdr inits)
((decl->info info)
`(decl (decl-spec-list (type-spec ,type)) (init-declr-list ,(car inits))))))))
;; int *i = 0, j ..;
((decl (decl-spec-list (type-spec ,type)) (init-declr-list (init-declr (ptr-declr ,pointer (ident ,name)) . ,initzer) . ,rest))
(let loop ((inits `((init-declr (ptr-declr ,pointer (ident ,name)) ,@initzer) ,@rest)) (info info))
(if (null? inits) info (if (null? inits) info
(loop (cdr inits) (loop (cdr inits)
((decl->info info) ((decl->info info)

View file

@ -0,0 +1,30 @@
/* -*-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 foo[2], *bar;
int
main ()
{
bar = foo+1;
foo[0] = 1;
*bar = 1;
return *foo - bar[0];
}