From 902d0dc93d29dcbf655e2b000d625f8c4a09c89d Mon Sep 17 00:00:00 2001 From: Swastik Baranwal Date: Wed, 5 Apr 2023 15:35:18 +0530 Subject: [PATCH] checker: allow `~T(0)` where T is `int` (#17886) --- vlib/v/checker/checker.v | 3 ++- vlib/v/tests/generic_fn_infer_test.v | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 6e92e563f2..7b5d9479bd 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -3843,7 +3843,8 @@ fn (mut c Checker) prefix_expr(mut node ast.PrefixExpr) ast.Type { c.error('cannot dereference to void', node.pos) } } - if node.op == .bit_not && !right_type.is_int() && !c.pref.translated && !c.file.is_translated { + if node.op == .bit_not && !c.unwrap_generic(right_type).is_int() && !c.pref.translated + && !c.file.is_translated { c.type_error_for_operator('~', 'integer', right_sym.name, node.pos) } if node.op == .not && right_type != ast.bool_type_idx && !c.pref.translated diff --git a/vlib/v/tests/generic_fn_infer_test.v b/vlib/v/tests/generic_fn_infer_test.v index 768bd81205..e05d634029 100644 --- a/vlib/v/tests/generic_fn_infer_test.v +++ b/vlib/v/tests/generic_fn_infer_test.v @@ -5,6 +5,11 @@ fn simple[T](p T) T { return p } +fn bit_not_op_generic[T]() T { + x := ~T(0) + return x +} + fn test_infer() { call(3) i := 4 @@ -17,6 +22,8 @@ fn test_explicit_calls_should_also_work() { assert true simple[int](5) assert true + x := bit_not_op_generic[u32]() + assert x == u32(4294967295) } fn get_type_name[T](x T) string {