From 9c437f90327880a195f1090f726118a8f6742bc6 Mon Sep 17 00:00:00 2001 From: hryx Date: Sun, 26 May 2019 19:14:50 -0700 Subject: [PATCH] var decl: ImplicitCastExpr --- src-self-hosted/clang.zig | 2 ++ src-self-hosted/translate_c.zig | 36 ++++++++++++++++++++++++--------- src/zig_clang.cpp | 5 +++++ src/zig_clang.h | 3 +++ 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/src-self-hosted/clang.zig b/src-self-hosted/clang.zig index 888d45999b7c8ee129646d09e238aac5722ad20b..e1b7c526b1361f346eb2e113d2a210f883c9cd7b 100644 --- a/src-self-hosted/clang.zig +++ b/src-self-hosted/clang.zig @@ -878,3 +878,5 @@ pub const ZigClangVarDecl_TLSKind = extern enum { Static, Dynamic, }; + +pub extern fn ZigClangImplicitCastExpr_getCastKind(*const ZigClangImplicitCastExpr) ZigClangCK; diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index efdeaa3aff98e3858f623931b61b07574972c66a..50663537e291dabd3d63c8c460b51ccb66123e23 100644 --- a/src-self-hosted/translate_c.zig +++ b/src-self-hosted/translate_c.zig @@ -324,6 +324,7 @@ fn transStmt( switch (sc) { .CompoundStmtClass => return transCompoundStmt(rp, scope, @ptrCast(*const ZigClangCompoundStmt, stmt)), .DeclStmtClass => return transDeclStmt(rp, scope, @ptrCast(*const ZigClangDeclStmt, stmt)), + .ImplicitCastExprClass => return transImplicitCastExpr(rp, scope, @ptrCast(*const ZigClangImplicitCastExpr, stmt)), else => { return revertAndWarn( rp, @@ -409,7 +410,7 @@ fn transDeclStmt(rp: RestorePoint, parent_scope: *Scope, stmt: *const ZigClangDe const eq_token = try appendToken(c, .Equal, "="); const init_node = if (ZigClangVarDecl_getInit(var_decl)) |expr| - (try transExpr(rp, scope, expr)).node + (try transExpr(rp, scope, expr, .used, .r_value)).node else null; const semicolon_token = try appendToken(c, .Semicolon, ";"); @@ -423,7 +424,7 @@ fn transDeclStmt(rp: RestorePoint, parent_scope: *Scope, stmt: *const ZigClangDe .name_token = name_token, .eq_token = eq_token, .mut_token = mut_token, - .comptime_token = null, // TODO IsConstexpr ? + .comptime_token = null, .extern_export_token = null, // TODO ?TokenIndex, .lib_name = null, // TODO ?*Node, .type_node = null, // TODO ?*Node, @@ -452,13 +453,30 @@ fn transDeclStmt(rp: RestorePoint, parent_scope: *Scope, stmt: *const ZigClangDe }; } -fn transExpr(rp: RestorePoint, scope: *Scope, expr: *const ZigClangExpr) !TransResult { - return revertAndWarn( - rp, - error.UnsupportedTranslation, - ZigClangExpr_getBeginLoc(expr), - "TODO implement translation of Expr", - ); +fn transImplicitCastExpr( + rp: RestorePoint, + scope: *Scope, + expr: *const ZigClangImplicitCastExpr, +) !TransResult { + switch (ZigClangImplicitCastExpr_getCastKind(@ptrCast(*const ZigClangImplicitCastExpr, expr))) { + else => |kind| return revertAndWarn( + rp, + error.UnsupportedTranslation, + ZigClangStmt_getBeginLoc(@ptrCast(*const ZigClangStmt, expr)), + "TODO implement translation of CastKind {}", + @tagName(kind), + ), + } +} + +fn transExpr( + rp: RestorePoint, + scope: *Scope, + expr: *const ZigClangExpr, + used: ResultUsed, + lrvalue: LRValue, +) TransError!TransResult { + return transStmt(rp, scope, @ptrCast(*const ZigClangStmt, expr), used, lrvalue); } fn findBlockScope(inner: *Scope) *Scope.Block { diff --git a/src/zig_clang.cpp b/src/zig_clang.cpp index 9b725710a95636c5afccc5992c34b143ca27fd8f..6077878b299971d265aa9f4eb99ff8ebfe36173f 100644 --- a/src/zig_clang.cpp +++ b/src/zig_clang.cpp @@ -1919,3 +1919,8 @@ const struct ZigClangStringLiteral *ZigClangPredefinedExpr_getFunctionName( const clang::StringLiteral *result = casted->getFunctionName(); return reinterpret_cast(result); } + +enum ZigClangCK ZigClangImplicitCastExpr_getCastKind(const struct ZigClangImplicitCastExpr *self) { + auto casted = reinterpret_cast(self); + return (ZigClangCK)casted->getCastKind(); +} diff --git a/src/zig_clang.h b/src/zig_clang.h index 1c71f2eb91d4d7162e7176d8247b0577439d69d2..d6d193223b36778b7b503b4cf83f09450356f6eb 100644 --- a/src/zig_clang.h +++ b/src/zig_clang.h @@ -869,4 +869,7 @@ ZIG_EXTERN_C const char *ZigClangStringLiteral_getString_bytes_begin_size(const ZIG_EXTERN_C const struct ZigClangStringLiteral *ZigClangPredefinedExpr_getFunctionName( const struct ZigClangPredefinedExpr *self); + +ZIG_EXTERN_C enum ZigClangCK ZigClangImplicitCastExpr_getCastKind(const struct ZigClangImplicitCastExpr *); + #endif -- 2.54.0