Skip to content

Commit d9c7387

Browse files
authored
cgen: fix struct field init within fn without result type (fix #24970) (#24973)
1 parent e5eed5c commit d9c7387

File tree

4 files changed

+38
-1
lines changed

4 files changed

+38
-1
lines changed

vlib/v/gen/c/cgen.v

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7239,10 +7239,10 @@ fn (mut g Gen) or_block(var_name string, or_block ast.OrExpr, return_type ast.Ty
72397239
g.writeln('\t${styp} ${err_obj} = {0};')
72407240
if g.fn_decl.return_type.has_flag(.result) {
72417241
g.writeln('\t${err_obj}.is_error = true;')
7242+
g.writeln('\t${err_obj}.err = ${cvar_name}${tmp_op}err;')
72427243
} else if g.fn_decl.return_type.has_flag(.option) {
72437244
g.writeln('\t${err_obj}.state = 2;')
72447245
}
7245-
g.writeln('\t${err_obj}.err = ${cvar_name}${tmp_op}err;')
72467246
g.writeln('\treturn ${err_obj};')
72477247
}
72487248
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
_result_math__big__Integer _t1 = math__big__integer_from_string(_S("115792089237316195423570985008687907853269984665640564039457584007913129639747"));
2+
if (_t1.is_error) {
3+
math__big__Integer _t2 = {0};
4+
return _t2;
5+
}

vlib/v/gen/c/testdata/struct_field_result_init.out

Whitespace-only changes.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import math
2+
import math.big { Integer }
3+
import crypto.rand
4+
5+
struct SSS {
6+
mut:
7+
prime Integer = big.integer_from_string('115792089237316195423570985008687907853269984665640564039457584007913129639747')!
8+
}
9+
10+
// random returns a random number from the range (0, prime-1) inclusive
11+
fn (s SSS) random() !Integer {
12+
mut result := big.zero_int + s.prime
13+
result = result - big.one_int
14+
return rand.int_big(result)
15+
}
16+
17+
// mod_inverse computes the multiplicative inverse of the number on the field
18+
// prime; more specifically, number * inverse == 1; Note: number should never be
19+
// zero
20+
fn mod_inverse(number Integer) Integer {
21+
s := SSS{}
22+
copy := number % s.prime
23+
pcopy := s.prime
24+
25+
_, _, y := math.egcd(pcopy.int(), copy.int())
26+
27+
return (s.prime + big.integer_from_i64(y)) % s.prime
28+
}
29+
30+
fn main() {
31+
mod_inverse(big.integer_from_string('1')!)
32+
}

0 commit comments

Comments
 (0)