From 66f2881a78b717bdb8410956ccbffb679fbccea5 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 17 Feb 2023 17:02:37 +0000 Subject: [PATCH] Allow comparisons between empty `struct{}` and `union{}` --- src/llvm_backend_expr.cpp | 9 +++++++++ src/types.cpp | 6 ------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 480831a68..5bffc7226 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -2210,6 +2210,15 @@ gb_internal lbValue lb_compare_records(lbProcedure *p, TokenKind op_kind, lbValu lbValue left_ptr = lb_address_from_load_or_generate_local(p, left); lbValue right_ptr = lb_address_from_load_or_generate_local(p, right); lbValue res = {}; + if (type_size_of(type) == 0) { + switch (op_kind) { + case Token_CmpEq: + return lb_const_bool(p->module, t_bool, true); + case Token_NotEq: + return lb_const_bool(p->module, t_bool, false); + } + GB_PANIC("invalid operator"); + } if (is_type_simple_compare(type)) { // TODO(bill): Test to see if this is actually faster!!!! auto args = array_make(permanent_allocator(), 3); diff --git a/src/types.cpp b/src/types.cpp index 7a1f17a16..85364667d 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -2313,9 +2313,6 @@ gb_internal bool is_type_comparable(Type *t) { return true; case Type_Struct: - if (type_size_of(t) == 0) { - return false; - } if (t->Struct.soa_kind != StructSoa_None) { return false; } @@ -2331,9 +2328,6 @@ gb_internal bool is_type_comparable(Type *t) { return true; case Type_Union: - if (type_size_of(t) == 0) { - return false; - } for_array(i, t->Union.variants) { Type *v = t->Union.variants[i]; if (!is_type_comparable(v)) {