#define _POSIX_C_SOURCE 200809L #include #include #include #include #include #include "lex.h" #include "parse.h" #include "util.h" static noreturn void error(struct location loc, const char *fmt, ...) { fprintf(stderr, "%s:%d:%d ", loc.file, loc.line, loc.column); va_list ap; va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); fprintf(stderr, "\n"); exit(EXIT_CHECK); } static void check_import(struct ast_import *imports, int i) { for (int j = 0; j < i; ++j) { if (j == i) { continue; } if (!strcmp(imports[j].name, imports[i].name)) { error(imports[i].loc, "import collision (previous import at %s:%d:%d)", imports[j].loc.file, imports[j].loc.line, imports[j].loc.column); } } } static void check_imports(struct ast_import *imports, int n) { for (int i = 0; i < n; ++i) { check_import(imports, i); } } static void check_toplevels(struct ast_toplevel *tops, int n) { /* TODO */ } void check(struct ast_unit *ast) { check_imports(ast->imports, ast->implen); check_toplevels(ast->tops, ast->toplen); }