Commit 64034a3d1a

Andrew Kelley <superjoe30@gmail.com>
2016-09-06 05:19:13
maxValue and minValue builtins return number literal
closes #170
1 parent cfaced3
Changed files (3)
src/analyze.cpp
@@ -4326,10 +4326,13 @@ static TypeTableEntry *analyze_min_max_value(CodeGen *g, ImportTableEntry *impor
 
     if (type_entry->id == TypeTableEntryIdInvalid) {
         return g->builtin_types.entry_invalid;
-    } else if (type_entry->id == TypeTableEntryIdInt ||
-            type_entry->id == TypeTableEntryIdFloat ||
-            type_entry->id == TypeTableEntryIdBool)
-    {
+    } else if (type_entry->id == TypeTableEntryIdInt) {
+        eval_min_max_value(g, type_entry, &get_resolved_expr(node)->const_val, is_max);
+        return g->builtin_types.entry_num_lit_int;
+    } else if (type_entry->id == TypeTableEntryIdFloat) {
+        eval_min_max_value(g, type_entry, &get_resolved_expr(node)->const_val, is_max);
+        return g->builtin_types.entry_num_lit_float;
+    } else if (type_entry->id == TypeTableEntryIdBool) {
         eval_min_max_value(g, type_entry, &get_resolved_expr(node)->const_val, is_max);
         return type_entry;
     } else {
test/cases/max_value_type.zig
@@ -0,0 +1,10 @@
+const assert = @import("std").debug.assert;
+
+#attribute("test")
+fn maxValueType() {
+    // If the type of @maxValue(i32) was i32 then this implicit cast to
+    // u32 would not work. But since the value is a number literal,
+    // it works fine.
+    const x: u32 = @maxValue(i32);
+    assert(x == 2147483647);
+}
test/self_hosted.zig
@@ -7,6 +7,7 @@ const test_return_type_type = @import("cases/return_type_type.zig");
 const test_zeroes = @import("cases/zeroes.zig");
 const test_sizeof_and_typeof = @import("cases/sizeof_and_typeof.zig");
 const test_maybe_return = @import("cases/maybe_return.zig");
+const test_max_value_type = @import("cases/max_value_type.zig");
 
 // normal comment
 /// this is a documentation comment