Add ...
parsing for fn pointer type
This commit is contained in:
parent
1705e5887d
commit
6c913d8fa7
4 changed files with 47 additions and 3 deletions
|
@ -43,7 +43,7 @@ fn list_(p: &mut Parser, flavor: Flavor) {
|
||||||
if flavor.type_required() {
|
if flavor.type_required() {
|
||||||
opt_self_param(p);
|
opt_self_param(p);
|
||||||
}
|
}
|
||||||
while !p.at(EOF) && !p.at(ket) && !(flavor == Flavor::Normal && p.at(DOTDOTDOT)) {
|
while !p.at(EOF) && !p.at(ket) && !(flavor.type_required() && p.at(DOTDOTDOT)) {
|
||||||
if !p.at_ts(VALUE_PARAMETER_FIRST) {
|
if !p.at_ts(VALUE_PARAMETER_FIRST) {
|
||||||
p.error("expected value parameter");
|
p.error("expected value parameter");
|
||||||
break;
|
break;
|
||||||
|
@ -55,7 +55,7 @@ fn list_(p: &mut Parser, flavor: Flavor) {
|
||||||
}
|
}
|
||||||
// test param_list_vararg
|
// test param_list_vararg
|
||||||
// extern "C" { fn printf(format: *const i8, ...) -> i32; }
|
// extern "C" { fn printf(format: *const i8, ...) -> i32; }
|
||||||
if flavor == Flavor::Normal {
|
if flavor.type_required() {
|
||||||
p.eat(DOTDOTDOT);
|
p.eat(DOTDOTDOT);
|
||||||
}
|
}
|
||||||
p.expect(ket);
|
p.expect(ket);
|
||||||
|
|
|
@ -166,6 +166,7 @@ fn placeholder_type(p: &mut Parser) {
|
||||||
// type A = fn();
|
// type A = fn();
|
||||||
// type B = unsafe fn();
|
// type B = unsafe fn();
|
||||||
// type C = unsafe extern "C" fn();
|
// type C = unsafe extern "C" fn();
|
||||||
|
// type D = extern "C" fn ( u8 , ... ) -> u8;
|
||||||
fn fn_pointer_type(p: &mut Parser) {
|
fn fn_pointer_type(p: &mut Parser) {
|
||||||
let m = p.start();
|
let m = p.start();
|
||||||
p.eat(UNSAFE_KW);
|
p.eat(UNSAFE_KW);
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
type A = fn();
|
type A = fn();
|
||||||
type B = unsafe fn();
|
type B = unsafe fn();
|
||||||
type C = unsafe extern "C" fn();
|
type C = unsafe extern "C" fn();
|
||||||
|
type D = extern "C" fn ( u8 , ... ) -> u8;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
SOURCE_FILE@[0; 70)
|
SOURCE_FILE@[0; 113)
|
||||||
TYPE_ALIAS_DEF@[0; 14)
|
TYPE_ALIAS_DEF@[0; 14)
|
||||||
TYPE_KW@[0; 4) "type"
|
TYPE_KW@[0; 4) "type"
|
||||||
WHITESPACE@[4; 5) " "
|
WHITESPACE@[4; 5) " "
|
||||||
|
@ -53,3 +53,45 @@ SOURCE_FILE@[0; 70)
|
||||||
R_PAREN@[67; 68) ")"
|
R_PAREN@[67; 68) ")"
|
||||||
SEMI@[68; 69) ";"
|
SEMI@[68; 69) ";"
|
||||||
WHITESPACE@[69; 70) "\n"
|
WHITESPACE@[69; 70) "\n"
|
||||||
|
TYPE_ALIAS_DEF@[70; 112)
|
||||||
|
TYPE_KW@[70; 74) "type"
|
||||||
|
WHITESPACE@[74; 75) " "
|
||||||
|
NAME@[75; 76)
|
||||||
|
IDENT@[75; 76) "D"
|
||||||
|
WHITESPACE@[76; 77) " "
|
||||||
|
EQ@[77; 78) "="
|
||||||
|
WHITESPACE@[78; 79) " "
|
||||||
|
FN_POINTER_TYPE@[79; 111)
|
||||||
|
ABI@[79; 89)
|
||||||
|
EXTERN_KW@[79; 85) "extern"
|
||||||
|
WHITESPACE@[85; 86) " "
|
||||||
|
STRING@[86; 89) "\"C\""
|
||||||
|
WHITESPACE@[89; 90) " "
|
||||||
|
FN_KW@[90; 92) "fn"
|
||||||
|
WHITESPACE@[92; 93) " "
|
||||||
|
PARAM_LIST@[93; 105)
|
||||||
|
L_PAREN@[93; 94) "("
|
||||||
|
WHITESPACE@[94; 95) " "
|
||||||
|
PARAM@[95; 97)
|
||||||
|
PATH_TYPE@[95; 97)
|
||||||
|
PATH@[95; 97)
|
||||||
|
PATH_SEGMENT@[95; 97)
|
||||||
|
NAME_REF@[95; 97)
|
||||||
|
IDENT@[95; 97) "u8"
|
||||||
|
WHITESPACE@[97; 98) " "
|
||||||
|
COMMA@[98; 99) ","
|
||||||
|
WHITESPACE@[99; 100) " "
|
||||||
|
DOTDOTDOT@[100; 103) "..."
|
||||||
|
WHITESPACE@[103; 104) " "
|
||||||
|
R_PAREN@[104; 105) ")"
|
||||||
|
WHITESPACE@[105; 106) " "
|
||||||
|
RET_TYPE@[106; 111)
|
||||||
|
THIN_ARROW@[106; 108) "->"
|
||||||
|
WHITESPACE@[108; 109) " "
|
||||||
|
PATH_TYPE@[109; 111)
|
||||||
|
PATH@[109; 111)
|
||||||
|
PATH_SEGMENT@[109; 111)
|
||||||
|
NAME_REF@[109; 111)
|
||||||
|
IDENT@[109; 111) "u8"
|
||||||
|
SEMI@[111; 112) ";"
|
||||||
|
WHITESPACE@[112; 113) "\n"
|
||||||
|
|
Loading…
Add table
Reference in a new issue