diff options
| author | 2022-08-07 06:19:21 +0200 | |
|---|---|---|
| committer | 2022-08-07 06:19:21 +0200 | |
| commit | 4a0b52a8259810ef7838eece5af030158616d5e5 (patch) | |
| tree | 42cd9d7de86986f39f1d206216fdb85b6bb43821 | |
| parent | a522d6c89067aa2b560ccab3eed9b4e00e89b100 (diff) | |
incoplete extern static
| -rw-r--r-- | bootstrap/cgen.c | 2 | ||||
| -rw-r--r-- | bootstrap/libc.hff | 3 | ||||
| -rw-r--r-- | bootstrap/parse.c | 12 |
3 files changed, 11 insertions, 6 deletions
diff --git a/bootstrap/cgen.c b/bootstrap/cgen.c index 7315876..2d83044 100644 --- a/bootstrap/cgen.c +++ b/bootstrap/cgen.c @@ -582,6 +582,8 @@ defctype(const struct type *ty, void *_) { *cname = xasprintf("__ty%d", id++); pri("typedef struct { %t *ptr; size_t len; } %s;\n", ty->child, *cname); + pri("_Static_assert(sizeof(%s) == %U);\n", *cname, (u64)ty->size); + pri("_Static_assert(__alignof__(%s) == %U);\n", *cname, (u64)ty->align); break; case TYfn: *cname = xasprintf("__ty%d", id++); diff --git a/bootstrap/libc.hff b/bootstrap/libc.hff index 58ff6b0..9b396e1 100644 --- a/bootstrap/libc.hff +++ b/bootstrap/libc.hff @@ -1,3 +1,6 @@ extern fn printf(fmt *const u8, ...) int; extern fn qsort(base *void, nmemb usize, size usize, compar *fn(l *const void, r *const void, _ *void) int) void; + +struct FILE; +extern static stderr FILE, stdin FILE; diff --git a/bootstrap/parse.c b/bootstrap/parse.c index 3233e84..f61e65b 100644 --- a/bootstrap/parse.c +++ b/bootstrap/parse.c @@ -1542,7 +1542,7 @@ typedef void (*decl_yielder_t)(struct decl *, void *); static void parsedecl(decl_yielder_t, void *, struct parser *, bool toplevel); static void -parsevardecl(decl_yielder_t yield, void *yarg, struct parser *P) { +parsevardecl(decl_yielder_t yield, void *yarg, struct parser *P, bool let, bool externp) { struct tok tok; do { @@ -1595,9 +1595,9 @@ parsevardecl(decl_yielder_t yield, void *yarg, struct parser *P) { ty = interntype(ty2); } - if (!completetype(ty)) - fatal(P, tok.span, "let `%s': variable type %t is incomplete", - name, ty); + if (!completetype(ty) && !(!let && externp)) + fatal(P, tok.span, "%s `%s': variable type %t is incomplete", + let ? "let" : "static", name, ty); if (konst) ty = constify(ty); @@ -1641,7 +1641,7 @@ pstlet(stmt_yielder_t yield, void *yarg, struct parser *P) { struct letstmtyarg arg = { P, yarg, yield }; - parsevardecl(letstmtyield, &arg, P); + parsevardecl(letstmtyield, &arg, P, 1, 0); } static struct stmt @@ -2427,7 +2427,7 @@ parsedecl(decl_yielder_t yield, void *yarg, struct parser *P, bool toplevel) { } else if (lexmatch(P, &tok, TKkw_static)) { parsevardecl(staticvaryield, &(struct staticvaryarg) { P, externp, toplevel, tok.span, yield, yarg - }, P); + }, P, 0, externp); return; } else if (lexmatch(P, &tok, TKkw_typedef)) { if (externp) fatal(P, tok.span, "typedef cannot be `extern'"); |