Commit 4ab2f947f9

Vexu <git@vexu.eu>
2020-08-03 23:44:45
translate-c: recognize other type trait expressions
Closes #5979
1 parent c0654d2
Changed files (5)
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<const clang::UnaryExprOrTypeTraitExpr *>(self);
+    return (ZigClangUnaryExprOrTypeTrait_Kind)casted->getKind();
+}
+
 const struct ZigClangStmt *ZigClangDoStmt_getBody(const struct ZigClangDoStmt *self) {
     auto casted = reinterpret_cast<const clang::DoStmt *>(self);
     return reinterpret_cast<const struct ZigClangStmt *>(casted->getBody());
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 *);
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;
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);
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;