@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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 *);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user