authorgravatar for codroid@gmail.comhryx <codroid@gmail.com> 2019-06-09 23:35:48-07:00
committergravatar for codroid@gmail.comhryx <codroid@gmail.com> 2019-06-09 23:35:48-07:00
log84e479d94f9998331bdd73665274684cf3d0ad48
treebe93b61d9b18f184e155dbcfa22bc53870f58059
parent586c36dd1d37d06bdf84fcf867165b8861825cb8
signaturelock-open Commit is signed but in an unrecognized format.

(broken) local var decls, integer literals (part)


4 files changed, 163 insertions(+), 16 deletions(-)

src-self-hosted/clang.zig+31-1
...@@ -1,4 +1,3 @@...@@ -1,4 +1,3 @@
1pub const struct_ZigClangAPValue = @OpaqueType();
2pub const struct_ZigClangAPSInt = @OpaqueType();1pub const struct_ZigClangAPSInt = @OpaqueType();
3pub const struct_ZigClangAPFloat = @OpaqueType();2pub const struct_ZigClangAPFloat = @OpaqueType();
4pub const struct_ZigClangASTContext = @OpaqueType();3pub const struct_ZigClangASTContext = @OpaqueType();
...@@ -928,3 +927,34 @@ pub extern fn ZigClangAttributedType_getEquivalentType(*const ZigClangAttributed...@@ -928,3 +927,34 @@ pub extern fn ZigClangAttributedType_getEquivalentType(*const ZigClangAttributed
928pub extern fn ZigClangCStyleCastExpr_getBeginLoc(*const ZigClangCStyleCastExpr) ZigClangSourceLocation;927pub extern fn ZigClangCStyleCastExpr_getBeginLoc(*const ZigClangCStyleCastExpr) ZigClangSourceLocation;
929pub extern fn ZigClangCStyleCastExpr_getSubExpr(*const ZigClangCStyleCastExpr) *const ZigClangExpr;928pub extern fn ZigClangCStyleCastExpr_getSubExpr(*const ZigClangCStyleCastExpr) *const ZigClangExpr;
930pub extern fn ZigClangCStyleCastExpr_getType(*const ZigClangCStyleCastExpr) ZigClangQualType;929pub extern fn ZigClangCStyleCastExpr_getType(*const ZigClangCStyleCastExpr) ZigClangQualType;
930
931pub const ZigClangExprEvalResult = struct_ZigClangExprEvalResult;
932pub const struct_ZigClangExprEvalResult = extern struct {
933 HasSideEffects: bool,
934 HasUndefinedBehavior: bool,
935 SmallVectorImpl: ?*c_void,
936 Val: ZigClangAPValue,
937};
938
939pub const struct_ZigClangAPValue = extern struct {
940 Kind: ZigClangAPValue_ValueKind,
941 Data: [68]u8, // TODO: is there a way to statically assert that this matches the .h?
942};
943
944pub const ZigClangAPValue_ValueKind = extern enum {
945 ZigClangAPValue_ValueKind_Uninitialized,
946 ZigClangAPValue_ValueKind_Int,
947 ZigClangAPValue_ValueKind_Float,
948 ZigClangAPValue_ValueKind_ComplexInt,
949 ZigClangAPValue_ValueKind_ComplexFloat,
950 ZigClangAPValue_ValueKind_LValue,
951 ZigClangAPValue_ValueKind_Vector,
952 ZigClangAPValue_ValueKind_Array,
953 ZigClangAPValue_ValueKind_Struct,
954 ZigClangAPValue_ValueKind_Union,
955 ZigClangAPValue_ValueKind_MemberPointer,
956 ZigClangAPValue_ValueKind_AddrLabelDiff,
957};
958
959pub extern fn ZigClangIntegerLiteral_EvaluateAsInt(*const ZigClangIntegerLiteral, *ZigClangExprEvalResult, *const ZigClangASTContext) bool;
960pub extern fn ZigClangIntegerLiteral_getBeginLoc(*const ZigClangIntegerLiteral) ZigClangSourceLocation;
src-self-hosted/translate_c.zig+64-15
...@@ -333,6 +333,7 @@ fn transStmt(...@@ -333,6 +333,7 @@ fn transStmt(
333 .DeclStmtClass => return transDeclStmt(rp, scope, @ptrCast(*const ZigClangDeclStmt, stmt)),333 .DeclStmtClass => return transDeclStmt(rp, scope, @ptrCast(*const ZigClangDeclStmt, stmt)),
334 .DeclRefExprClass => return transDeclRefExpr(rp, scope, @ptrCast(*const ZigClangDeclRefExpr, stmt), lrvalue),334 .DeclRefExprClass => return transDeclRefExpr(rp, scope, @ptrCast(*const ZigClangDeclRefExpr, stmt), lrvalue),
335 .ImplicitCastExprClass => return transImplicitCastExpr(rp, scope, @ptrCast(*const ZigClangImplicitCastExpr, stmt), result_used),335 .ImplicitCastExprClass => return transImplicitCastExpr(rp, scope, @ptrCast(*const ZigClangImplicitCastExpr, stmt), result_used),
336 .IntegerLiteralClass => return transIntegerLiteral(rp, scope, @ptrCast(*const ZigClangIntegerLiteral, stmt), result_used),
336 else => {337 else => {
337 return revertAndWarn(338 return revertAndWarn(
338 rp,339 rp,
...@@ -534,6 +535,26 @@ fn transImplicitCastExpr(...@@ -534,6 +535,26 @@ fn transImplicitCastExpr(
534 }535 }
535}536}
536537
538fn transIntegerLiteral(
539 rp: RestorePoint,
540 scope: *Scope,
541 expr: *const ZigClangIntegerLiteral,
542 result_used: ResultUsed,
543) !TransResult {
544 var eval_result: ZigClangExprEvalResult = undefined;
545 if (!ZigClangIntegerLiteral_EvaluateAsInt(expr, &eval_result, rp.c.clang_context)) {
546 const loc = ZigClangIntegerLiteral_getBeginLoc(expr);
547 return revertAndWarn(rp, error.UnsupportedTranslation, loc, "invalid integer literal");
548 }
549 const node = try transCreateNodeAPInt(rp.c, ZigClangAPValue_getInt(&eval_result.Val));
550 const res = TransResult{
551 .node = node,
552 .child_scope = scope,
553 .node_scope = scope,
554 };
555 return maybeSuppressResult(rp, scope, result_used, res);
556}
557
537fn transCCast(558fn transCCast(
538 rp: RestorePoint,559 rp: RestorePoint,
539 scope: *Scope,560 scope: *Scope,
...@@ -547,14 +568,17 @@ fn transCCast(...@@ -547,14 +568,17 @@ fn transCCast(
547 if (qualTypeIsPtr(dst_type) and qualTypeIsPtr(src_type))568 if (qualTypeIsPtr(dst_type) and qualTypeIsPtr(src_type))
548 return transCPtrCast(rp, loc, dst_type, src_type, expr);569 return transCPtrCast(rp, loc, dst_type, src_type, expr);
549 if (cIsUnsignedInteger(dst_type) and qualTypeIsPtr(src_type)) {570 if (cIsUnsignedInteger(dst_type) and qualTypeIsPtr(src_type)) {
550 const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "ptrToInt");571 const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "@ptrToInt");
551 try builtin_node.params.push(expr);572 try builtin_node.params.push(expr);
573 builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")");
552 return &(try transCreateNodeFnCall(rp.c, try transQualType(rp, dst_type, loc), &builtin_node.base)).base;574 return &(try transCreateNodeFnCall(rp.c, try transQualType(rp, dst_type, loc), &builtin_node.base)).base;
553 }575 }
554 if (cIsUnsignedInteger(src_type) and qualTypeIsPtr(dst_type)) {576 if (cIsUnsignedInteger(src_type) and qualTypeIsPtr(dst_type)) {
555 const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "intToPtr");577 const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "@intToPtr");
556 try builtin_node.params.push(try transQualType(rp, dst_type, loc));578 try builtin_node.params.push(try transQualType(rp, dst_type, loc));
579 _ = try appendToken(rp.c, .Comma, ",");
557 try builtin_node.params.push(expr);580 try builtin_node.params.push(expr);
581 builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")");
558 return &builtin_node.base;582 return &builtin_node.base;
559 }583 }
560 // TODO: maybe widen to increase size584 // TODO: maybe widen to increase size
...@@ -599,25 +623,28 @@ fn transCPtrCast(...@@ -599,25 +623,28 @@ fn transCPtrCast(
599) !*ast.Node {623) !*ast.Node {
600 const ty = ZigClangQualType_getTypePtr(dst_type);624 const ty = ZigClangQualType_getTypePtr(dst_type);
601 const child_type = ZigClangType_getPointeeType(ty);625 const child_type = ZigClangType_getPointeeType(ty);
602 const dst_type_node = try transType(rp, ty, loc);
603 const child_type_node = try transQualType(rp, child_type, loc);
604626
605 // Implicit downcasting from higher to lower alignment values is forbidden,627 // Implicit downcasting from higher to lower alignment values is forbidden,
606 // use @alignCast to side-step this problem628 // use @alignCast to side-step this problem
607 const ptrcast_node = try transCreateNodeBuiltinFnCall(rp.c, "ptrCast");629 const ptrcast_node = try transCreateNodeBuiltinFnCall(rp.c, "@ptrCast");
630 const dst_type_node = try transType(rp, ty, loc);
608 try ptrcast_node.params.push(dst_type_node);631 try ptrcast_node.params.push(dst_type_node);
632 _ = try appendToken(rp.c, .Comma, ",");
609633
610 if (ZigClangType_isVoidType(qualTypeCanon(child_type))) {634 if (ZigClangType_isVoidType(qualTypeCanon(child_type))) {
611 // void has 1-byte alignment, so @alignCast is not needed635 // void has 1-byte alignment, so @alignCast is not needed
612 try ptrcast_node.params.push(expr);636 try ptrcast_node.params.push(expr);
613 } else {637 } else {
614 const alignof_node = try transCreateNodeBuiltinFnCall(rp.c, "alignOf");638 const alignof_node = try transCreateNodeBuiltinFnCall(rp.c, "@alignOf");
639 const child_type_node = try transQualType(rp, child_type, loc);
615 try alignof_node.params.push(child_type_node);640 try alignof_node.params.push(child_type_node);
616 const aligncast_node = try transCreateNodeBuiltinFnCall(rp.c, "alignCast");641 const aligncast_node = try transCreateNodeBuiltinFnCall(rp.c, "@alignCast");
617 try aligncast_node.params.push(&alignof_node.base);642 try aligncast_node.params.push(&alignof_node.base);
643 _ = try appendToken(rp.c, .Comma, ",");
618 try aligncast_node.params.push(expr);644 try aligncast_node.params.push(expr);
619 try ptrcast_node.params.push(&aligncast_node.base);645 try ptrcast_node.params.push(&aligncast_node.base);
620 }646 }
647 ptrcast_node.rparen_token = try appendToken(rp.c, .RParen, ")");
621648
622 return &ptrcast_node.base;649 return &ptrcast_node.base;
623}650}
...@@ -740,17 +767,20 @@ fn cIsUnsignedInteger(qt: ZigClangQualType) bool {...@@ -740,17 +767,20 @@ fn cIsUnsignedInteger(qt: ZigClangQualType) bool {
740}767}
741768
742fn transCreateNodeBuiltinFnCall(c: *Context, name: []const u8) !*ast.Node.BuiltinCall {769fn transCreateNodeBuiltinFnCall(c: *Context, name: []const u8) !*ast.Node.BuiltinCall {
770 const builtin_token = try appendToken(c, .Builtin, name);
771 _ = try appendToken(c, .LParen, "(");
743 const node = try c.a().create(ast.Node.BuiltinCall);772 const node = try c.a().create(ast.Node.BuiltinCall);
744 node.* = ast.Node.BuiltinCall{773 node.* = ast.Node.BuiltinCall{
745 .base = ast.Node{ .id = .BuiltinCall },774 .base = ast.Node{ .id = .BuiltinCall },
746 .builtin_token = try appendToken(c, .Builtin, name),775 .builtin_token = builtin_token,
747 .params = ast.Node.BuiltinCall.ParamList.init(c.a()),776 .params = ast.Node.BuiltinCall.ParamList.init(c.a()),
748 .rparen_token = undefined, // TODO TokenIndex,777 .rparen_token = undefined, // set after appending args
749 };778 };
750 return node;779 return node;
751}780}
752781
753fn transCreateNodeFnCall(c: *Context, fn_expr: *ast.Node, first_arg: *ast.Node) !*ast.Node.SuffixOp {782fn transCreateNodeFnCall(c: *Context, fn_expr: *ast.Node, first_arg: *ast.Node) !*ast.Node.SuffixOp {
783 _ = try appendToken(c, .LParen, "(");
754 const node = try c.a().create(ast.Node.SuffixOp);784 const node = try c.a().create(ast.Node.SuffixOp);
755 node.* = ast.Node.SuffixOp{785 node.* = ast.Node.SuffixOp{
756 .base = ast.Node{ .id = .SuffixOp },786 .base = ast.Node{ .id = .SuffixOp },
...@@ -761,16 +791,23 @@ fn transCreateNodeFnCall(c: *Context, fn_expr: *ast.Node, first_arg: *ast.Node)...@@ -761,16 +791,23 @@ fn transCreateNodeFnCall(c: *Context, fn_expr: *ast.Node, first_arg: *ast.Node)
761 .async_attr = null,791 .async_attr = null,
762 },792 },
763 },793 },
764 .rtoken = undefined, // TODO TokenIndex794 .rtoken = try appendToken(c, .RParen, ")"),
765 };795 };
796 try node.op.Call.params.push(first_arg);
766 return node;797 return node;
767}798}
768799
769fn transCreateNodePrefixOp(c: *Context, op: ast.Node.PrefixOp.Op, rhs: *ast.Node) !*ast.Node {800fn transCreateNodePrefixOp(
801 c: *Context,
802 op: ast.Node.PrefixOp.Op,
803 rhs: *ast.Node,
804 op_tok_id: std.zig.Token.Id,
805 bytes: []const u8,
806) !*ast.Node {
770 const node = try c.a().create(ast.Node.PrefixOp);807 const node = try c.a().create(ast.Node.PrefixOp);
771 node.* = ast.Node.PrefixOp{808 node.* = ast.Node.PrefixOp{
772 .base = ast.Node{ .id = .PrefixOp },809 .base = ast.Node{ .id = .PrefixOp },
773 .op_token = undefined, // TODO TokenIndex,810 .op_token = try appendToken(c, op_tok_id, bytes),
774 .op = op,811 .op = op,
775 .rhs = rhs,812 .rhs = rhs,
776 };813 };
...@@ -783,11 +820,12 @@ fn transCreateNodePtrType(...@@ -783,11 +820,12 @@ fn transCreateNodePtrType(
783 is_volatile: bool,820 is_volatile: bool,
784 rhs: *ast.Node,821 rhs: *ast.Node,
785 op_tok_id: std.zig.Token.Id,822 op_tok_id: std.zig.Token.Id,
823 bytes: []const u8,
786) !*ast.Node {824) !*ast.Node {
787 const node = try c.a().create(ast.Node.PrefixOp);825 const node = try c.a().create(ast.Node.PrefixOp);
788 node.* = ast.Node.PrefixOp{826 node.* = ast.Node.PrefixOp{
789 .base = ast.Node{ .id = .PrefixOp },827 .base = ast.Node{ .id = .PrefixOp },
790 .op_token = try appendToken(c, op_tok_id, ""), // TODO TokenIndex,828 .op_token = try appendToken(c, op_tok_id, bytes),
791 .op = ast.Node.PrefixOp.Op{829 .op = ast.Node.PrefixOp.Op{
792 .PtrType = ast.Node.PrefixOp.PtrInfo{830 .PtrType = ast.Node.PrefixOp.PtrInfo{
793 .allowzero_token = null,831 .allowzero_token = null,
...@@ -801,6 +839,15 @@ fn transCreateNodePtrType(...@@ -801,6 +839,15 @@ fn transCreateNodePtrType(
801 return &node.base;839 return &node.base;
802}840}
803841
842fn transCreateNodeAPInt(c: *Context, int: ?*const ZigClangAPSInt) !*ast.Node {
843 const node = try c.a().create(ast.Node.IntegerLiteral);
844 node.* = ast.Node.IntegerLiteral{
845 .base = ast.Node{ .id = .IntegerLiteral },
846 .token = try appendToken(c, .IntegerLiteral, "3333333"), // TODO
847 };
848 return &node.base;
849}
850
804const RestorePoint = struct {851const RestorePoint = struct {
805 c: *Context,852 c: *Context,
806 token_index: ast.TokenIndex,853 token_index: ast.TokenIndex,
...@@ -860,7 +907,7 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour...@@ -860,7 +907,7 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour
860 const child_qt = ZigClangType_getPointeeType(ty);907 const child_qt = ZigClangType_getPointeeType(ty);
861 const child_node = try transQualType(rp, child_qt, source_loc);908 const child_node = try transQualType(rp, child_qt, source_loc);
862 if (qualTypeChildIsFnProto(child_qt))909 if (qualTypeChildIsFnProto(child_qt))
863 return transCreateNodePrefixOp(rp.c, .OptionalType, child_node);910 return transCreateNodePrefixOp(rp.c, .OptionalType, child_node, .QuestionMark, "?");
864 if (typeIsOpaque(rp.c, ZigClangQualType_getTypePtr(child_qt), source_loc)) {911 if (typeIsOpaque(rp.c, ZigClangQualType_getTypePtr(child_qt), source_loc)) {
865 const pointer_node = try transCreateNodePtrType(912 const pointer_node = try transCreateNodePtrType(
866 rp.c,913 rp.c,
...@@ -868,8 +915,9 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour...@@ -868,8 +915,9 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour
868 ZigClangQualType_isVolatileQualified(child_qt),915 ZigClangQualType_isVolatileQualified(child_qt),
869 child_node,916 child_node,
870 .Asterisk,917 .Asterisk,
918 "*",
871 );919 );
872 return transCreateNodePrefixOp(rp.c, .OptionalType, pointer_node);920 return transCreateNodePrefixOp(rp.c, .OptionalType, pointer_node, .QuestionMark, "?");
873 }921 }
874 return transCreateNodePtrType(922 return transCreateNodePtrType(
875 rp.c,923 rp.c,
...@@ -877,6 +925,7 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour...@@ -877,6 +925,7 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour
877 ZigClangQualType_isVolatileQualified(child_qt),925 ZigClangQualType_isVolatileQualified(child_qt),
878 child_node,926 child_node,
879 .BracketStarCBracket,927 .BracketStarCBracket,
928 "[*c]",
880 );929 );
881 },930 },
882 else => {931 else => {
src/zig_clang.cpp+38
...@@ -21,6 +21,7 @@...@@ -21,6 +21,7 @@
2121
22#include <clang/Frontend/ASTUnit.h>22#include <clang/Frontend/ASTUnit.h>
23#include <clang/Frontend/CompilerInstance.h>23#include <clang/Frontend/CompilerInstance.h>
24#include <clang/AST/APValue.h>
24#include <clang/AST/Expr.h>25#include <clang/AST/Expr.h>
2526
26#if __GNUC__ >= 827#if __GNUC__ >= 8
...@@ -1287,6 +1288,20 @@ static_assert((clang::StringLiteral::StringKind)ZigClangStringLiteral_StringKind...@@ -1287,6 +1288,20 @@ static_assert((clang::StringLiteral::StringKind)ZigClangStringLiteral_StringKind
1287static_assert((clang::StringLiteral::StringKind)ZigClangStringLiteral_StringKind_UTF16 == clang::StringLiteral::UTF16, "");1288static_assert((clang::StringLiteral::StringKind)ZigClangStringLiteral_StringKind_UTF16 == clang::StringLiteral::UTF16, "");
1288static_assert((clang::StringLiteral::StringKind)ZigClangStringLiteral_StringKind_UTF32 == clang::StringLiteral::UTF32, "");1289static_assert((clang::StringLiteral::StringKind)ZigClangStringLiteral_StringKind_UTF32 == clang::StringLiteral::UTF32, "");
12891290
1291static_assert((clang::APValue::ValueKind)ZigClangAPValue_ValueKind_Uninitialized == clang::APValue::ValueKind::Uninitialized, "");
1292static_assert((clang::APValue::ValueKind)ZigClangAPValue_ValueKind_Int == clang::APValue::ValueKind::Int, "");
1293static_assert((clang::APValue::ValueKind)ZigClangAPValue_ValueKind_Float == clang::APValue::ValueKind::Float, "");
1294static_assert((clang::APValue::ValueKind)ZigClangAPValue_ValueKind_ComplexInt == clang::APValue::ValueKind::ComplexInt, "");
1295static_assert((clang::APValue::ValueKind)ZigClangAPValue_ValueKind_ComplexFloat == clang::APValue::ValueKind::ComplexFloat, "");
1296static_assert((clang::APValue::ValueKind)ZigClangAPValue_ValueKind_LValue == clang::APValue::ValueKind::LValue, "");
1297static_assert((clang::APValue::ValueKind)ZigClangAPValue_ValueKind_Vector == clang::APValue::ValueKind::Vector, "");
1298static_assert((clang::APValue::ValueKind)ZigClangAPValue_ValueKind_Array == clang::APValue::ValueKind::Array, "");
1299static_assert((clang::APValue::ValueKind)ZigClangAPValue_ValueKind_Struct == clang::APValue::ValueKind::Struct, "");
1300static_assert((clang::APValue::ValueKind)ZigClangAPValue_ValueKind_Union == clang::APValue::ValueKind::Union, "");
1301static_assert((clang::APValue::ValueKind)ZigClangAPValue_ValueKind_MemberPointer == clang::APValue::ValueKind::MemberPointer, "");
1302static_assert((clang::APValue::ValueKind)ZigClangAPValue_ValueKind_AddrLabelDiff == clang::APValue::ValueKind::AddrLabelDiff, "");
1303
1304static_assert(sizeof(ZigClangAPValue) == sizeof(clang::APValue), "");
12901305
1291static_assert(sizeof(ZigClangSourceLocation) == sizeof(clang::SourceLocation), "");1306static_assert(sizeof(ZigClangSourceLocation) == sizeof(clang::SourceLocation), "");
1292static ZigClangSourceLocation bitcast(clang::SourceLocation src) {1307static ZigClangSourceLocation bitcast(clang::SourceLocation src) {
...@@ -1312,6 +1327,13 @@ static clang::QualType bitcast(ZigClangQualType src) {...@@ -1312,6 +1327,13 @@ static clang::QualType bitcast(ZigClangQualType src) {
1312 return dest;1327 return dest;
1313}1328}
13141329
1330static_assert(sizeof(ZigClangExprEvalResult) == sizeof(clang::Expr::EvalResult), "");
1331static ZigClangExprEvalResult bitcast(clang::Expr::EvalResult src) {
1332 ZigClangExprEvalResult dest;
1333 memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangExprEvalResult));
1334 return dest;
1335}
1336
1315static_assert(sizeof(ZigClangAPValueLValueBase) == sizeof(clang::APValue::LValueBase), "");1337static_assert(sizeof(ZigClangAPValueLValueBase) == sizeof(clang::APValue::LValueBase), "");
1316static ZigClangAPValueLValueBase bitcast(clang::APValue::LValueBase src) {1338static ZigClangAPValueLValueBase bitcast(clang::APValue::LValueBase src) {
1317 ZigClangAPValueLValueBase dest;1339 ZigClangAPValueLValueBase dest;
...@@ -1979,3 +2001,19 @@ struct ZigClangQualType ZigClangCStyleCastExpr_getType(const struct ZigClangCSty...@@ -1979,3 +2001,19 @@ struct ZigClangQualType ZigClangCStyleCastExpr_getType(const struct ZigClangCSty
1979 auto casted = reinterpret_cast<const clang::CStyleCastExpr *>(self);2001 auto casted = reinterpret_cast<const clang::CStyleCastExpr *>(self);
1980 return bitcast(casted->getType());2002 return bitcast(casted->getType());
1981}2003}
2004
2005bool ZigClangIntegerLiteral_EvaluateAsInt(const struct ZigClangIntegerLiteral *self, struct ZigClangExprEvalResult *result, const struct ZigClangASTContext *ctx) {
2006 auto casted_self = reinterpret_cast<const clang::IntegerLiteral *>(self);
2007 auto casted_ctx = reinterpret_cast<const clang::ASTContext *>(ctx);
2008 clang::Expr::EvalResult eval_result;
2009 if (!casted_self->EvaluateAsInt(eval_result, *casted_ctx)) {
2010 return false;
2011 }
2012 *result = bitcast(eval_result);
2013 return true;
2014}
2015
2016struct ZigClangSourceLocation ZigClangIntegerLiteral_getBeginLoc(const struct ZigClangIntegerLiteral *self) {
2017 auto casted = reinterpret_cast<const clang::IntegerLiteral *>(self);
2018 return bitcast(casted->getBeginLoc());
2019}
src/zig_clang.h+30
...@@ -30,6 +30,33 @@ struct ZigClangAPValueLValueBase {...@@ -30,6 +30,33 @@ struct ZigClangAPValueLValueBase {
30 unsigned Version;30 unsigned Version;
31};31};
3232
33enum ZigClangAPValue_ValueKind {
34 ZigClangAPValue_ValueKind_Uninitialized,
35 ZigClangAPValue_ValueKind_Int,
36 ZigClangAPValue_ValueKind_Float,
37 ZigClangAPValue_ValueKind_ComplexInt,
38 ZigClangAPValue_ValueKind_ComplexFloat,
39 ZigClangAPValue_ValueKind_LValue,
40 ZigClangAPValue_ValueKind_Vector,
41 ZigClangAPValue_ValueKind_Array,
42 ZigClangAPValue_ValueKind_Struct,
43 ZigClangAPValue_ValueKind_Union,
44 ZigClangAPValue_ValueKind_MemberPointer,
45 ZigClangAPValue_ValueKind_AddrLabelDiff
46};
47
48struct ZigClangAPValue {
49 enum ZigClangAPValue_ValueKind Kind;
50 char Data[68]; // experimentally-derived size of clang::APValue::DataType
51};
52
53struct ZigClangExprEvalResult {
54 bool HasSideEffects;
55 bool HasUndefinedBehavior;
56 void *SmallVectorImpl;
57 ZigClangAPValue Val;
58};
59
33struct ZigClangAPValue;60struct ZigClangAPValue;
34struct ZigClangAPSInt;61struct ZigClangAPSInt;
35struct ZigClangAPFloat;62struct ZigClangAPFloat;
...@@ -889,4 +916,7 @@ ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangCStyleCastExpr_getBeginLoc(co...@@ -889,4 +916,7 @@ ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangCStyleCastExpr_getBeginLoc(co
889ZIG_EXTERN_C const struct ZigClangExpr *ZigClangCStyleCastExpr_getSubExpr(const struct ZigClangCStyleCastExpr *);916ZIG_EXTERN_C const struct ZigClangExpr *ZigClangCStyleCastExpr_getSubExpr(const struct ZigClangCStyleCastExpr *);
890ZIG_EXTERN_C struct ZigClangQualType ZigClangCStyleCastExpr_getType(const struct ZigClangCStyleCastExpr *);917ZIG_EXTERN_C struct ZigClangQualType ZigClangCStyleCastExpr_getType(const struct ZigClangCStyleCastExpr *);
891918
919ZIG_EXTERN_C bool ZigClangIntegerLiteral_EvaluateAsInt(const struct ZigClangIntegerLiteral *, struct ZigClangExprEvalResult *, const struct ZigClangASTContext *);
920ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangIntegerLiteral_getBeginLoc(const struct ZigClangIntegerLiteral *);
921
892#endif922#endif