| ... | ... | @@ -850,6 +850,7 @@ fn transStmt( |
| 850 | 850 | .CharacterLiteralClass => return transCharLiteral(rp, scope, @ptrCast(*const ZigClangCharacterLiteral, stmt), result_used), |
| 851 | 851 | .StmtExprClass => return transStmtExpr(rp, scope, @ptrCast(*const ZigClangStmtExpr, stmt), result_used), |
| 852 | 852 | .MemberExprClass => return transMemberExpr(rp, scope, @ptrCast(*const ZigClangMemberExpr, stmt), result_used), |
| 853 | .ArraySubscriptExprClass => return transArrayAccess(rp, scope, @ptrCast(*const ZigClangArraySubscriptExpr, stmt), result_used), |
| 853 | 854 | else => { |
| 854 | 855 | return revertAndWarn( |
| 855 | 856 | rp, |
| ... | ... | @@ -1523,7 +1524,7 @@ fn transInitListExpr( |
| 1523 | 1524 | var cat_tok: ast.TokenIndex = undefined; |
| 1524 | 1525 | if (init_count != 0) { |
| 1525 | 1526 | const dot_tok = try appendToken(rp.c, .Period, "."); |
| 1526 | | init_node = try transCreateNodeArrayInitializer(rp.c, dot_tok); |
| 1527 | init_node = try transCreateNodeContainerInitializer(rp.c, dot_tok); |
| 1527 | 1528 | var i: c_uint = 0; |
| 1528 | 1529 | while (i < init_count) : (i += 1) { |
| 1529 | 1530 | const elem_expr = ZigClangInitListExpr_getInit(expr, i); |
| ... | ... | @@ -1538,7 +1539,7 @@ fn transInitListExpr( |
| 1538 | 1539 | } |
| 1539 | 1540 | |
| 1540 | 1541 | const dot_tok = try appendToken(rp.c, .Period, "."); |
| 1541 | | var filler_init_node = try transCreateNodeArrayInitializer(rp.c, dot_tok); |
| 1542 | var filler_init_node = try transCreateNodeContainerInitializer(rp.c, dot_tok); |
| 1542 | 1543 | const filler_val_expr = ZigClangInitListExpr_getArrayFiller(expr); |
| 1543 | 1544 | try filler_init_node.op.ArrayInitializer.push(try transExpr(rp, scope, filler_val_expr, .used, .r_value)); |
| 1544 | 1545 | filler_init_node.rtoken = try appendToken(rp.c, .RBrace, "}"); |
| ... | ... | @@ -1995,6 +1996,14 @@ fn transMemberExpr(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangMemberE |
| 1995 | 1996 | return maybeSuppressResult(rp, scope, result_used, node); |
| 1996 | 1997 | } |
| 1997 | 1998 | |
| 1999 | fn transArrayAccess(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangArraySubscriptExpr, result_used: ResultUsed) TransError!*ast.Node { |
| 2000 | const container_node = try transExpr(rp, scope, ZigClangArraySubscriptExpr_getBase(stmt), .used, .r_value); |
| 2001 | const node = try transCreateNodeArrayAccess(rp.c, container_node); |
| 2002 | node.op.ArrayAccess = try transExpr(rp, scope, ZigClangArraySubscriptExpr_getIdx(stmt), .used, .r_value); |
| 2003 | node.rtoken = try appendToken(rp.c, .RBrace, "]"); |
| 2004 | return maybeSuppressResult(rp, scope, result_used, &node.base); |
| 2005 | } |
| 2006 | |
| 1998 | 2007 | fn transCPtrCast( |
| 1999 | 2008 | rp: RestorePoint, |
| 2000 | 2009 | loc: ZigClangSourceLocation, |
| ... | ... | @@ -2643,7 +2652,7 @@ fn transCreateNodeBoolLiteral(c: *Context, value: bool) !*ast.Node { |
| 2643 | 2652 | return &node.base; |
| 2644 | 2653 | } |
| 2645 | 2654 | |
| 2646 | | fn transCreateNodeArrayInitializer(c: *Context, dot_tok: ast.TokenIndex) !*ast.Node.SuffixOp { |
| 2655 | fn transCreateNodeContainerInitializer(c: *Context, dot_tok: ast.TokenIndex) !*ast.Node.SuffixOp { |
| 2647 | 2656 | _ = try appendToken(c, .LBrace, "{"); |
| 2648 | 2657 | const node = try c.a().create(ast.Node.SuffixOp); |
| 2649 | 2658 | node.* = ast.Node.SuffixOp{ |
| ... | ... | @@ -2972,6 +2981,19 @@ fn transCreateNodePtrDeref(c: *Context, lhs: *ast.Node) !*ast.Node { |
| 2972 | 2981 | return &node.base; |
| 2973 | 2982 | } |
| 2974 | 2983 | |
| 2984 | fn transCreateNodeArrayAccess(c: *Context, lhs: *ast.Node) !*ast.Node.SuffixOp { |
| 2985 | _ = try appendToken(c, .LBrace, "["); |
| 2986 | const node = try c.a().create(ast.Node.SuffixOp); |
| 2987 | node.* = .{ |
| 2988 | .lhs = .{ .node = lhs }, |
| 2989 | .op = .{ |
| 2990 | .ArrayAccess = undefined, |
| 2991 | }, |
| 2992 | .rtoken = undefined, |
| 2993 | }; |
| 2994 | return node; |
| 2995 | } |
| 2996 | |
| 2975 | 2997 | const RestorePoint = struct { |
| 2976 | 2998 | c: *Context, |
| 2977 | 2999 | token_index: ast.TokenIndex, |
| ... | ... | @@ -3869,26 +3891,14 @@ fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc |
| 3869 | 3891 | .Dot => { |
| 3870 | 3892 | const name_tok = it.next().?; |
| 3871 | 3893 | if (name_tok.id != .Identifier) |
| 3872 | | return revertAndWarn( |
| 3873 | | rp, |
| 3874 | | error.ParseError, |
| 3875 | | source_loc, |
| 3876 | | "unable to translate C expr", |
| 3877 | | .{}, |
| 3878 | | ); |
| 3894 | return error.ParseError; |
| 3879 | 3895 | |
| 3880 | 3896 | node = try transCreateNodeFieldAccess(rp.c, node, name_tok.bytes); |
| 3881 | 3897 | }, |
| 3882 | 3898 | .Arrow => { |
| 3883 | 3899 | const name_tok = it.next().?; |
| 3884 | 3900 | if (name_tok.id != .Identifier) |
| 3885 | | return revertAndWarn( |
| 3886 | | rp, |
| 3887 | | error.ParseError, |
| 3888 | | source_loc, |
| 3889 | | "unable to translate C expr", |
| 3890 | | .{}, |
| 3891 | | ); |
| 3901 | return error.ParseError; |
| 3892 | 3902 | |
| 3893 | 3903 | const deref = try transCreateNodePtrDeref(rp.c, node); |
| 3894 | 3904 | node = try transCreateNodeFieldAccess(rp.c, deref, name_tok.bytes); |
| ... | ... | @@ -3929,6 +3939,14 @@ fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc |
| 3929 | 3939 | }; |
| 3930 | 3940 | node = &bitshift_node.base; |
| 3931 | 3941 | }, |
| 3942 | .LBrace => { |
| 3943 | const arr_node = try transCreateNodeArrayAccess(rp.c, node); |
| 3944 | arr_node.op.ArrayAccess = try parseCPrimaryExpr(rp, it, source_loc, scope); |
| 3945 | arr_node.rtoken = try appendToken(rp.c, .RBrace, "]"); |
| 3946 | node = &arr_node.base; |
| 3947 | if (it.next().?.id != .RBrace) |
| 3948 | return error.ParseError; |
| 3949 | }, |
| 3932 | 3950 | else => { |
| 3933 | 3951 | _ = it.prev(); |
| 3934 | 3952 | return node; |