1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

parser: fix parse c function with optional argument name (fix #13234) (#15037)

This commit is contained in:
yuyi 2022-07-12 16:06:29 +08:00 committed by GitHub
parent b59e6b1d06
commit 9839ab6a6c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 2 deletions

View File

@ -800,7 +800,7 @@ fn (mut p Parser) fn_args() ([]ast.Param, bool, bool) {
types_only := p.tok.kind in [.amp, .ellipsis, .key_fn, .lsbr]
|| (p.peek_tok.kind == .comma && (p.table.known_type(argname) || is_generic_type))
|| p.peek_tok.kind == .dot || p.peek_tok.kind == .rpar
|| p.peek_tok.kind == .dot || p.peek_tok.kind == .rpar || p.fn_language == .c
|| (p.tok.kind == .key_mut && (p.peek_token(2).kind == .comma
|| p.peek_token(2).kind == .rpar || (p.peek_tok.kind == .name
&& p.peek_token(2).kind == .dot)))
@ -815,9 +815,15 @@ fn (mut p Parser) fn_args() ([]ast.Param, bool, bool) {
is_shared := p.tok.kind == .key_shared
is_atomic := p.tok.kind == .key_atomic
is_mut := p.tok.kind == .key_mut || is_shared || is_atomic
mut name := ''
if is_mut {
p.next()
}
if p.fn_language == .c && p.tok.kind == .name
&& p.peek_tok.kind !in [.comma, .rpar, .dot] {
name = p.tok.lit
p.next()
}
if p.tok.kind == .ellipsis {
p.next()
is_variadic = true
@ -875,7 +881,7 @@ fn (mut p Parser) fn_args() ([]ast.Param, bool, bool) {
}
args << ast.Param{
pos: pos
name: ''
name: name
is_mut: is_mut
typ: arg_type
type_pos: pos

View File

@ -0,0 +1,12 @@
module main
#include "@VMODROOT/code.c"
fn C.mut_arg(&u8, mut val usize)
fn test_c_function_mut_param() {
key := &u8(1)
mut val := usize(1)
C.mut_arg(key, mut &val)
assert val == usize(5)
}