mirror of
https://github.com/ziglang/zig.git
synced 2026-01-06 21:43:25 +00:00
translate-c: Add compound literal support
This commit is contained in:
parent
b988815bf0
commit
c760532be0
@ -271,6 +271,11 @@ pub const CompoundAssignOperator = opaque {
|
||||
extern fn ZigClangCompoundAssignOperator_getRHS(*const CompoundAssignOperator) *const Expr;
|
||||
};
|
||||
|
||||
pub const CompoundLiteralExpr = opaque {
|
||||
pub const getInitializer = ZigClangCompoundLiteralExpr_getInitializer;
|
||||
extern fn ZigClangCompoundLiteralExpr_getInitializer(*const CompoundLiteralExpr) *const Expr;
|
||||
};
|
||||
|
||||
pub const CompoundStmt = opaque {
|
||||
pub const body_begin = ZigClangCompoundStmt_body_begin;
|
||||
extern fn ZigClangCompoundStmt_body_begin(*const CompoundStmt) ConstBodyIterator;
|
||||
|
||||
@ -1054,6 +1054,10 @@ fn transStmt(
|
||||
return maybeSuppressResult(c, scope, result_used, expr);
|
||||
},
|
||||
.OffsetOfExprClass => return transOffsetOfExpr(c, scope, @ptrCast(*const clang.OffsetOfExpr, stmt), result_used),
|
||||
.CompoundLiteralExprClass => {
|
||||
const compound_literal = @ptrCast(*const clang.CompoundLiteralExpr, stmt);
|
||||
return transExpr(c, scope, compound_literal.getInitializer(), result_used);
|
||||
},
|
||||
else => {
|
||||
return fail(c, error.UnsupportedTranslation, stmt.getBeginLoc(), "TODO implement translation of stmt class {s}", .{@tagName(sc)});
|
||||
},
|
||||
@ -2560,8 +2564,8 @@ fn transConstantExpr(c: *Context, scope: *Scope, expr: *const clang.Expr, used:
|
||||
});
|
||||
return maybeSuppressResult(c, scope, used, as_node);
|
||||
},
|
||||
else => {
|
||||
return fail(c, error.UnsupportedTranslation, expr.getBeginLoc(), "unsupported constant expression kind", .{});
|
||||
else => |kind| {
|
||||
return fail(c, error.UnsupportedTranslation, expr.getBeginLoc(), "unsupported constant expression kind '{s}'", .{kind});
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@ -2808,6 +2808,11 @@ const struct ZigClangExpr *ZigClangCompoundAssignOperator_getRHS(const struct Zi
|
||||
return reinterpret_cast<const struct ZigClangExpr *>(casted->getRHS());
|
||||
}
|
||||
|
||||
const struct ZigClangExpr *ZigClangCompoundLiteralExpr_getInitializer(const ZigClangCompoundLiteralExpr *self) {
|
||||
auto casted = reinterpret_cast<const clang::CompoundLiteralExpr *>(self);
|
||||
return reinterpret_cast<const ZigClangExpr *>(casted->getInitializer());
|
||||
}
|
||||
|
||||
enum ZigClangUO ZigClangUnaryOperator_getOpcode(const struct ZigClangUnaryOperator *self) {
|
||||
auto casted = reinterpret_cast<const clang::UnaryOperator *>(self);
|
||||
return (ZigClangUO)casted->getOpcode();
|
||||
|
||||
@ -1217,6 +1217,8 @@ ZIG_EXTERN_C enum ZigClangBO ZigClangCompoundAssignOperator_getOpcode(const stru
|
||||
ZIG_EXTERN_C const struct ZigClangExpr *ZigClangCompoundAssignOperator_getLHS(const struct ZigClangCompoundAssignOperator *);
|
||||
ZIG_EXTERN_C const struct ZigClangExpr *ZigClangCompoundAssignOperator_getRHS(const struct ZigClangCompoundAssignOperator *);
|
||||
|
||||
ZIG_EXTERN_C const struct ZigClangExpr *ZigClangCompoundLiteralExpr_getInitializer(const struct ZigClangCompoundLiteralExpr *);
|
||||
|
||||
ZIG_EXTERN_C enum ZigClangUO ZigClangUnaryOperator_getOpcode(const struct ZigClangUnaryOperator *);
|
||||
ZIG_EXTERN_C struct ZigClangQualType ZigClangUnaryOperator_getType(const struct ZigClangUnaryOperator *);
|
||||
ZIG_EXTERN_C const struct ZigClangExpr *ZigClangUnaryOperator_getSubExpr(const struct ZigClangUnaryOperator *);
|
||||
|
||||
@ -1171,4 +1171,20 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void {
|
||||
\\ return 0;
|
||||
\\}
|
||||
, "");
|
||||
|
||||
cases.add("Compound literals",
|
||||
\\#include <stdlib.h>
|
||||
\\struct Foo {
|
||||
\\ int a;
|
||||
\\ char b[2];
|
||||
\\ float c;
|
||||
\\};
|
||||
\\int main() {
|
||||
\\ struct Foo foo;
|
||||
\\ int x = 1, y = 2;
|
||||
\\ foo = (struct Foo) {x + y, {'a', 'b'}, 42.0f};
|
||||
\\ if (foo.a != x + y || foo.b[0] != 'a' || foo.b[1] != 'b' || foo.c != 42.0f) abort();
|
||||
\\ return 0;
|
||||
\\}
|
||||
, "");
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user