From d9c7387da0e0e37e7043428bf07e93087c28f9c6 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Fri, 25 Jul 2025 12:11:18 -0300 Subject: [PATCH] cgen: fix struct field init within fn without result type (fix #24970) (#24973) --- vlib/v/gen/c/cgen.v | 2 +- .../struct_field_result_init.c.must_have | 5 +++ .../c/testdata/struct_field_result_init.out | 0 .../c/testdata/struct_field_result_init.vv | 32 +++++++++++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 vlib/v/gen/c/testdata/struct_field_result_init.c.must_have create mode 100644 vlib/v/gen/c/testdata/struct_field_result_init.out create mode 100644 vlib/v/gen/c/testdata/struct_field_result_init.vv diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index dcadacc2b1..75ca05157f 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -7239,10 +7239,10 @@ fn (mut g Gen) or_block(var_name string, or_block ast.OrExpr, return_type ast.Ty g.writeln('\t${styp} ${err_obj} = {0};') if g.fn_decl.return_type.has_flag(.result) { g.writeln('\t${err_obj}.is_error = true;') + g.writeln('\t${err_obj}.err = ${cvar_name}${tmp_op}err;') } else if g.fn_decl.return_type.has_flag(.option) { g.writeln('\t${err_obj}.state = 2;') } - g.writeln('\t${err_obj}.err = ${cvar_name}${tmp_op}err;') g.writeln('\treturn ${err_obj};') } } diff --git a/vlib/v/gen/c/testdata/struct_field_result_init.c.must_have b/vlib/v/gen/c/testdata/struct_field_result_init.c.must_have new file mode 100644 index 0000000000..a0460c32a5 --- /dev/null +++ b/vlib/v/gen/c/testdata/struct_field_result_init.c.must_have @@ -0,0 +1,5 @@ +_result_math__big__Integer _t1 = math__big__integer_from_string(_S("115792089237316195423570985008687907853269984665640564039457584007913129639747")); +if (_t1.is_error) { +math__big__Integer _t2 = {0}; +return _t2; +} \ No newline at end of file diff --git a/vlib/v/gen/c/testdata/struct_field_result_init.out b/vlib/v/gen/c/testdata/struct_field_result_init.out new file mode 100644 index 0000000000..e69de29bb2 diff --git a/vlib/v/gen/c/testdata/struct_field_result_init.vv b/vlib/v/gen/c/testdata/struct_field_result_init.vv new file mode 100644 index 0000000000..9ddf174183 --- /dev/null +++ b/vlib/v/gen/c/testdata/struct_field_result_init.vv @@ -0,0 +1,32 @@ +import math +import math.big { Integer } +import crypto.rand + +struct SSS { +mut: + prime Integer = big.integer_from_string('115792089237316195423570985008687907853269984665640564039457584007913129639747')! +} + +// random returns a random number from the range (0, prime-1) inclusive +fn (s SSS) random() !Integer { + mut result := big.zero_int + s.prime + result = result - big.one_int + return rand.int_big(result) +} + +// mod_inverse computes the multiplicative inverse of the number on the field +// prime; more specifically, number * inverse == 1; Note: number should never be +// zero +fn mod_inverse(number Integer) Integer { + s := SSS{} + copy := number % s.prime + pcopy := s.prime + + _, _, y := math.egcd(pcopy.int(), copy.int()) + + return (s.prime + big.integer_from_i64(y)) % s.prime +} + +fn main() { + mod_inverse(big.integer_from_string('1')!) +}