parser: do no allow var names with __; cgen: use __argc

pull/4237/head
Alexander Medvednikov 2020-04-04 14:55:40 +02:00
parent 95a1bd8470
commit f748390172
3 changed files with 10 additions and 7 deletions

View File

@ -506,12 +506,12 @@ pub fn (a []char) index(v char) int {
// []int.reduce executes a given reducer function on each element of the array,
// resulting in a single output value.
pub fn (a []int) reduce(iter fn(accum, curr int)int, accum_start int) int {
mut _accum := accum_start
mut accum_ := accum_start
for i in a {
_accum = iter(_accum, i)
accum_ = iter(accum_, i)
}
return _accum
return accum_
}
// array_eq<T> checks if two arrays contain all the same elements in the same order.

View File

@ -757,9 +757,9 @@ fn (g mut Gen) gen_fn_decl(it ast.FnDecl) {
is_main := it.name == 'main'
if is_main {
if g.pref.os == .windows {
g.write('int wmain(int argc, wchar_t *argv[], wchar_t *envp[]')
g.write('int wmain(int __argc, wchar_t *__argv[], wchar_t *__envp[]')
} else {
g.write('int ${it.name}(int argc, char** argv')
g.write('int ${it.name}(int __argc, char** __argv')
}
}
else {
@ -817,9 +817,9 @@ fn (g mut Gen) gen_fn_decl(it ast.FnDecl) {
g.writeln('free(_const_os__args.data); // empty, inited in _vinit()')
}
if g.pref.os == .windows {
g.writeln('_const_os__args = os__init_os_args_wide(argc, argv);')
g.writeln('_const_os__args = os__init_os_args_wide(__argc, __argv);')
} else {
g.writeln('_const_os__args = os__init_os_args(argc, (byteptr*)argv);')
g.writeln('_const_os__args = os__init_os_args(__argc, (byteptr*)__argv);')
}
}
}

View File

@ -1686,6 +1686,9 @@ fn (p mut Parser) assign_stmt() ast.Stmt {
p.error('unknown variable `$ident.name`')
}
if is_decl && ident.kind != .blank_ident {
if ident.name.starts_with('__') {
p.error('variable names cannot start with `__`')
}
if p.scope.known_var(ident.name) {
p.error('redefinition of `$ident.name`')
}