Commit a05150e92d

Andrew Kelley <andrew@ziglang.org>
2019-12-31 01:08:57
fix comparing comptime_int against undefined literal
closes #4004
1 parent a3d04b9
Changed files (4)
src/analyze.cpp
@@ -9243,6 +9243,7 @@ bool type_is_numeric(ZigType *ty) {
         case ZigTypeIdComptimeInt:
         case ZigTypeIdInt:
         case ZigTypeIdFloat:
+        case ZigTypeIdUndefined:
             return true;
 
         case ZigTypeIdVector:
@@ -9255,7 +9256,6 @@ bool type_is_numeric(ZigType *ty) {
         case ZigTypeIdPointer:
         case ZigTypeIdArray:
         case ZigTypeIdStruct:
-        case ZigTypeIdUndefined:
         case ZigTypeIdNull:
         case ZigTypeIdOptional:
         case ZigTypeIdErrorUnion:
src/ir.cpp
@@ -14647,7 +14647,9 @@ never_mind_just_calculate_it_normally:
     }
 
 
-    if (op1_val->special == ConstValSpecialUndef || op2_val->special == ConstValSpecialUndef) {
+    if (op1_val->special == ConstValSpecialUndef || op2_val->special == ConstValSpecialUndef ||
+        op1_val->type->id == ZigTypeIdUndefined || op2_val->type->id == ZigTypeIdUndefined)
+    {
         out_val->special = ConstValSpecialUndef;
         return nullptr;
     }
test/stage1/behavior/math.zig
@@ -671,3 +671,10 @@ test "vector comparison" {
     S.doTheTest();
     comptime S.doTheTest();
 }
+
+test "compare undefined literal with comptime_int" {
+    var x = undefined == 1;
+    // x is now undefined with type bool
+    x = true;
+    expect(x);
+}
test/compile_errors.zig
@@ -2,6 +2,14 @@ const tests = @import("tests.zig");
 const builtin = @import("builtin");
 
 pub fn addCases(cases: *tests.CompileErrorContext) void {
+    cases.add("comparing against undefined produces undefined value",
+        \\export fn entry() void {
+        \\    if (2 == undefined) {}
+        \\}
+    , &[_][]const u8{
+        "tmp.zig:2:11: error: use of undefined value here causes undefined behavior",
+    });
+
     cases.add("comptime ptrcast of zero-sized type",
         \\fn foo() void {
         \\    const node: struct {} = undefined;