add test for bad import

This commit is contained in:
Andrew Kelley 2015-12-01 02:29:21 -07:00
parent 58e375d0a1
commit dfb6682089
9 changed files with 75 additions and 13 deletions

View file

@ -1,4 +1,4 @@
export executable "test";
export executable "test-multiple-files";
use "libc.zig";
use "foo.zig";

View file

@ -11,7 +11,7 @@
#include "zig_llvm.hpp"
#include "os.hpp"
static void add_node_error(CodeGen *g, AstNode *node, Buf *msg) {
void add_node_error(CodeGen *g, AstNode *node, Buf *msg) {
ErrorMsg *err = allocate<ErrorMsg>(1);
err->line_start = node->line;
err->column_start = node->column;

View file

@ -9,7 +9,10 @@
#define ZIG_ANALYZE_HPP
struct CodeGen;
struct AstNode;
struct Buf;
void semantic_analyze(CodeGen *g);
void add_node_error(CodeGen *g, AstNode *node, Buf *msg);
#endif

View file

@ -669,6 +669,7 @@ static void init(CodeGen *g, Buf *source_path) {
}
static ImportTableEntry *codegen_add_code(CodeGen *g, Buf *source_path, Buf *source_code) {
int err;
Buf full_path = BUF_INIT;
os_path_join(g->root_source_dir, source_path, &full_path);
@ -736,7 +737,11 @@ static ImportTableEntry *codegen_add_code(CodeGen *g, Buf *source_path, Buf *sou
Buf full_path = BUF_INIT;
os_path_join(g->root_source_dir, &top_level_decl->data.use.path, &full_path);
Buf *import_code = buf_alloc();
os_fetch_file_path(&full_path, import_code);
if ((err = os_fetch_file_path(&full_path, import_code))) {
add_node_error(g, top_level_decl,
buf_sprintf("unable to open \"%s\": %s", buf_ptr(&full_path), err_str(err)));
break;
}
codegen_add_code(g, &top_level_decl->data.use.path, import_code);
}
}

View file

@ -6,6 +6,12 @@ const char *err_str(int err) {
case ErrorNoMem: return "out of memory";
case ErrorInvalidFormat: return "invalid format";
case ErrorSemanticAnalyzeFail: return "semantic analyze failed";
case ErrorAccess: return "access denied";
case ErrorInterrupted: return "interrupted";
case ErrorSystemResources: return "lack of system resources";
case ErrorFileNotFound: return "file not found";
case ErrorFileSystem: return "file system error";
case ErrorFileTooBig: return "file too big";
}
return "(invalid error)";
}

View file

@ -13,6 +13,12 @@ enum Error {
ErrorNoMem,
ErrorInvalidFormat,
ErrorSemanticAnalyzeFail,
ErrorAccess,
ErrorInterrupted,
ErrorSystemResources,
ErrorFileNotFound,
ErrorFileSystem,
ErrorFileTooBig,
};
const char *err_str(int err);

View file

@ -7,6 +7,7 @@
#include "os.hpp"
#include "util.hpp"
#include "error.hpp"
#include <unistd.h>
#include <errno.h>
@ -143,26 +144,65 @@ void os_write_file(Buf *full_path, Buf *contents) {
int os_fetch_file(FILE *f, Buf *out_contents) {
int fd = fileno(f);
struct stat st;
if (fstat(fd, &st))
zig_panic("unable to stat file: %s", strerror(errno));
if (fstat(fd, &st)) {
switch (errno) {
case EACCES:
return ErrorAccess;
case ENOENT:
return ErrorFileNotFound;
case ENOMEM:
return ErrorSystemResources;
case EINTR:
return ErrorInterrupted;
case EINVAL:
zig_unreachable();
default:
return ErrorFileSystem;
}
}
off_t big_size = st.st_size;
if (big_size > INT_MAX)
zig_panic("file too big");
if (big_size > INT_MAX) {
return ErrorFileTooBig;
}
int size = (int)big_size;
buf_resize(out_contents, size);
ssize_t ret = read(fd, buf_ptr(out_contents), size);
if (ret != size)
zig_panic("unable to read file: %s", strerror(errno));
if (ret != size) {
switch (errno) {
case EINTR:
return ErrorInterrupted;
case EINVAL:
case EISDIR:
zig_unreachable();
default:
return ErrorFileSystem;
}
}
return 0;
}
int os_fetch_file_path(Buf *full_path, Buf *out_contents) {
FILE *f = fopen(buf_ptr(full_path), "rb");
if (!f)
zig_panic("unable to open %s: %s\n", buf_ptr(full_path), strerror(errno));
if (!f) {
switch (errno) {
case EACCES:
return ErrorAccess;
case EINTR:
return ErrorInterrupted;
case EINVAL:
zig_unreachable();
case ENFILE:
case ENOMEM:
return ErrorSystemResources;
case ENOENT:
return ErrorFileNotFound;
default:
return ErrorFileSystem;
}
}
int result = os_fetch_file(f, out_contents);
fclose(f);
return result;

View file

@ -16,8 +16,6 @@
#define BREAKPOINT __asm("int $0x03")
static const int COMPILE_FAILED_ERR_CODE = 10; // chosen with a random number generator
void zig_panic(const char *format, ...)
__attribute__((cold))
__attribute__ ((noreturn))

View file

@ -249,6 +249,10 @@ fn b() {}
#version("aoeu")
export executable "test";
)SOURCE", 1, ".tmp_source.zig:2:1: error: invalid version string");
add_compile_fail_case("bad import", R"SOURCE(
use "bogus-does-not-exist.zig";
)SOURCE", 1, ".tmp_source.zig:2:1: error: unable to open \"./bogus-does-not-exist.zig\": file not found");
}
static void print_compiler_invokation(TestCase *test_case, Buf *zig_stderr) {