From 4ab2f947f9fcd2c6a4181c509d7c1ab27c6e4d58 Mon Sep 17 00:00:00 2001 From: Vexu Date: Tue, 4 Aug 2020 00:44:45 +0300 Subject: [PATCH] translate-c: recognize other type trait expressions Closes #5979 --- src-self-hosted/clang.zig | 9 +++++++++ src-self-hosted/translate_c.zig | 21 +++++++++++++++++++-- src/zig_clang.cpp | 8 ++++++++ src/zig_clang.h | 9 +++++++++ test/translate_c.zig | 10 ++++++++++ 5 files changed, 55 insertions(+), 2 deletions(-) diff --git a/src-self-hosted/clang.zig b/src-self-hosted/clang.zig index 624dbe1dad..6222f3d8e4 100644 --- a/src-self-hosted/clang.zig +++ b/src-self-hosted/clang.zig @@ -773,6 +773,14 @@ pub const ZigClangExpr_ConstExprUsage = extern enum { EvaluateForMangling, }; +pub const ZigClangUnaryExprOrTypeTrait_Kind = extern enum { + SizeOf, + AlignOf, + VecStep, + OpenMPRequiredSimdAlign, + PreferredAlignOf, +}; + pub extern fn ZigClangSourceManager_getSpellingLoc(self: ?*const struct_ZigClangSourceManager, Loc: struct_ZigClangSourceLocation) struct_ZigClangSourceLocation; pub extern fn ZigClangSourceManager_getFilename(self: *const struct_ZigClangSourceManager, SpellingLoc: struct_ZigClangSourceLocation) ?[*:0]const u8; pub 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 pub extern fn ZigClangUnaryExprOrTypeTraitExpr_getTypeOfArgument(*const ZigClangUnaryExprOrTypeTraitExpr) ZigClangQualType; pub extern fn ZigClangUnaryExprOrTypeTraitExpr_getBeginLoc(*const ZigClangUnaryExprOrTypeTraitExpr) ZigClangSourceLocation; +pub extern fn ZigClangUnaryExprOrTypeTraitExpr_getKind(*const ZigClangUnaryExprOrTypeTraitExpr) ZigClangUnaryExprOrTypeTrait_Kind; pub extern fn ZigClangUnaryOperator_getOpcode(*const ZigClangUnaryOperator) ZigClangUO; pub extern fn ZigClangUnaryOperator_getType(*const ZigClangUnaryOperator) ZigClangQualType; diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index 023ac78459..2bd38d9f1c 100644 --- a/src-self-hosted/translate_c.zig +++ b/src-self-hosted/translate_c.zig @@ -3068,13 +3068,30 @@ fn transUnaryExprOrTypeTraitExpr( stmt: *const ZigClangUnaryExprOrTypeTraitExpr, result_used: ResultUsed, ) TransError!*ast.Node { + const loc = ZigClangUnaryExprOrTypeTraitExpr_getBeginLoc(stmt); const type_node = try transQualType( rp, ZigClangUnaryExprOrTypeTraitExpr_getTypeOfArgument(stmt), - ZigClangUnaryExprOrTypeTraitExpr_getBeginLoc(stmt), + loc, ); - const builtin_node = try rp.c.createBuiltinCall("@sizeOf", 1); + const kind = ZigClangUnaryExprOrTypeTraitExpr_getKind(stmt); + const kind_str = switch (kind) { + .SizeOf => "@sizeOf", + .AlignOf => "@alignOf", + .PreferredAlignOf, + .VecStep, + .OpenMPRequiredSimdAlign, + => return revertAndWarn( + rp, + error.UnsupportedTranslation, + loc, + "Unsupported type trait kind {}", + .{kind}, + ), + }; + + const builtin_node = try rp.c.createBuiltinCall(kind_str, 1); builtin_node.params()[0] = type_node; builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")"); return maybeSuppressResult(rp, scope, result_used, &builtin_node.base); diff --git a/src/zig_clang.cpp b/src/zig_clang.cpp index aca20779ad..f333a6b7a0 100644 --- a/src/zig_clang.cpp +++ b/src/zig_clang.cpp @@ -2714,6 +2714,14 @@ struct ZigClangSourceLocation ZigClangUnaryExprOrTypeTraitExpr_getBeginLoc( return bitcast(casted->getBeginLoc()); } + +enum ZigClangUnaryExprOrTypeTrait_Kind ZigClangUnaryExprOrTypeTraitExpr_getKind( + const struct ZigClangUnaryExprOrTypeTraitExpr *self) +{ + auto casted = reinterpret_cast(self); + return (ZigClangUnaryExprOrTypeTrait_Kind)casted->getKind(); +} + const struct ZigClangStmt *ZigClangDoStmt_getBody(const struct ZigClangDoStmt *self) { auto casted = reinterpret_cast(self); return reinterpret_cast(casted->getBody()); diff --git a/src/zig_clang.h b/src/zig_clang.h index 272064a0ef..94a37d98c7 100644 --- a/src/zig_clang.h +++ b/src/zig_clang.h @@ -845,6 +845,14 @@ enum ZigClangExpr_ConstExprUsage { ZigClangExpr_EvaluateForMangling, }; +enum ZigClangUnaryExprOrTypeTrait_Kind { + ZigClangUnaryExprOrTypeTrait_KindSizeOf, + ZigClangUnaryExprOrTypeTrait_KindAlignOf, + ZigClangUnaryExprOrTypeTrait_KindVecStep, + ZigClangUnaryExprOrTypeTrait_KindOpenMPRequiredSimdAlign, + ZigClangUnaryExprOrTypeTrait_KindPreferredAlignOf, +}; + ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangSourceManager_getSpellingLoc(const struct ZigClangSourceManager *, struct ZigClangSourceLocation Loc); ZIG_EXTERN_C const char *ZigClangSourceManager_getFilename(const struct ZigClangSourceManager *, @@ -1134,6 +1142,7 @@ ZIG_EXTERN_C const struct ZigClangExpr *ZigClangArraySubscriptExpr_getIdx(const ZIG_EXTERN_C struct ZigClangQualType ZigClangUnaryExprOrTypeTraitExpr_getTypeOfArgument(const struct ZigClangUnaryExprOrTypeTraitExpr *); ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangUnaryExprOrTypeTraitExpr_getBeginLoc(const struct ZigClangUnaryExprOrTypeTraitExpr *); +ZIG_EXTERN_C enum ZigClangUnaryExprOrTypeTrait_Kind ZigClangUnaryExprOrTypeTraitExpr_getKind(const struct ZigClangUnaryExprOrTypeTraitExpr *); ZIG_EXTERN_C const struct ZigClangStmt *ZigClangDoStmt_getBody(const struct ZigClangDoStmt *); ZIG_EXTERN_C const struct ZigClangExpr *ZigClangDoStmt_getCond(const struct ZigClangDoStmt *); diff --git a/test/translate_c.zig b/test/translate_c.zig index c1c4ef07fa..07719466d6 100644 --- a/test/translate_c.zig +++ b/test/translate_c.zig @@ -3,6 +3,16 @@ const std = @import("std"); const CrossTarget = std.zig.CrossTarget; pub fn addCases(cases: *tests.TranslateCContext) void { + cases.add("alignof", + \\int main() { + \\ int a = _Alignof(int); + \\} + , &[_][]const u8{ + \\pub export fn main() c_int { + \\ var a: c_int = @bitCast(c_int, @truncate(c_uint, @alignOf(c_int))); + \\} + }); + cases.add("initializer list macro", \\typedef struct Color { \\ unsigned char r;