| ... | @@ -850,6 +850,7 @@ fn transStmt( | ... | @@ -850,6 +850,7 @@ fn transStmt( |
| 850 | .CharacterLiteralClass => return transCharLiteral(rp, scope, @ptrCast(*const ZigClangCharacterLiteral, stmt), result_used), | 850 | .CharacterLiteralClass => return transCharLiteral(rp, scope, @ptrCast(*const ZigClangCharacterLiteral, stmt), result_used), |
| 851 | .StmtExprClass => return transStmtExpr(rp, scope, @ptrCast(*const ZigClangStmtExpr, stmt), result_used), | 851 | .StmtExprClass => return transStmtExpr(rp, scope, @ptrCast(*const ZigClangStmtExpr, stmt), result_used), |
| 852 | .MemberExprClass => return transMemberExpr(rp, scope, @ptrCast(*const ZigClangMemberExpr, stmt), result_used), | 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 | else => { | 854 | else => { |
| 854 | return revertAndWarn( | 855 | return revertAndWarn( |
| 855 | rp, | 856 | rp, |
| ... | @@ -1523,7 +1524,7 @@ fn transInitListExpr( | ... | @@ -1523,7 +1524,7 @@ fn transInitListExpr( |
| 1523 | var cat_tok: ast.TokenIndex = undefined; | 1524 | var cat_tok: ast.TokenIndex = undefined; |
| 1524 | if (init_count != 0) { | 1525 | if (init_count != 0) { |
| 1525 | const dot_tok = try appendToken(rp.c, .Period, "."); | 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 | var i: c_uint = 0; | 1528 | var i: c_uint = 0; |
| 1528 | while (i < init_count) : (i += 1) { | 1529 | while (i < init_count) : (i += 1) { |
| 1529 | const elem_expr = ZigClangInitListExpr_getInit(expr, i); | 1530 | const elem_expr = ZigClangInitListExpr_getInit(expr, i); |
| ... | @@ -1538,7 +1539,7 @@ fn transInitListExpr( | ... | @@ -1538,7 +1539,7 @@ fn transInitListExpr( |
| 1538 | } | 1539 | } |
| 1539 | | 1540 | |
| 1540 | const dot_tok = try appendToken(rp.c, .Period, "."); | 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 | const filler_val_expr = ZigClangInitListExpr_getArrayFiller(expr); | 1543 | const filler_val_expr = ZigClangInitListExpr_getArrayFiller(expr); |
| 1543 | try filler_init_node.op.ArrayInitializer.push(try transExpr(rp, scope, filler_val_expr, .used, .r_value)); | 1544 | try filler_init_node.op.ArrayInitializer.push(try transExpr(rp, scope, filler_val_expr, .used, .r_value)); |
| 1544 | filler_init_node.rtoken = try appendToken(rp.c, .RBrace, "}"); | 1545 | filler_init_node.rtoken = try appendToken(rp.c, .RBrace, "}"); |
| ... | @@ -1995,6 +1996,14 @@ fn transMemberExpr(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangMemberE | ... | @@ -1995,6 +1996,14 @@ fn transMemberExpr(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangMemberE |
| 1995 | return maybeSuppressResult(rp, scope, result_used, node); | 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 | fn transCPtrCast( | 2007 | fn transCPtrCast( |
| 1999 | rp: RestorePoint, | 2008 | rp: RestorePoint, |
| 2000 | loc: ZigClangSourceLocation, | 2009 | loc: ZigClangSourceLocation, |
| ... | @@ -2643,7 +2652,7 @@ fn transCreateNodeBoolLiteral(c: *Context, value: bool) !*ast.Node { | ... | @@ -2643,7 +2652,7 @@ fn transCreateNodeBoolLiteral(c: *Context, value: bool) !*ast.Node { |
| 2643 | return &node.base; | 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 | _ = try appendToken(c, .LBrace, "{"); | 2656 | _ = try appendToken(c, .LBrace, "{"); |
| 2648 | const node = try c.a().create(ast.Node.SuffixOp); | 2657 | const node = try c.a().create(ast.Node.SuffixOp); |
| 2649 | node.* = ast.Node.SuffixOp{ | 2658 | node.* = ast.Node.SuffixOp{ |
| ... | @@ -2972,6 +2981,19 @@ fn transCreateNodePtrDeref(c: *Context, lhs: *ast.Node) !*ast.Node { | ... | @@ -2972,6 +2981,19 @@ fn transCreateNodePtrDeref(c: *Context, lhs: *ast.Node) !*ast.Node { |
| 2972 | return &node.base; | 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 | const RestorePoint = struct { | 2997 | const RestorePoint = struct { |
| 2976 | c: *Context, | 2998 | c: *Context, |
| 2977 | token_index: ast.TokenIndex, | 2999 | token_index: ast.TokenIndex, |
| ... | @@ -3869,26 +3891,14 @@ fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc | ... | @@ -3869,26 +3891,14 @@ fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc |
| 3869 | .Dot => { | 3891 | .Dot => { |
| 3870 | const name_tok = it.next().?; | 3892 | const name_tok = it.next().?; |
| 3871 | if (name_tok.id != .Identifier) | 3893 | if (name_tok.id != .Identifier) |
| 3872 | return revertAndWarn( | 3894 | return error.ParseError; |
| 3873 | rp, | | |
| 3874 | error.ParseError, | | |
| 3875 | source_loc, | | |
| 3876 | "unable to translate C expr", | | |
| 3877 | .{}, | | |
| 3878 | ); | | |
| 3879 | | 3895 | |
| 3880 | node = try transCreateNodeFieldAccess(rp.c, node, name_tok.bytes); | 3896 | node = try transCreateNodeFieldAccess(rp.c, node, name_tok.bytes); |
| 3881 | }, | 3897 | }, |
| 3882 | .Arrow => { | 3898 | .Arrow => { |
| 3883 | const name_tok = it.next().?; | 3899 | const name_tok = it.next().?; |
| 3884 | if (name_tok.id != .Identifier) | 3900 | if (name_tok.id != .Identifier) |
| 3885 | return revertAndWarn( | 3901 | return error.ParseError; |
| 3886 | rp, | | |
| 3887 | error.ParseError, | | |
| 3888 | source_loc, | | |
| 3889 | "unable to translate C expr", | | |
| 3890 | .{}, | | |
| 3891 | ); | | |
| 3892 | | 3902 | |
| 3893 | const deref = try transCreateNodePtrDeref(rp.c, node); | 3903 | const deref = try transCreateNodePtrDeref(rp.c, node); |
| 3894 | node = try transCreateNodeFieldAccess(rp.c, deref, name_tok.bytes); | 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,6 +3939,14 @@ fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc |
| 3929 | }; | 3939 | }; |
| 3930 | node = &bitshift_node.base; | 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 | else => { | 3950 | else => { |
| 3933 | _ = it.prev(); | 3951 | _ = it.prev(); |
| 3934 | return node; | 3952 | return node; |