authorgravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2021-09-02 14:45:00+02:00
committergravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2021-09-20 02:29:03+02:00
logccc7f9987debd2112d1432f7aa58a81a0814e81d
tree351b1853c4f9ede39eb6c5b5c539fc070c8b2a72
parent9fa723ee5043a9d2cb017e417f2e27041f671146

Address spaces: addrspace(A) parsing

The grammar for function prototypes, (global) variable declarations, and pointer types now accepts an optional addrspace(A) modifier.

4 files changed, 135 insertions(+), 30 deletions(-)

lib/std/zig/Ast.zig+50-4
......@@ -262,6 +262,9 @@ pub fn renderError(tree: Tree, parse_error: Error, stream: anytype) !void {
262262 token_tags[parse_error.token].symbol(),
263263 });
264264 },
265 .extra_addrspace_qualifier => {
266 return stream.writeAll("extra addrspace qualifier");
267 },
265268 .extra_align_qualifier => {
266269 return stream.writeAll("extra align qualifier");
267270 },
......@@ -1021,7 +1024,7 @@ pub fn lastToken(tree: Tree, node: Node.Index) TokenIndex {
10211024 },
10221025 .fn_proto_one => {
10231026 const extra = tree.extraData(datas[n].lhs, Node.FnProtoOne);
1024 // linksection, callconv, align can appear in any order, so we
1027 // addrspace, linksection, callconv, align can appear in any order, so we
10251028 // find the last one here.
10261029 var max_node: Node.Index = datas[n].rhs;
10271030 var max_start = token_starts[main_tokens[max_node]];
......@@ -1034,6 +1037,14 @@ pub fn lastToken(tree: Tree, node: Node.Index) TokenIndex {
10341037 max_offset = 1; // for the rparen
10351038 }
10361039 }
1040 if (extra.addrspace_expr != 0) {
1041 const start = token_starts[main_tokens[extra.addrspace_expr]];
1042 if (start > max_start) {
1043 max_node = extra.addrspace_expr;
1044 max_start = start;
1045 max_offset = 1; // for the rparen
1046 }
1047 }
10371048 if (extra.section_expr != 0) {
10381049 const start = token_starts[main_tokens[extra.section_expr]];
10391050 if (start > max_start) {
......@@ -1055,7 +1066,7 @@ pub fn lastToken(tree: Tree, node: Node.Index) TokenIndex {
10551066 },
10561067 .fn_proto => {
10571068 const extra = tree.extraData(datas[n].lhs, Node.FnProto);
1058 // linksection, callconv, align can appear in any order, so we
1069 // addrspace, linksection, callconv, align can appear in any order, so we
10591070 // find the last one here.
10601071 var max_node: Node.Index = datas[n].rhs;
10611072 var max_start = token_starts[main_tokens[max_node]];
......@@ -1068,6 +1079,14 @@ pub fn lastToken(tree: Tree, node: Node.Index) TokenIndex {
10681079 max_offset = 1; // for the rparen
10691080 }
10701081 }
1082 if (extra.addrspace_expr != 0) {
1083 const start = token_starts[main_tokens[extra.addrspace_expr]];
1084 if (start > max_start) {
1085 max_node = extra.addrspace_expr;
1086 max_start = start;
1087 max_offset = 1; // for the rparen
1088 }
1089 }
10711090 if (extra.section_expr != 0) {
10721091 const start = token_starts[main_tokens[extra.section_expr]];
10731092 if (start > max_start) {
......@@ -1138,6 +1157,7 @@ pub fn globalVarDecl(tree: Tree, node: Node.Index) full.VarDecl {
11381157 return tree.fullVarDecl(.{
11391158 .type_node = extra.type_node,
11401159 .align_node = extra.align_node,
1160 .addrspace_node = extra.addrspace_node,
11411161 .section_node = extra.section_node,
11421162 .init_node = data.rhs,
11431163 .mut_token = tree.nodes.items(.main_token)[node],
......@@ -1151,6 +1171,7 @@ pub fn localVarDecl(tree: Tree, node: Node.Index) full.VarDecl {
11511171 return tree.fullVarDecl(.{
11521172 .type_node = extra.type_node,
11531173 .align_node = extra.align_node,
1174 .addrspace_node = 0,
11541175 .section_node = 0,
11551176 .init_node = data.rhs,
11561177 .mut_token = tree.nodes.items(.main_token)[node],
......@@ -1163,6 +1184,7 @@ pub fn simpleVarDecl(tree: Tree, node: Node.Index) full.VarDecl {
11631184 return tree.fullVarDecl(.{
11641185 .type_node = data.lhs,
11651186 .align_node = 0,
1187 .addrspace_node = 0,
11661188 .section_node = 0,
11671189 .init_node = data.rhs,
11681190 .mut_token = tree.nodes.items(.main_token)[node],
......@@ -1175,6 +1197,7 @@ pub fn alignedVarDecl(tree: Tree, node: Node.Index) full.VarDecl {
11751197 return tree.fullVarDecl(.{
11761198 .type_node = 0,
11771199 .align_node = data.lhs,
1200 .addrspace_node = 0,
11781201 .section_node = 0,
11791202 .init_node = data.rhs,
11801203 .mut_token = tree.nodes.items(.main_token)[node],
......@@ -1249,6 +1272,7 @@ pub fn fnProtoSimple(tree: Tree, buffer: *[1]Node.Index, node: Node.Index) full.
12491272 .return_type = data.rhs,
12501273 .params = params,
12511274 .align_expr = 0,
1275 .addrspace_expr = 0,
12521276 .section_expr = 0,
12531277 .callconv_expr = 0,
12541278 });
......@@ -1265,6 +1289,7 @@ pub fn fnProtoMulti(tree: Tree, node: Node.Index) full.FnProto {
12651289 .return_type = data.rhs,
12661290 .params = params,
12671291 .align_expr = 0,
1292 .addrspace_expr = 0,
12681293 .section_expr = 0,
12691294 .callconv_expr = 0,
12701295 });
......@@ -1282,6 +1307,7 @@ pub fn fnProtoOne(tree: Tree, buffer: *[1]Node.Index, node: Node.Index) full.FnP
12821307 .return_type = data.rhs,
12831308 .params = params,
12841309 .align_expr = extra.align_expr,
1310 .addrspace_expr = extra.addrspace_expr,
12851311 .section_expr = extra.section_expr,
12861312 .callconv_expr = extra.callconv_expr,
12871313 });
......@@ -1298,6 +1324,7 @@ pub fn fnProto(tree: Tree, node: Node.Index) full.FnProto {
12981324 .return_type = data.rhs,
12991325 .params = params,
13001326 .align_expr = extra.align_expr,
1327 .addrspace_expr = extra.addrspace_expr,
13011328 .section_expr = extra.section_expr,
13021329 .callconv_expr = extra.callconv_expr,
13031330 });
......@@ -1453,6 +1480,7 @@ pub fn ptrTypeAligned(tree: Tree, node: Node.Index) full.PtrType {
14531480 return tree.fullPtrType(.{
14541481 .main_token = tree.nodes.items(.main_token)[node],
14551482 .align_node = data.lhs,
1483 .addrspace_node = 0,
14561484 .sentinel = 0,
14571485 .bit_range_start = 0,
14581486 .bit_range_end = 0,
......@@ -1466,6 +1494,7 @@ pub fn ptrTypeSentinel(tree: Tree, node: Node.Index) full.PtrType {
14661494 return tree.fullPtrType(.{
14671495 .main_token = tree.nodes.items(.main_token)[node],
14681496 .align_node = 0,
1497 .addrspace_node = 0,
14691498 .sentinel = data.lhs,
14701499 .bit_range_start = 0,
14711500 .bit_range_end = 0,
......@@ -1480,6 +1509,7 @@ pub fn ptrType(tree: Tree, node: Node.Index) full.PtrType {
14801509 return tree.fullPtrType(.{
14811510 .main_token = tree.nodes.items(.main_token)[node],
14821511 .align_node = extra.align_node,
1512 .addrspace_node = extra.addrspace_node,
14831513 .sentinel = extra.sentinel,
14841514 .bit_range_start = 0,
14851515 .bit_range_end = 0,
......@@ -1494,6 +1524,7 @@ pub fn ptrTypeBitRange(tree: Tree, node: Node.Index) full.PtrType {
14941524 return tree.fullPtrType(.{
14951525 .main_token = tree.nodes.items(.main_token)[node],
14961526 .align_node = extra.align_node,
1527 .addrspace_node = extra.addrspace_node,
14971528 .sentinel = extra.sentinel,
14981529 .bit_range_start = extra.bit_range_start,
14991530 .bit_range_end = extra.bit_range_end,
......@@ -2063,6 +2094,7 @@ pub const full = struct {
20632094 mut_token: TokenIndex,
20642095 type_node: Node.Index,
20652096 align_node: Node.Index,
2097 addrspace_node: Node.Index,
20662098 section_node: Node.Index,
20672099 init_node: Node.Index,
20682100 };
......@@ -2130,6 +2162,7 @@ pub const full = struct {
21302162 return_type: Node.Index,
21312163 params: []const Node.Index,
21322164 align_expr: Node.Index,
2165 addrspace_expr: Node.Index,
21332166 section_expr: Node.Index,
21342167 callconv_expr: Node.Index,
21352168 };
......@@ -2288,6 +2321,7 @@ pub const full = struct {
22882321 pub const Components = struct {
22892322 main_token: TokenIndex,
22902323 align_node: Node.Index,
2324 addrspace_node: Node.Index,
22912325 sentinel: Node.Index,
22922326 bit_range_start: Node.Index,
22932327 bit_range_end: Node.Index,
......@@ -2397,6 +2431,7 @@ pub const Error = struct {
23972431 expected_var_decl_or_fn,
23982432 expected_loop_payload,
23992433 expected_container,
2434 extra_addrspace_qualifier,
24002435 extra_align_qualifier,
24012436 extra_allowzero_qualifier,
24022437 extra_const_qualifier,
......@@ -2723,13 +2758,13 @@ pub const Node = struct {
27232758 /// main_token is the `fn` keyword.
27242759 /// extern function declarations use this tag.
27252760 fn_proto_multi,
2726 /// `fn(a: b) rhs linksection(e) callconv(f)`. `FnProtoOne[lhs]`.
2761 /// `fn(a: b) rhs addrspace(e) linksection(f) callconv(g)`. `FnProtoOne[lhs]`.
27272762 /// zero or one parameters.
27282763 /// anytype and ... parameters are omitted from the AST tree.
27292764 /// main_token is the `fn` keyword.
27302765 /// extern function declarations use this tag.
27312766 fn_proto_one,
2732 /// `fn(a: b, c: d) rhs linksection(e) callconv(f)`. `FnProto[lhs]`.
2767 /// `fn(a: b, c: d) rhs addrspace(e) linksection(f) callconv(g)`. `FnProto[lhs]`.
27332768 /// anytype and ... parameters are omitted from the AST tree.
27342769 /// main_token is the `fn` keyword.
27352770 /// extern function declarations use this tag.
......@@ -2893,11 +2928,13 @@ pub const Node = struct {
28932928 pub const PtrType = struct {
28942929 sentinel: Index,
28952930 align_node: Index,
2931 addrspace_node: Index,
28962932 };
28972933
28982934 pub const PtrTypeBitRange = struct {
28992935 sentinel: Index,
29002936 align_node: Index,
2937 addrspace_node: Index,
29012938 bit_range_start: Index,
29022939 bit_range_end: Index,
29032940 };
......@@ -2920,8 +2957,13 @@ pub const Node = struct {
29202957 };
29212958
29222959 pub const GlobalVarDecl = struct {
2960 /// Populated if there is an explicit type ascription.
29232961 type_node: Index,
2962 /// Populated if align(A) is present.
29242963 align_node: Index,
2964 /// Populated if linksection(A) is present.
2965 addrspace_node: Index,
2966 /// Populated if addrspace(A) is present.
29252967 section_node: Index,
29262968 };
29272969
......@@ -2954,6 +2996,8 @@ pub const Node = struct {
29542996 /// Populated if align(A) is present.
29552997 align_expr: Index,
29562998 /// Populated if linksection(A) is present.
2999 addrspace_expr: Index,
3000 /// Populated if addrspace(A) is present.
29573001 section_expr: Index,
29583002 /// Populated if callconv(A) is present.
29593003 callconv_expr: Index,
......@@ -2964,6 +3008,8 @@ pub const Node = struct {
29643008 params_end: Index,
29653009 /// Populated if align(A) is present.
29663010 align_expr: Index,
3011 /// Populated if addrspace(A) is present.
3012 addrspace_expr: Index,
29673013 /// Populated if linksection(A) is present.
29683014 section_expr: Index,
29693015 /// Populated if callconv(A) is present.
lib/std/zig/parse.zig+81-26
......@@ -629,7 +629,7 @@ const Parser = struct {
629629 };
630630 }
631631
632 /// FnProto <- KEYWORD_fn IDENTIFIER? LPAREN ParamDeclList RPAREN ByteAlign? LinkSection? CallConv? EXCLAMATIONMARK? TypeExpr
632 /// FnProto <- KEYWORD_fn IDENTIFIER? LPAREN ParamDeclList RPAREN ByteAlign? AddrSpace? LinkSection? CallConv? EXCLAMATIONMARK? TypeExpr
633633 fn parseFnProto(p: *Parser) !Node.Index {
634634 const fn_token = p.eatToken(.keyword_fn) orelse return null_node;
635635
......@@ -639,6 +639,7 @@ const Parser = struct {
639639 _ = p.eatToken(.identifier);
640640 const params = try p.parseParamDeclList();
641641 const align_expr = try p.parseByteAlign();
642 const addrspace_expr = try p.parseAddrSpace();
642643 const section_expr = try p.parseLinkSection();
643644 const callconv_expr = try p.parseCallconv();
644645 _ = p.eatToken(.bang);
......@@ -650,7 +651,7 @@ const Parser = struct {
650651 try p.warn(.expected_return_type);
651652 }
652653
653 if (align_expr == 0 and section_expr == 0 and callconv_expr == 0) {
654 if (align_expr == 0 and section_expr == 0 and callconv_expr == 0 and addrspace_expr == 0) {
654655 switch (params) {
655656 .zero_or_one => |param| return p.setNode(fn_proto_index, .{
656657 .tag = .fn_proto_simple,
......@@ -683,6 +684,7 @@ const Parser = struct {
683684 .lhs = try p.addExtra(Node.FnProtoOne{
684685 .param = param,
685686 .align_expr = align_expr,
687 .addrspace_expr = addrspace_expr,
686688 .section_expr = section_expr,
687689 .callconv_expr = callconv_expr,
688690 }),
......@@ -698,6 +700,7 @@ const Parser = struct {
698700 .params_start = span.start,
699701 .params_end = span.end,
700702 .align_expr = align_expr,
703 .addrspace_expr = addrspace_expr,
701704 .section_expr = section_expr,
702705 .callconv_expr = callconv_expr,
703706 }),
......@@ -708,7 +711,7 @@ const Parser = struct {
708711 }
709712 }
710713
711 /// VarDecl <- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteAlign? LinkSection? (EQUAL Expr)? SEMICOLON
714 /// VarDecl <- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteAlign? AddrSpace? LinkSection? (EQUAL Expr)? SEMICOLON
712715 fn parseVarDecl(p: *Parser) !Node.Index {
713716 const mut_token = p.eatToken(.keyword_const) orelse
714717 p.eatToken(.keyword_var) orelse
......@@ -717,9 +720,10 @@ const Parser = struct {
717720 _ = try p.expectToken(.identifier);
718721 const type_node: Node.Index = if (p.eatToken(.colon) == null) 0 else try p.expectTypeExpr();
719722 const align_node = try p.parseByteAlign();
723 const addrspace_node = try p.parseAddrSpace();
720724 const section_node = try p.parseLinkSection();
721725 const init_node: Node.Index = if (p.eatToken(.equal) == null) 0 else try p.expectExpr();
722 if (section_node == 0) {
726 if (section_node == 0 and addrspace_node == 0) {
723727 if (align_node == 0) {
724728 return p.addNode(.{
725729 .tag = .simple_var_decl,
......@@ -759,6 +763,7 @@ const Parser = struct {
759763 .lhs = try p.addExtra(Node.GlobalVarDecl{
760764 .type_node = type_node,
761765 .align_node = align_node,
766 .addrspace_node = addrspace_node,
762767 .section_node = section_node,
763768 }),
764769 .rhs = init_node,
......@@ -1440,8 +1445,8 @@ const Parser = struct {
14401445 /// PrefixTypeOp
14411446 /// <- QUESTIONMARK
14421447 /// / KEYWORD_anyframe MINUSRARROW
1443 /// / SliceTypeStart (ByteAlign / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)*
1444 /// / PtrTypeStart (KEYWORD_align LPAREN Expr (COLON INTEGER COLON INTEGER)? RPAREN / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)*
1448 /// / SliceTypeStart (ByteAlign / AddrSpace / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)*
1449 /// / PtrTypeStart (AddrSpace / KEYWORD_align LPAREN Expr (COLON INTEGER COLON INTEGER)? RPAREN / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)*
14451450 /// / ArrayTypeStart
14461451 /// SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET
14471452 /// PtrTypeStart
......@@ -1474,29 +1479,43 @@ const Parser = struct {
14741479 const asterisk = p.nextToken();
14751480 const mods = try p.parsePtrModifiers();
14761481 const elem_type = try p.expectTypeExpr();
1477 if (mods.bit_range_start == 0) {
1482 if (mods.bit_range_start != 0) {
14781483 return p.addNode(.{
1479 .tag = .ptr_type_aligned,
1484 .tag = .ptr_type_bit_range,
14801485 .main_token = asterisk,
14811486 .data = .{
1482 .lhs = mods.align_node,
1487 .lhs = try p.addExtra(Node.PtrTypeBitRange{
1488 .sentinel = 0,
1489 .align_node = mods.align_node,
1490 .addrspace_node = mods.addrspace_node,
1491 .bit_range_start = mods.bit_range_start,
1492 .bit_range_end = mods.bit_range_end,
1493 }),
14831494 .rhs = elem_type,
14841495 },
14851496 });
1486 } else {
1497 } else if (mods.addrspace_node != 0) {
14871498 return p.addNode(.{
1488 .tag = .ptr_type_bit_range,
1499 .tag = .ptr_type,
14891500 .main_token = asterisk,
14901501 .data = .{
1491 .lhs = try p.addExtra(Node.PtrTypeBitRange{
1502 .lhs = try p.addExtra(Node.PtrType{
14921503 .sentinel = 0,
14931504 .align_node = mods.align_node,
1494 .bit_range_start = mods.bit_range_start,
1495 .bit_range_end = mods.bit_range_end,
1505 .addrspace_node = mods.addrspace_node,
14961506 }),
14971507 .rhs = elem_type,
14981508 },
14991509 });
1510 } else {
1511 return p.addNode(.{
1512 .tag = .ptr_type_aligned,
1513 .main_token = asterisk,
1514 .data = .{
1515 .lhs = mods.align_node,
1516 .rhs = elem_type,
1517 },
1518 });
15001519 }
15011520 },
15021521 .asterisk_asterisk => {
......@@ -1504,29 +1523,43 @@ const Parser = struct {
15041523 const mods = try p.parsePtrModifiers();
15051524 const elem_type = try p.expectTypeExpr();
15061525 const inner: Node.Index = inner: {
1507 if (mods.bit_range_start == 0) {
1526 if (mods.bit_range_start != 0) {
15081527 break :inner try p.addNode(.{
1509 .tag = .ptr_type_aligned,
1528 .tag = .ptr_type_bit_range,
15101529 .main_token = asterisk,
15111530 .data = .{
1512 .lhs = mods.align_node,
1531 .lhs = try p.addExtra(Node.PtrTypeBitRange{
1532 .sentinel = 0,
1533 .align_node = mods.align_node,
1534 .addrspace_node = mods.addrspace_node,
1535 .bit_range_start = mods.bit_range_start,
1536 .bit_range_end = mods.bit_range_end,
1537 }),
15131538 .rhs = elem_type,
15141539 },
15151540 });
1516 } else {
1541 } else if (mods.addrspace_node != 0) {
15171542 break :inner try p.addNode(.{
1518 .tag = .ptr_type_bit_range,
1543 .tag = .ptr_type,
15191544 .main_token = asterisk,
15201545 .data = .{
1521 .lhs = try p.addExtra(Node.PtrTypeBitRange{
1546 .lhs = try p.addExtra(Node.PtrType{
15221547 .sentinel = 0,
15231548 .align_node = mods.align_node,
1524 .bit_range_start = mods.bit_range_start,
1525 .bit_range_end = mods.bit_range_end,
1549 .addrspace_node = mods.addrspace_node,
15261550 }),
15271551 .rhs = elem_type,
15281552 },
15291553 });
1554 } else {
1555 break :inner try p.addNode(.{
1556 .tag = .ptr_type_aligned,
1557 .main_token = asterisk,
1558 .data = .{
1559 .lhs = mods.align_node,
1560 .rhs = elem_type,
1561 },
1562 });
15301563 }
15311564 };
15321565 return p.addNode(.{
......@@ -1560,7 +1593,7 @@ const Parser = struct {
15601593 const mods = try p.parsePtrModifiers();
15611594 const elem_type = try p.expectTypeExpr();
15621595 if (mods.bit_range_start == 0) {
1563 if (sentinel == 0) {
1596 if (sentinel == 0 and mods.addrspace_node == 0) {
15641597 return p.addNode(.{
15651598 .tag = .ptr_type_aligned,
15661599 .main_token = asterisk,
......@@ -1569,7 +1602,7 @@ const Parser = struct {
15691602 .rhs = elem_type,
15701603 },
15711604 });
1572 } else if (mods.align_node == 0) {
1605 } else if (mods.align_node == 0 and mods.addrspace_node == 0) {
15731606 return p.addNode(.{
15741607 .tag = .ptr_type_sentinel,
15751608 .main_token = asterisk,
......@@ -1586,6 +1619,7 @@ const Parser = struct {
15861619 .lhs = try p.addExtra(Node.PtrType{
15871620 .sentinel = sentinel,
15881621 .align_node = mods.align_node,
1622 .addrspace_node = mods.addrspace_node,
15891623 }),
15901624 .rhs = elem_type,
15911625 },
......@@ -1599,6 +1633,7 @@ const Parser = struct {
15991633 .lhs = try p.addExtra(Node.PtrTypeBitRange{
16001634 .sentinel = sentinel,
16011635 .align_node = mods.align_node,
1636 .addrspace_node = mods.addrspace_node,
16021637 .bit_range_start = mods.bit_range_start,
16031638 .bit_range_end = mods.bit_range_end,
16041639 }),
......@@ -1624,7 +1659,7 @@ const Parser = struct {
16241659 .token = p.nodes.items(.main_token)[mods.bit_range_start],
16251660 });
16261661 }
1627 if (sentinel == 0) {
1662 if (sentinel == 0 and mods.addrspace_node == 0) {
16281663 return p.addNode(.{
16291664 .tag = .ptr_type_aligned,
16301665 .main_token = lbracket,
......@@ -1633,7 +1668,7 @@ const Parser = struct {
16331668 .rhs = elem_type,
16341669 },
16351670 });
1636 } else if (mods.align_node == 0) {
1671 } else if (mods.align_node == 0 and mods.addrspace_node == 0) {
16371672 return p.addNode(.{
16381673 .tag = .ptr_type_sentinel,
16391674 .main_token = lbracket,
......@@ -1650,6 +1685,7 @@ const Parser = struct {
16501685 .lhs = try p.addExtra(Node.PtrType{
16511686 .sentinel = sentinel,
16521687 .align_node = mods.align_node,
1688 .addrspace_node = mods.addrspace_node,
16531689 }),
16541690 .rhs = elem_type,
16551691 },
......@@ -1661,6 +1697,7 @@ const Parser = struct {
16611697 .keyword_const,
16621698 .keyword_volatile,
16631699 .keyword_allowzero,
1700 .keyword_addrspace,
16641701 => return p.fail(.ptr_mod_on_array_child_type),
16651702 else => {},
16661703 }
......@@ -2879,6 +2916,15 @@ const Parser = struct {
28792916 return expr_node;
28802917 }
28812918
2919 /// AddrSpace <- KEYWORD_addrspace LPAREN Expr RPAREN
2920 fn parseAddrSpace(p: *Parser) !Node.Index {
2921 _ = p.eatToken(.keyword_addrspace) orelse return null_node;
2922 _ = try p.expectToken(.l_paren);
2923 const expr_node = try p.expectExpr();
2924 _ = try p.expectToken(.r_paren);
2925 return expr_node;
2926 }
2927
28822928 /// ParamDecl
28832929 /// <- (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType
28842930 /// / DOT3
......@@ -3011,6 +3057,7 @@ const Parser = struct {
30113057
30123058 const PtrModifiers = struct {
30133059 align_node: Node.Index,
3060 addrspace_node: Node.Index,
30143061 bit_range_start: Node.Index,
30153062 bit_range_end: Node.Index,
30163063 };
......@@ -3018,12 +3065,14 @@ const Parser = struct {
30183065 fn parsePtrModifiers(p: *Parser) !PtrModifiers {
30193066 var result: PtrModifiers = .{
30203067 .align_node = 0,
3068 .addrspace_node = 0,
30213069 .bit_range_start = 0,
30223070 .bit_range_end = 0,
30233071 };
30243072 var saw_const = false;
30253073 var saw_volatile = false;
30263074 var saw_allowzero = false;
3075 var saw_addrspace = false;
30273076 while (true) {
30283077 switch (p.token_tags[p.tok_i]) {
30293078 .keyword_align => {
......@@ -3063,6 +3112,12 @@ const Parser = struct {
30633112 p.tok_i += 1;
30643113 saw_allowzero = true;
30653114 },
3115 .keyword_addrspace => {
3116 if (saw_addrspace) {
3117 try p.warn(.extra_addrspace_qualifier);
3118 }
3119 result.addrspace_node = try p.parseAddrSpace();
3120 },
30663121 else => return result,
30673122 }
30683123 }
lib/std/zig/tokenizer.zig+3
......@@ -11,6 +11,7 @@ pub const Token = struct {
1111 };
1212
1313 pub const keywords = std.ComptimeStringMap(Tag, .{
14 .{ "addrspace", .keyword_addrspace },
1415 .{ "align", .keyword_align },
1516 .{ "allowzero", .keyword_allowzero },
1617 .{ "and", .keyword_and },
......@@ -132,6 +133,7 @@ pub const Token = struct {
132133 float_literal,
133134 doc_comment,
134135 container_doc_comment,
136 keyword_addrspace,
135137 keyword_align,
136138 keyword_allowzero,
137139 keyword_and,
......@@ -251,6 +253,7 @@ pub const Token = struct {
251253 .angle_bracket_angle_bracket_right => ">>",
252254 .angle_bracket_angle_bracket_right_equal => ">>=",
253255 .tilde => "~",
256 .keyword_addrspace => "addrspace",
254257 .keyword_align => "align",
255258 .keyword_allowzero => "allowzero",
256259 .keyword_and => "and",
src/translate_c/ast.zig+1
......@@ -2614,6 +2614,7 @@ fn renderVar(c: *Context, node: Node) !NodeIndex {
26142614 .type_node = type_node,
26152615 .align_node = align_node,
26162616 .section_node = section_node,
2617 .addrspace_node = 0,
26172618 }),
26182619 .rhs = init_node,
26192620 },