diff options
author | Leo Tenenbaum <pommicket@gmail.com> | 2019-12-27 11:49:46 -0500 |
---|---|---|
committer | Leo Tenenbaum <pommicket@gmail.com> | 2019-12-27 11:50:36 -0500 |
commit | 1b12d3410e0426f3772564ff8439dd0c5f9a7186 (patch) | |
tree | 7fc2a4be38ce0d5827cbfb31b6c528e42b132f4a | |
parent | ba8e7628a2e0e48ac89a4bd734edde0c0dfc3929 (diff) |
fixed error reporting; more export
-rw-r--r-- | err.c | 2 | ||||
-rw-r--r-- | main.c | 7 | ||||
-rw-r--r-- | package.c (renamed from export.c) | 72 | ||||
-rw-r--r-- | parse.c | 3 | ||||
-rw-r--r-- | test.toc | 2 | ||||
-rw-r--r-- | toc.c | 2 | ||||
-rw-r--r-- | types.c | 3 |
7 files changed, 34 insertions, 57 deletions
@@ -86,7 +86,7 @@ static void err_print_location_text(Location where) { end = strchr(text, '\0'); assert(end); err_fprint("\there: --> "); - if (!has_newline) + if (!text[0]) err_fprint("<end of file>"); else err_fwrite(text, 1, (size_t)(end - text)); @@ -117,10 +117,8 @@ int main(int argc, char **argv) { err_fprint(TEXT_IMPORTANT("Errors occured while parsing.\n")); return EXIT_FAILURE; } -#if 0 - fprint_parsed_file(stdout, &f); - printf("\n\n-----\n\n"); -#endif + /* fprint_parsed_file(stdout, &f); */ + /* printf("\n\n-----\n\n"); */ tokr_free(&t); @@ -138,6 +136,7 @@ int main(int argc, char **argv) { return false; if (!types_file(&tr, &f)) { + /* TODO(eventually): fix this if the error occured while exporting something */ err_fprint(TEXT_IMPORTANT("Errors occured while determining types.\n")); return EXIT_FAILURE; } @@ -36,56 +36,29 @@ static void export_ident(Exporter *ex, Identifier i) { export_u64(ex, i->id); } -static inline bool type_contains_reference(Type *type) { - assert(type->flags & TYPE_IS_RESOLVED); - switch (type->kind) { - case TYPE_PTR: - case TYPE_SLICE: - case TYPE_FN: - return true; - case TYPE_TUPLE: - arr_foreach(type->tuple, Type, sub) - if (type_contains_reference(sub)) - return true; - return false; - case TYPE_STRUCT: - arr_foreach(type->struc->fields, Field, field) { - if (type_contains_reference(field->type)) - return true; - } - return false; - case TYPE_ARR: - return type_contains_reference(type->arr.of); - case TYPE_BUILTIN: - case TYPE_VOID: - case TYPE_UNKNOWN: - case TYPE_TYPE: - return false; - case TYPE_EXPR: break; - } - assert(0); - return false; -} - static void export_type(Exporter *ex, Type *type) { } -static void export_val(Exporter *ex, Value val, Type *type) { - assert(!type_contains_reference(type)); +static bool export_val(Exporter *ex, Value val, Type *type, Location where) { export_type(ex, type); switch (type->kind) { case TYPE_VOID: break; case TYPE_TYPE: export_type(ex, val.type); break; + case TYPE_PTR: + err_print(where, "Cannot export pointer."); + return false; case TYPE_UNKNOWN: case TYPE_EXPR: assert(0); - break; + return false; } + return true; } -static void export_expr(Exporter *ex, Expression *e) { +static bool export_expr(Exporter *ex, Expression *e) { + return true; } enum { @@ -94,12 +67,17 @@ enum { DECL_EXPORT_VAL }; -static void export_decl(Exporter *ex, Declaration *d) { +static bool export_decl(Exporter *ex, Declaration *d) { if (d->type.kind == TYPE_UNKNOWN) { - warn_print(d->where, "Can't export declaration of unknown type."); - return; + err_print(d->where, "Can't export declaration of unknown type."); + return false; } export_location(ex, d->where); + size_t n_idents = arr_len(d->idents); + if (n_idents > 65535) { + err_print(d->where, "Too many identifiers in one declaration (the maximum is 65535)."); + return false; + } export_u16(ex, (U16)arr_len(d->idents)); arr_foreach(d->idents, Identifier, ident) { export_ident(ex, *ident); @@ -111,19 +89,19 @@ static void export_decl(Exporter *ex, Declaration *d) { export_u8(ex, constness); U8 expr_kind = 0; - if (d->flags & DECL_HAS_EXPR) expr_kind = DECL_EXPORT_EXPR; - if (d->flags & DECL_FOUND_VAL) { - if (type_contains_reference(&d->type)) - expr_kind = DECL_EXPORT_EXPR; - else - expr_kind = DECL_EXPORT_VAL; - } + if (d->flags & DECL_HAS_EXPR) + expr_kind = DECL_EXPORT_EXPR; + if (d->flags & DECL_FOUND_VAL) + expr_kind = DECL_EXPORT_VAL; export_u8(ex, expr_kind); if (expr_kind == DECL_EXPORT_EXPR) { - export_expr(ex, &d->expr); + if (!export_expr(ex, &d->expr)) + return false; } else if (expr_kind == DECL_EXPORT_VAL) { - export_val(ex, d->val, &d->type); + if (!export_val(ex, d->val, &d->type, d->where)) + return false; } + return true; } @@ -1348,6 +1348,7 @@ static bool parse_expr(Parser *p, Expression *e, Token *end) { ++t->token; if (!token_is_kw(t->token, KW_LPAREN)) { err_print(t->token->where, "Expected ( to follow new."); + return false; } ++t->token; if (!parse_type(p, &e->new.type)) return false; @@ -1968,7 +1969,7 @@ static bool parse_file(Parser *p, ParsedFile *f) { return ret; } -#define PARSE_PRINT_LOCATION(l) /* fprintf(out, "[l%lu]", (unsigned long)(l).line); */ +#define PARSE_PRINT_LOCATION(l) /* fprintf(out, "[%lu:%lu]", (unsigned long)(l).line, (unsigned long)(l).pos); */ static void fprint_expr(FILE *out, Expression *e); static void fprint_stmt(FILE *out, Statement *s); @@ -1,2 +1,2 @@ #export foo ::= 7; -asdf, dsajkhf, sadjkfh ::= 5;
\ No newline at end of file +asdf, dsajkhf, sadjkfh ::= 5; @@ -42,7 +42,7 @@ static void print_val(Value v, Type *t); #include "scope.c" #include "eval.c" #include "infer.c" -#include "export.c" +#include "package.c" #include "types.c" static bool cgen_decls_file(CGenerator *g, ParsedFile *f); static bool typedefs_file(CGenerator *g, ParsedFile *f); @@ -1525,7 +1525,6 @@ static bool types_expr(Typer *tr, Expression *e) { break; } if (!expr_must_lval(of)) { - err_print(e->where, "Cannot take address of non-lvalue."); /* FEATURE: better err */ return false; } if (of_type->kind == TYPE_TUPLE) { @@ -2028,7 +2027,7 @@ static bool types_decl(Typer *tr, Declaration *d) { err_print(d->where, "Declaration marked for exporting, but no package output was specified."); success = false; } else { - export_decl(tr->exptr, d); + success = export_decl(tr->exptr, d); } } } else { |