diff --git a/vlib/compiler/fn.v b/vlib/compiler/fn.v index 4cf115f3ad..c363d59567 100644 --- a/vlib/compiler/fn.v +++ b/vlib/compiler/fn.v @@ -1441,7 +1441,9 @@ fn (p mut Parser) dispatch_generic_fn_instance(f mut Fn, ti TypeInst) { p.cgen.tmp_line = '' p.cgen.cur_line = '' p.cgen.lines = []string - p.cur_fn = *f + unsafe { // TODO + p.cur_fn = *f + } for arg in f.args { p.register_var(arg) } diff --git a/vlib/compiler/parser.v b/vlib/compiler/parser.v index 7f9eecd906..46cfba9aa6 100644 --- a/vlib/compiler/parser.v +++ b/vlib/compiler/parser.v @@ -1481,6 +1481,10 @@ fn (p mut Parser) get_var_type(name string, is_ptr bool, is_deref bool) string { mut typ := p.var_expr(v) // *var if is_deref { + if !p.inside_unsafe { + p.warn('dereferencing can only be done inside an `unsafe` block') + } + if !typ.contains('*') && !typ.ends_with('ptr') { println('name="$name", t=$v.typ') p.error('dereferencing requires a pointer, but got `$typ`') diff --git a/vlib/rand/rand.v b/vlib/rand/rand.v index 18168e499e..7f451f09a7 100644 --- a/vlib/rand/rand.v +++ b/vlib/rand/rand.v @@ -22,8 +22,10 @@ fn C.rand() int * @return a value between 0 and C.RAND_MAX (inclusive) */ pub fn rand_r(seed &int) int { + unsafe { mut rs := seed ns := ( *rs * 1103515245 + 12345 ) *rs = ns return ns & 0x7fffffff + } }