Commit 7bb67b1fd0

Andrew Kelley <superjoe30@gmail.com>
2016-04-06 23:08:23
ability to compare function pointers at compile time
1 parent 22ef416
Changed files (2)
src/analyze.cpp
@@ -2902,6 +2902,16 @@ static TypeTableEntry *analyze_bool_bin_op_expr(CodeGen *g, ImportTableEntry *im
     } else if (resolved_type->id == TypeTableEntryIdPureError) {
         bool are_equal = op1_val->data.x_err.err == op2_val->data.x_err.err;
 
+        if (bin_op_type == BinOpTypeCmpEq) {
+            answer = are_equal;
+        } else if (bin_op_type == BinOpTypeCmpNotEq) {
+            answer = !are_equal;
+        } else {
+            zig_unreachable();
+        }
+    } else if (resolved_type->id == TypeTableEntryIdFn) {
+        bool are_equal = (op1_val->data.x_fn == op2_val->data.x_fn);
+
         if (bin_op_type == BinOpTypeCmpEq) {
             answer = are_equal;
         } else if (bin_op_type == BinOpTypeCmpNotEq) {
test/self_hosted.zig
@@ -522,6 +522,15 @@ fn max(T: type)(a: T, b: T) -> T {
 }
 
 
+#attribute("test")
+fn constant_equal_function_pointers() {
+    const alias = empty_fn;
+    assert(@const_eval(empty_fn == alias));
+}
+
+fn empty_fn() {}
+
+
 fn assert(b: bool) {
     if (!b) unreachable{}
 }