| author | |
| committer | |
| log | 081698156141ba16a168d9448b9883c0f5a3edd0 |
| tree | a84e7f82a177ff7d152d62125ea42d5124f833b5 |
| parent | fd208d9d5913a0929e444deb97b91092c427bb14 |
5 files changed, 57 insertions(+), 0 deletions(-)
src/clang.zig+10| ... | @@ -583,6 +583,16 @@ pub const MacroQualifiedType = opaque { | ... | @@ -583,6 +583,16 @@ pub const MacroQualifiedType = opaque { |
| 583 | extern fn ZigClangMacroQualifiedType_getModifiedType(*const MacroQualifiedType) QualType; | 583 | extern fn ZigClangMacroQualifiedType_getModifiedType(*const MacroQualifiedType) QualType; |
| 584 | }; | 584 | }; |
| 585 | 585 | ||
| 586 | pub const TypeOfType = opaque { | ||
| 587 | pub const getUnderlyingType = ZigClangTypeOfType_getUnderlyingType; | ||
| 588 | extern fn ZigClangTypeOfType_getUnderlyingType(*const TypeOfType) QualType; | ||
| 589 | }; | ||
| 590 | |||
| 591 | pub const TypeOfExprType = opaque { | ||
| 592 | pub const getUnderlyingExpr = ZigClangTypeOfExprType_getUnderlyingExpr; | ||
| 593 | extern fn ZigClangTypeOfExprType_getUnderlyingExpr(*const TypeOfExprType) *const Expr; | ||
| 594 | }; | ||
| 595 | |||
| 586 | pub const MemberExpr = opaque { | 596 | pub const MemberExpr = opaque { |
| 587 | pub const getBase = ZigClangMemberExpr_getBase; | 597 | pub const getBase = ZigClangMemberExpr_getBase; |
| 588 | extern fn ZigClangMemberExpr_getBase(*const MemberExpr) *const Expr; | 598 | extern fn ZigClangMemberExpr_getBase(*const MemberExpr) *const Expr; |
src/translate_c.zig+14| ... | @@ -3827,6 +3827,20 @@ fn transType(c: *Context, scope: *Scope, ty: *const clang.Type, source_loc: clan | ... | @@ -3827,6 +3827,20 @@ fn transType(c: *Context, scope: *Scope, ty: *const clang.Type, source_loc: clan |
| 3827 | const macroqualified_ty = @ptrCast(*const clang.MacroQualifiedType, ty); | 3827 | const macroqualified_ty = @ptrCast(*const clang.MacroQualifiedType, ty); |
| 3828 | return transQualType(c, scope, macroqualified_ty.getModifiedType(), source_loc); | 3828 | return transQualType(c, scope, macroqualified_ty.getModifiedType(), source_loc); |
| 3829 | }, | 3829 | }, |
| 3830 | .TypeOf => { | ||
| 3831 | const typeof_ty = @ptrCast(*const clang.TypeOfType, ty); | ||
| 3832 | return transQualType(c, scope, typeof_ty.getUnderlyingType(), source_loc); | ||
| 3833 | }, | ||
| 3834 | .TypeOfExpr => { | ||
| 3835 | const typeofexpr_ty = @ptrCast(*const clang.TypeOfExprType, ty); | ||
| 3836 | const underlying_expr = transExpr(c, scope, typeofexpr_ty.getUnderlyingExpr(), .used) catch |err| switch (err) { | ||
| 3837 | error.UnsupportedTranslation => { | ||
| 3838 | return fail(c, error.UnsupportedType, source_loc, "unsupported underlying expression for TypeOfExpr", .{}); | ||
| 3839 | }, | ||
| 3840 | else => |e| return e, | ||
| 3841 | }; | ||
| 3842 | return Tag.typeof.create(c.arena, underlying_expr); | ||
| 3843 | }, | ||
| 3830 | else => { | 3844 | else => { |
| 3831 | const type_name = c.str(ty.getTypeClassName()); | 3845 | const type_name = c.str(ty.getTypeClassName()); |
| 3832 | return fail(c, error.UnsupportedType, source_loc, "unsupported type: '{s}'", .{type_name}); | 3846 | return fail(c, error.UnsupportedType, source_loc, "unsupported type: '{s}'", .{type_name}); |
src/zig_clang.cpp+10| ... | @@ -2599,6 +2599,16 @@ struct ZigClangQualType ZigClangMacroQualifiedType_getModifiedType(const struct | ... | @@ -2599,6 +2599,16 @@ struct ZigClangQualType ZigClangMacroQualifiedType_getModifiedType(const struct |
| 2599 | return bitcast(casted->getModifiedType()); | 2599 | return bitcast(casted->getModifiedType()); |
| 2600 | } | 2600 | } |
| 2601 | 2601 | ||
| 2602 | struct ZigClangQualType ZigClangTypeOfType_getUnderlyingType(const struct ZigClangTypeOfType *self) { | ||
| 2603 | auto casted = reinterpret_cast<const clang::TypeOfType *>(self); | ||
| 2604 | return bitcast(casted->getUnderlyingType()); | ||
| 2605 | } | ||
| 2606 | |||
| 2607 | const struct ZigClangExpr *ZigClangTypeOfExprType_getUnderlyingExpr(const struct ZigClangTypeOfExprType *self) { | ||
| 2608 | auto casted = reinterpret_cast<const clang::TypeOfExprType *>(self); | ||
| 2609 | return reinterpret_cast<const struct ZigClangExpr *>(casted->getUnderlyingExpr()); | ||
| 2610 | } | ||
| 2611 | |||
| 2602 | struct ZigClangQualType ZigClangElaboratedType_getNamedType(const struct ZigClangElaboratedType *self) { | 2612 | struct ZigClangQualType ZigClangElaboratedType_getNamedType(const struct ZigClangElaboratedType *self) { |
| 2603 | auto casted = reinterpret_cast<const clang::ElaboratedType *>(self); | 2613 | auto casted = reinterpret_cast<const clang::ElaboratedType *>(self); |
| 2604 | return bitcast(casted->getNamedType()); | 2614 | return bitcast(casted->getNamedType()); |
src/zig_clang.h+4| ... | @@ -1157,6 +1157,10 @@ ZIG_EXTERN_C struct ZigClangQualType ZigClangAttributedType_getEquivalentType(co | ... | @@ -1157,6 +1157,10 @@ ZIG_EXTERN_C struct ZigClangQualType ZigClangAttributedType_getEquivalentType(co |
| 1157 | 1157 | ||
| 1158 | ZIG_EXTERN_C struct ZigClangQualType ZigClangMacroQualifiedType_getModifiedType(const struct ZigClangMacroQualifiedType *); | 1158 | ZIG_EXTERN_C struct ZigClangQualType ZigClangMacroQualifiedType_getModifiedType(const struct ZigClangMacroQualifiedType *); |
| 1159 | 1159 | ||
| 1160 | ZIG_EXTERN_C struct ZigClangQualType ZigClangTypeOfType_getUnderlyingType(const struct ZigClangTypeOfType *); | ||
| 1161 | |||
| 1162 | ZIG_EXTERN_C const struct ZigClangExpr *ZigClangTypeOfExprType_getUnderlyingExpr(const struct ZigClangTypeOfExprType *); | ||
| 1163 | |||
| 1160 | ZIG_EXTERN_C struct ZigClangQualType ZigClangElaboratedType_getNamedType(const struct ZigClangElaboratedType *); | 1164 | ZIG_EXTERN_C struct ZigClangQualType ZigClangElaboratedType_getNamedType(const struct ZigClangElaboratedType *); |
| 1161 | ZIG_EXTERN_C enum ZigClangElaboratedTypeKeyword ZigClangElaboratedType_getKeyword(const struct ZigClangElaboratedType *); | 1165 | ZIG_EXTERN_C enum ZigClangElaboratedTypeKeyword ZigClangElaboratedType_getKeyword(const struct ZigClangElaboratedType *); |
| 1162 | 1166 |
test/run_translated_c.zig+19| ... | @@ -1054,4 +1054,23 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void { | ... | @@ -1054,4 +1054,23 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void { |
| 1054 | \\ return 0; | 1054 | \\ return 0; |
| 1055 | \\} | 1055 | \\} |
| 1056 | , ""); | 1056 | , ""); |
| 1057 | |||
| 1058 | cases.add("typeof operator", | ||
| 1059 | \\#include <stdlib.h> | ||
| 1060 | \\static int FOO = 42; | ||
| 1061 | \\typedef typeof(FOO) foo_type; | ||
| 1062 | \\typeof(foo_type) myfunc(typeof(FOO) x) { return (typeof(FOO)) x; } | ||
| 1063 | \\int main(void) { | ||
| 1064 | \\ int x = FOO; | ||
| 1065 | \\ typeof(x) y = x; | ||
| 1066 | \\ foo_type z = y; | ||
| 1067 | \\ if (x != y) abort(); | ||
| 1068 | \\ if (myfunc(z) != x) abort(); | ||
| 1069 | \\ | ||
| 1070 | \\ const char *my_string = "bar"; | ||
| 1071 | \\ typeof (typeof (my_string)[4]) string_arr = {"a","b","c","d"}; | ||
| 1072 | \\ if (string_arr[0][0] != 'a' || string_arr[3][0] != 'd') abort(); | ||
| 1073 | \\ return 0; | ||
| 1074 | \\} | ||
| 1075 | , ""); | ||
| 1057 | } | 1076 | } |