| ... | @@ -581,6 +581,33 @@ static bool qual_type_is_ptr(ZigClangQualType qt) { | ... | @@ -581,6 +581,33 @@ static bool qual_type_is_ptr(ZigClangQualType qt) { |
| 581 | return ZigClangType_getTypeClass(ty) == ZigClangType_Pointer; | 581 | return ZigClangType_getTypeClass(ty) == ZigClangType_Pointer; |
| 582 | } | 582 | } |
| 583 | | 583 | |
| | 584 | static bool qual_type_is_int(ZigClangQualType qt) { |
| | 585 | const ZigClangType *ty = qual_type_canon(qt); |
| | 586 | if (ZigClangType_getTypeClass(ty) != ZigClangType_Builtin) |
| | 587 | return false; |
| | 588 | const clang::BuiltinType *builtin_ty = reinterpret_cast<const clang::BuiltinType*>(ty); |
| | 589 | switch (builtin_ty->getKind()) { |
| | 590 | case clang::BuiltinType::Char_U: |
| | 591 | case clang::BuiltinType::UChar: |
| | 592 | case clang::BuiltinType::Char_S: |
| | 593 | case clang::BuiltinType::Char8: |
| | 594 | case clang::BuiltinType::SChar: |
| | 595 | case clang::BuiltinType::UShort: |
| | 596 | case clang::BuiltinType::UInt: |
| | 597 | case clang::BuiltinType::ULong: |
| | 598 | case clang::BuiltinType::ULongLong: |
| | 599 | case clang::BuiltinType::Short: |
| | 600 | case clang::BuiltinType::Int: |
| | 601 | case clang::BuiltinType::Long: |
| | 602 | case clang::BuiltinType::LongLong: |
| | 603 | case clang::BuiltinType::UInt128: |
| | 604 | case clang::BuiltinType::Int128: |
| | 605 | return true; |
| | 606 | default: |
| | 607 | return false; |
| | 608 | } |
| | 609 | } |
| | 610 | |
| 584 | static const clang::FunctionProtoType *qual_type_get_fn_proto(ZigClangQualType qt, bool *is_ptr) { | 611 | static const clang::FunctionProtoType *qual_type_get_fn_proto(ZigClangQualType qt, bool *is_ptr) { |
| 585 | const ZigClangType *ty = qual_type_canon(qt); | 612 | const ZigClangType *ty = qual_type_canon(qt); |
| 586 | *is_ptr = false; | 613 | *is_ptr = false; |
| ... | @@ -744,6 +771,17 @@ static AstNode* trans_c_cast(Context *c, ZigClangSourceLocation source_location, | ... | @@ -744,6 +771,17 @@ static AstNode* trans_c_cast(Context *c, ZigClangSourceLocation source_location, |
| 744 | if (qual_type_is_ptr(dest_type) && qual_type_is_ptr(src_type)) { | 771 | if (qual_type_is_ptr(dest_type) && qual_type_is_ptr(src_type)) { |
| 745 | return trans_c_ptr_cast(c, source_location, dest_type, src_type, expr); | 772 | return trans_c_ptr_cast(c, source_location, dest_type, src_type, expr); |
| 746 | } | 773 | } |
| | 774 | if (qual_type_is_int(dest_type) && qual_type_is_ptr(src_type)) { |
| | 775 | AstNode *addr_node = trans_create_node_builtin_fn_call_str(c, "ptrToInt"); |
| | 776 | addr_node->data.fn_call_expr.params.append(expr); |
| | 777 | return trans_create_node_fn_call_1(c, trans_qual_type(c, dest_type, source_location), addr_node); |
| | 778 | } |
| | 779 | if (qual_type_is_int(src_type) && qual_type_is_ptr(dest_type)) { |
| | 780 | AstNode *ptr_node = trans_create_node_builtin_fn_call_str(c, "intToPtr"); |
| | 781 | ptr_node->data.fn_call_expr.params.append(trans_qual_type(c, dest_type, source_location)); |
| | 782 | ptr_node->data.fn_call_expr.params.append(expr); |
| | 783 | return ptr_node; |
| | 784 | } |
| 747 | // TODO: maybe widen to increase size | 785 | // TODO: maybe widen to increase size |
| 748 | // TODO: maybe bitcast to change sign | 786 | // TODO: maybe bitcast to change sign |
| 749 | // TODO: maybe truncate to reduce size | 787 | // TODO: maybe truncate to reduce size |