From 7bb67b1fd0ca56a04778083f1a01583d839be9b1 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Wed, 6 Apr 2016 14:08:23 -0700 Subject: [PATCH] ability to compare function pointers at compile time --- src/analyze.cpp | 10 ++++++++++ test/self_hosted.zig | 9 +++++++++ 2 files changed, 19 insertions(+) diff --git a/src/analyze.cpp b/src/analyze.cpp index 99f1dac3c..91fbddf71 100644 --- a/src/analyze.cpp +++ b/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) { diff --git a/test/self_hosted.zig b/test/self_hosted.zig index af3c26e8f..5dffbf9a1 100644 --- a/test/self_hosted.zig +++ b/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{} }