mescc: Tinycc support: bugfix for char **pp = *p.

* module/language/c99/compiler.mes (ptr-declr->pointer): Grok ***.
  (decl->info): Bugfix for char **pp = *p, cleanup.
* mlibc/libc-mes.c (getenv): Update for bugfix.
* scaffold/tests/23-pointer.c (test): Test it.
This commit is contained in:
Jan Nieuwenhuizen 2017-07-25 11:11:26 +02:00
parent 91f9817a44
commit 7e795763f3
3 changed files with 18 additions and 24 deletions

View file

@ -338,7 +338,7 @@ char **g_environment;
char * char *
getenv (char const* s) getenv (char const* s)
{ {
char **p = *g_environment; char **p = g_environment;
int length = strlen (s); int length = strlen (s);
while (*p) while (*p)
{ {

View file

@ -1530,6 +1530,7 @@
(pmatch o (pmatch o
((pointer) 1) ((pointer) 1)
((pointer (pointer)) 2) ((pointer (pointer)) 2)
((pointer (pointer (pointer))) 3)
(_ (error "ptr-declr->pointer unsupported: " o)))) (_ (error "ptr-declr->pointer unsupported: " o))))
(define (init-declr->name o) (define (init-declr->name o)
@ -1747,26 +1748,6 @@
(clone info #:locals (add-local locals name type 0)) (clone info #:locals (add-local locals name type 0))
(clone info #:globals (append globals (list (ident->global-entry name type 0 0))))))) (clone info #:globals (append globals (list (ident->global-entry name type 0 0)))))))
;; char **p;
((decl (decl-spec-list (type-spec (fixed-type ,type))) (init-declr-list (init-declr (ptr-declr (pointer (pointer)) (ident ,name)))))
(if (.function info)
(let ((locals (add-local locals name type 2)))
(clone info #:locals locals))
(let ((globals (append globals (list (ident->global-entry name type 2 0)))))
(clone info #:globals globals))))
;; char **p = *x;
((decl (decl-spec-list (type-spec (fixed-type ,type))) (init-declr-list (init-declr (ptr-declr (pointer (pointer)) (ident ,name)) (initzer (de-ref (p-expr (ident ,value)))))))
(let ((type (decl->ast-type type))
(info (append-text info (ast->comment o))))
(if (.function info)
(let* ((locals (add-local locals name type 2))
(info (clone info #:locals locals)))
(append-text info (append ((ident-address->accu info) value)
(wrap-as (i386:mem->accu))
((accu->ident info) name))))
(error "TODO" o))))
;; struct foo bar[2]; ;; struct foo bar[2];
;; char arena[20000]; ;; char arena[20000];
((decl (decl-spec-list (type-spec ,type)) (init-declr-list (init-declr (array-of (ident ,name) ,count)))) ((decl (decl-spec-list (type-spec ,type)) (init-declr-list (init-declr (array-of (ident ,name) ,count))))

View file

@ -28,10 +28,23 @@ test ()
{ {
if (*g_chars != 'X') return 1; if (*g_chars != 'X') return 1;
g_arena[0] = 'A'; g_arena[0] = 'A';
if (*g_chars != 'A') return 1; if (*g_chars != 'A') return 2;
char *x = g_arena; char *x = g_arena;
if (*x++ != 'A') return 1; if (*x++ != 'A') return 3;
*x++ = 'C'; *x++ = 'C';
if (g_chars[1] != 'C') return 1; if (g_chars[1] != 'C') return 4;
char **pp = &x;
if (**pp != 'X') return 5;
char *p = *pp;
if (*p != 'X') return 6;
char ***ppp = &pp;
//if (***ppp != 'X') return 7;
char **pp2 = *ppp;
if (**pp2 != 'X') return 8;
return 0; return 0;
} }