Browse Source

Improve type hint for #load to allow for string types

gingerBill 3 năm trước cách đây
mục cha
commit
70dc0c15fd
2 tập tin đã thay đổi với 14 bổ sung8 xóa
  1. 6 2
      src/check_builtin.cpp
  2. 8 6
      src/check_expr.cpp

+ 6 - 2
src/check_builtin.cpp

@@ -1196,10 +1196,14 @@ LoadDirectiveResult check_load_directive(CheckerContext *c, Operand *operand, As
 
 	GB_ASSERT(o.value.kind == ExactValue_String);
 
+	operand->type = t_u8_slice;
+	if (type_hint && is_type_string(type_hint)) {
+		operand->type = type_hint;
+	}
+	operand->mode = Addressing_Constant;
+
 	LoadFileCache *cache = nullptr;
 	if (cache_load_file_directive(c, call, o.value.value_string, err_on_not_found, &cache)) {
-		operand->type = t_u8_slice;
-		operand->mode = Addressing_Constant;
 		operand->value = exact_value_string(cache->data);
 		return LoadDirective_Success;
 	}

+ 8 - 6
src/check_expr.cpp

@@ -7435,10 +7435,6 @@ ExprKind check_or_else_expr(CheckerContext *c, Operand *o, Ast *node, Type *type
 	// NOTE(bill, 2022-08-11): edge case to handle #load(path) or_else default
 	if (is_load_directive_call(arg)) {
 		LoadDirectiveResult res = check_load_directive(c, &x, arg, type_hint, false);
-		if (res == LoadDirective_Success) {
-			*o = x;
-			return Expr_Expr;
-		}
 
 		bool y_is_diverging = false;
 		check_expr_base(c, &y, default_value, x.type);
@@ -7468,10 +7464,16 @@ ExprKind check_or_else_expr(CheckerContext *c, Operand *o, Ast *node, Type *type
 
 		if (!y_is_diverging) {
 			check_assignment(c, &y, x.type, name);
+			if (y.mode != Addressing_Constant) {
+				error(y.expr, "expected a constant expression on the right-hand side of 'or_else' in conjuction with '#load'");
+			}
 		}
 
-		o->mode = y.mode;
-		o->type  = y.type;
+		if (res == LoadDirective_Success) {
+			*o = x;
+		} else {
+			*o = y;
+		}
 		o->expr = node;
 
 		return Expr_Expr;