authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-08-04 00:44:45+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-08-04 00:48:29+03:00
log4ab2f947f9fcd2c6a4181c509d7c1ab27c6e4d58
treef089c88ba379215a5eba193456730d0ec27874cc
parentc0654d2db2cd66ee59f2147fbbb19d890e70bed1
signature Commit is signed but in an unrecognized format.

translate-c: recognize other type trait expressions

Closes #5979

5 files changed, 55 insertions(+), 2 deletions(-)

src-self-hosted/clang.zig+9
......@@ -773,6 +773,14 @@ pub const ZigClangExpr_ConstExprUsage = extern enum {
773773 EvaluateForMangling,
774774};
775775
776pub const ZigClangUnaryExprOrTypeTrait_Kind = extern enum {
777 SizeOf,
778 AlignOf,
779 VecStep,
780 OpenMPRequiredSimdAlign,
781 PreferredAlignOf,
782};
783
776784pub extern fn ZigClangSourceManager_getSpellingLoc(self: ?*const struct_ZigClangSourceManager, Loc: struct_ZigClangSourceLocation) struct_ZigClangSourceLocation;
777785pub extern fn ZigClangSourceManager_getFilename(self: *const struct_ZigClangSourceManager, SpellingLoc: struct_ZigClangSourceLocation) ?[*:0]const u8;
778786pub extern fn ZigClangSourceManager_getSpellingLineNumber(self: ?*const struct_ZigClangSourceManager, Loc: struct_ZigClangSourceLocation) c_uint;
......@@ -1170,6 +1178,7 @@ pub extern fn ZigClangCallExpr_getArgs(*const ZigClangCallExpr) [*]const *const
11701178
11711179pub extern fn ZigClangUnaryExprOrTypeTraitExpr_getTypeOfArgument(*const ZigClangUnaryExprOrTypeTraitExpr) ZigClangQualType;
11721180pub extern fn ZigClangUnaryExprOrTypeTraitExpr_getBeginLoc(*const ZigClangUnaryExprOrTypeTraitExpr) ZigClangSourceLocation;
1181pub extern fn ZigClangUnaryExprOrTypeTraitExpr_getKind(*const ZigClangUnaryExprOrTypeTraitExpr) ZigClangUnaryExprOrTypeTrait_Kind;
11731182
11741183pub extern fn ZigClangUnaryOperator_getOpcode(*const ZigClangUnaryOperator) ZigClangUO;
11751184pub extern fn ZigClangUnaryOperator_getType(*const ZigClangUnaryOperator) ZigClangQualType;
src-self-hosted/translate_c.zig+19-2
......@@ -3068,13 +3068,30 @@ fn transUnaryExprOrTypeTraitExpr(
30683068 stmt: *const ZigClangUnaryExprOrTypeTraitExpr,
30693069 result_used: ResultUsed,
30703070) TransError!*ast.Node {
3071 const loc = ZigClangUnaryExprOrTypeTraitExpr_getBeginLoc(stmt);
30713072 const type_node = try transQualType(
30723073 rp,
30733074 ZigClangUnaryExprOrTypeTraitExpr_getTypeOfArgument(stmt),
3074 ZigClangUnaryExprOrTypeTraitExpr_getBeginLoc(stmt),
3075 loc,
30753076 );
30763077
3077 const builtin_node = try rp.c.createBuiltinCall("@sizeOf", 1);
3078 const kind = ZigClangUnaryExprOrTypeTraitExpr_getKind(stmt);
3079 const kind_str = switch (kind) {
3080 .SizeOf => "@sizeOf",
3081 .AlignOf => "@alignOf",
3082 .PreferredAlignOf,
3083 .VecStep,
3084 .OpenMPRequiredSimdAlign,
3085 => return revertAndWarn(
3086 rp,
3087 error.UnsupportedTranslation,
3088 loc,
3089 "Unsupported type trait kind {}",
3090 .{kind},
3091 ),
3092 };
3093
3094 const builtin_node = try rp.c.createBuiltinCall(kind_str, 1);
30783095 builtin_node.params()[0] = type_node;
30793096 builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")");
30803097 return maybeSuppressResult(rp, scope, result_used, &builtin_node.base);
src/zig_clang.cpp+8
......@@ -2714,6 +2714,14 @@ struct ZigClangSourceLocation ZigClangUnaryExprOrTypeTraitExpr_getBeginLoc(
27142714 return bitcast(casted->getBeginLoc());
27152715}
27162716
2717
2718enum ZigClangUnaryExprOrTypeTrait_Kind ZigClangUnaryExprOrTypeTraitExpr_getKind(
2719 const struct ZigClangUnaryExprOrTypeTraitExpr *self)
2720{
2721 auto casted = reinterpret_cast<const clang::UnaryExprOrTypeTraitExpr *>(self);
2722 return (ZigClangUnaryExprOrTypeTrait_Kind)casted->getKind();
2723}
2724
27172725const struct ZigClangStmt *ZigClangDoStmt_getBody(const struct ZigClangDoStmt *self) {
27182726 auto casted = reinterpret_cast<const clang::DoStmt *>(self);
27192727 return reinterpret_cast<const struct ZigClangStmt *>(casted->getBody());
src/zig_clang.h+9
......@@ -845,6 +845,14 @@ enum ZigClangExpr_ConstExprUsage {
845845 ZigClangExpr_EvaluateForMangling,
846846};
847847
848enum ZigClangUnaryExprOrTypeTrait_Kind {
849 ZigClangUnaryExprOrTypeTrait_KindSizeOf,
850 ZigClangUnaryExprOrTypeTrait_KindAlignOf,
851 ZigClangUnaryExprOrTypeTrait_KindVecStep,
852 ZigClangUnaryExprOrTypeTrait_KindOpenMPRequiredSimdAlign,
853 ZigClangUnaryExprOrTypeTrait_KindPreferredAlignOf,
854};
855
848856ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangSourceManager_getSpellingLoc(const struct ZigClangSourceManager *,
849857 struct ZigClangSourceLocation Loc);
850858ZIG_EXTERN_C const char *ZigClangSourceManager_getFilename(const struct ZigClangSourceManager *,
......@@ -1134,6 +1142,7 @@ ZIG_EXTERN_C const struct ZigClangExpr *ZigClangArraySubscriptExpr_getIdx(const
11341142
11351143ZIG_EXTERN_C struct ZigClangQualType ZigClangUnaryExprOrTypeTraitExpr_getTypeOfArgument(const struct ZigClangUnaryExprOrTypeTraitExpr *);
11361144ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangUnaryExprOrTypeTraitExpr_getBeginLoc(const struct ZigClangUnaryExprOrTypeTraitExpr *);
1145ZIG_EXTERN_C enum ZigClangUnaryExprOrTypeTrait_Kind ZigClangUnaryExprOrTypeTraitExpr_getKind(const struct ZigClangUnaryExprOrTypeTraitExpr *);
11371146
11381147ZIG_EXTERN_C const struct ZigClangStmt *ZigClangDoStmt_getBody(const struct ZigClangDoStmt *);
11391148ZIG_EXTERN_C const struct ZigClangExpr *ZigClangDoStmt_getCond(const struct ZigClangDoStmt *);
test/translate_c.zig+10
......@@ -3,6 +3,16 @@ const std = @import("std");
33const CrossTarget = std.zig.CrossTarget;
44
55pub fn addCases(cases: *tests.TranslateCContext) void {
6 cases.add("alignof",
7 \\int main() {
8 \\ int a = _Alignof(int);
9 \\}
10 , &[_][]const u8{
11 \\pub export fn main() c_int {
12 \\ var a: c_int = @bitCast(c_int, @truncate(c_uint, @alignOf(c_int)));
13 \\}
14 });
15
616 cases.add("initializer list macro",
717 \\typedef struct Color {
818 \\ unsigned char r;