require `unsafe` for dereferencing

pull/2723/head
Alexander Medvednikov 2019-11-10 19:57:17 +03:00
parent c7f3413d70
commit fdf6682254
3 changed files with 9 additions and 1 deletions

View File

@ -1441,7 +1441,9 @@ fn (p mut Parser) dispatch_generic_fn_instance(f mut Fn, ti TypeInst) {
p.cgen.tmp_line = '' p.cgen.tmp_line = ''
p.cgen.cur_line = '' p.cgen.cur_line = ''
p.cgen.lines = []string p.cgen.lines = []string
unsafe { // TODO
p.cur_fn = *f p.cur_fn = *f
}
for arg in f.args { for arg in f.args {
p.register_var(arg) p.register_var(arg)
} }

View File

@ -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) mut typ := p.var_expr(v)
// *var // *var
if is_deref { 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') { if !typ.contains('*') && !typ.ends_with('ptr') {
println('name="$name", t=$v.typ') println('name="$name", t=$v.typ')
p.error('dereferencing requires a pointer, but got `$typ`') p.error('dereferencing requires a pointer, but got `$typ`')

View File

@ -22,8 +22,10 @@ fn C.rand() int
* @return a value between 0 and C.RAND_MAX (inclusive) * @return a value between 0 and C.RAND_MAX (inclusive)
*/ */
pub fn rand_r(seed &int) int { pub fn rand_r(seed &int) int {
unsafe {
mut rs := seed mut rs := seed
ns := ( *rs * 1103515245 + 12345 ) ns := ( *rs * 1103515245 + 12345 )
*rs = ns *rs = ns
return ns & 0x7fffffff return ns & 0x7fffffff
}
} }