Commit edebe0586b
src/ir.cpp
@@ -11438,13 +11438,7 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT
}
}
} else if (any_are_null && prev_inst->value->type->id != ZigTypeIdNull) {
- if (prev_inst->value->type->id == ZigTypeIdComptimeInt ||
- prev_inst->value->type->id == ZigTypeIdComptimeFloat)
- {
- ir_add_error_node(ira, source_node,
- buf_sprintf("unable to make maybe out of number literal"));
- return ira->codegen->builtin_types.entry_invalid;
- } else if (prev_inst->value->type->id == ZigTypeIdOptional) {
+ if (prev_inst->value->type->id == ZigTypeIdOptional) {
return prev_inst->value->type;
} else {
if ((err = type_resolve(ira->codegen, prev_inst->value->type, ResolveStatusSizeKnown)))
test/stage1/behavior/cast.zig
@@ -710,3 +710,24 @@ test "return u8 coercing into ?u32 return type" {
S.doTheTest();
comptime S.doTheTest();
}
+
+test "peer result null and comptime_int" {
+ const S = struct {
+ fn blah(n: i32) ?i32 {
+ if (n == 0) {
+ return null;
+ } else if (n < 0) {
+ return -1;
+ } else {
+ return 1;
+ }
+ }
+ };
+
+ expect(S.blah(0) == null);
+ comptime expect(S.blah(0) == null);
+ expect(S.blah(10).? == 1);
+ comptime expect(S.blah(10).? == 1);
+ expect(S.blah(-10).? == -1);
+ comptime expect(S.blah(-10).? == -1);
+}