Browse Source

Merge branch 'master' into old-backend-removal

gingerBill 4 years ago
parent
commit
43b55223af
2 changed files with 24 additions and 1 deletions
  1. 21 1
      src/checker.cpp
  2. 3 0
      src/llvm_backend.cpp

+ 21 - 1
src/checker.cpp

@@ -3726,6 +3726,19 @@ Array<ImportPathItem> find_import_path(Checker *c, AstPackage *start, AstPackage
 	return empty_path;
 }
 #endif
+
+String get_invalid_import_name(String input) {
+	isize slash = 0;
+	for (isize i = input.len-1; i >= 0; i--) {
+		if (input[i] == '/' || input[i] == '\\') {
+			break;
+		}
+		slash = i;
+	}
+	input = substring(input, slash, input.len);
+	return input;
+}
+
 void check_add_import_decl(CheckerContext *ctx, Ast *decl) {
 	if (decl->state_flags & StateFlag_BeenHandled) return;
 	decl->state_flags |= StateFlag_BeenHandled;
@@ -3783,7 +3796,14 @@ void check_add_import_decl(CheckerContext *ctx, Ast *decl) {
 		if (id->is_using) {
 			// TODO(bill): Should this be a warning?
 		} else {
-			error(token, "Import name, %.*s, cannot be use as an import name as it is not a valid identifier", LIT(id->import_name.string));
+			if (id->import_name.string == "") {
+				String invalid_name = id->fullpath;
+				invalid_name = get_invalid_import_name(invalid_name);
+
+				error(id->token, "Import name %.*s, is not a valid identifier. Perhaps you want to reference the package by a different name like this: import <new_name> \"%.*s\" ", LIT(invalid_name), LIT(invalid_name));
+			} else {
+				error(token, "Import name, %.*s, cannot be use as an import name as it is not a valid identifier", LIT(id->import_name.string));
+			}
 		}
 	} else {
 		GB_ASSERT(id->import_name.pos.line != 0);

+ 3 - 0
src/llvm_backend.cpp

@@ -10149,6 +10149,9 @@ lbValue lb_emit_comp_against_nil(lbProcedure *p, TokenKind op_kind, lbValue x) {
 			} else if (op_kind == Token_NotEq) {
 				return lb_const_bool(p->module, t_llvm_bool, false);
 			}
+		} else if (is_type_union_maybe_pointer(t)) {
+			lbValue tag = lb_emit_transmute(p, x, t_rawptr);
+			return lb_emit_comp_against_nil(p, op_kind, tag);
 		} else {
 			lbValue tag = lb_emit_union_tag_value(p, x);
 			return lb_emit_comp(p, op_kind, tag, lb_zero(p->module, tag.type));