Commit 4ab2f947f9
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;