| ... | @@ -2145,7 +2145,7 @@ fn transCallExpr(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangCallExpr, | ... | @@ -2145,7 +2145,7 @@ fn transCallExpr(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangCallExpr, |
| 2145 | node.rtoken = try appendToken(rp.c, .RParen, ")"); | 2145 | node.rtoken = try appendToken(rp.c, .RParen, ")"); |
| 2146 | | 2146 | |
| 2147 | if (fn_ty) |ty| { | 2147 | if (fn_ty) |ty| { |
| 2148 | const canon = ZigClangQualType_getCanonicalType(ZigClangFunctionProtoType_getReturnType(ty)); | 2148 | const canon = ZigClangQualType_getCanonicalType(ty.getReturnType()); |
| 2149 | const ret_ty = ZigClangQualType_getTypePtr(canon); | 2149 | const ret_ty = ZigClangQualType_getTypePtr(canon); |
| 2150 | if (ZigClangType_isVoidType(ret_ty)) { | 2150 | if (ZigClangType_isVoidType(ret_ty)) { |
| 2151 | _ = try appendToken(rp.c, .Semicolon, ";"); | 2151 | _ = try appendToken(rp.c, .Semicolon, ";"); |
| ... | @@ -2156,7 +2156,19 @@ fn transCallExpr(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangCallExpr, | ... | @@ -2156,7 +2156,19 @@ fn transCallExpr(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangCallExpr, |
| 2156 | return maybeSuppressResult(rp, scope, result_used, &node.base); | 2156 | return maybeSuppressResult(rp, scope, result_used, &node.base); |
| 2157 | } | 2157 | } |
| 2158 | | 2158 | |
| 2159 | fn qualTypeGetFnProto(qt: ZigClangQualType, is_ptr: *bool) ?*const ZigClangFunctionProtoType { | 2159 | const ClangFunctionType = union(enum) { |
| | 2160 | Proto: *const ZigClangFunctionProtoType, |
| | 2161 | NoProto: *const ZigClangFunctionType, |
| | 2162 | |
| | 2163 | fn getReturnType(self: @This()) ZigClangQualType { |
| | 2164 | switch (@as(@TagType(@This()), self)) { |
| | 2165 | .Proto => return ZigClangFunctionProtoType_getReturnType(self.Proto), |
| | 2166 | .NoProto => return ZigClangFunctionType_getReturnType(self.NoProto), |
| | 2167 | } |
| | 2168 | } |
| | 2169 | }; |
| | 2170 | |
| | 2171 | fn qualTypeGetFnProto(qt: ZigClangQualType, is_ptr: *bool) ?ClangFunctionType { |
| 2160 | const canon = ZigClangQualType_getCanonicalType(qt); | 2172 | const canon = ZigClangQualType_getCanonicalType(qt); |
| 2161 | var ty = ZigClangQualType_getTypePtr(canon); | 2173 | var ty = ZigClangQualType_getTypePtr(canon); |
| 2162 | is_ptr.* = false; | 2174 | is_ptr.* = false; |
| ... | @@ -2167,7 +2179,10 @@ fn qualTypeGetFnProto(qt: ZigClangQualType, is_ptr: *bool) ?*const ZigClangFunct | ... | @@ -2167,7 +2179,10 @@ fn qualTypeGetFnProto(qt: ZigClangQualType, is_ptr: *bool) ?*const ZigClangFunct |
| 2167 | ty = ZigClangQualType_getTypePtr(child_qt); | 2179 | ty = ZigClangQualType_getTypePtr(child_qt); |
| 2168 | } | 2180 | } |
| 2169 | if (ZigClangType_getTypeClass(ty) == .FunctionProto) { | 2181 | if (ZigClangType_getTypeClass(ty) == .FunctionProto) { |
| 2170 | return @ptrCast(*const ZigClangFunctionProtoType, ty); | 2182 | return ClangFunctionType{ .Proto = @ptrCast(*const ZigClangFunctionProtoType, ty) }; |
| | 2183 | } |
| | 2184 | if (ZigClangType_getTypeClass(ty) == .FunctionNoProto) { |
| | 2185 | return ClangFunctionType{ .NoProto = @ptrCast(*const ZigClangFunctionType, ty) }; |
| 2171 | } | 2186 | } |
| 2172 | return null; | 2187 | return null; |
| 2173 | } | 2188 | } |
| ... | @@ -2771,7 +2786,10 @@ fn qualTypeChildIsFnProto(qt: ZigClangQualType) bool { | ... | @@ -2771,7 +2786,10 @@ fn qualTypeChildIsFnProto(qt: ZigClangQualType) bool { |
| 2771 | .Paren => { | 2786 | .Paren => { |
| 2772 | const paren_type = @ptrCast(*const ZigClangParenType, ty); | 2787 | const paren_type = @ptrCast(*const ZigClangParenType, ty); |
| 2773 | const inner_type = ZigClangParenType_getInnerType(paren_type); | 2788 | const inner_type = ZigClangParenType_getInnerType(paren_type); |
| 2774 | return ZigClangQualType_getTypeClass(inner_type) == .FunctionProto; | 2789 | switch (ZigClangQualType_getTypeClass(inner_type)) { |
| | 2790 | .FunctionProto, .FunctionNoProto => return true, |
| | 2791 | else => return false, |
| | 2792 | } |
| 2775 | }, | 2793 | }, |
| 2776 | .Attributed => { | 2794 | .Attributed => { |
| 2777 | const attr_type = @ptrCast(*const ZigClangAttributedType, ty); | 2795 | const attr_type = @ptrCast(*const ZigClangAttributedType, ty); |
| ... | @@ -3571,11 +3589,16 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour | ... | @@ -3571,11 +3589,16 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour |
| 3571 | else => return revertAndWarn(rp, error.UnsupportedType, source_loc, "unsupported builtin type", .{}), | 3589 | else => return revertAndWarn(rp, error.UnsupportedType, source_loc, "unsupported builtin type", .{}), |
| 3572 | }); | 3590 | }); |
| 3573 | }, | 3591 | }, |
| 3574 | .FunctionProto, .FunctionNoProto => { | 3592 | .FunctionProto => { |
| 3575 | const fn_proto_ty = @ptrCast(*const ZigClangFunctionProtoType, ty); | 3593 | const fn_proto_ty = @ptrCast(*const ZigClangFunctionProtoType, ty); |
| 3576 | const fn_proto = try transFnProto(rp, null, fn_proto_ty, source_loc, null, false); | 3594 | const fn_proto = try transFnProto(rp, null, fn_proto_ty, source_loc, null, false); |
| 3577 | return &fn_proto.base; | 3595 | return &fn_proto.base; |
| 3578 | }, | 3596 | }, |
| | 3597 | .FunctionNoProto => { |
| | 3598 | const fn_no_proto_ty = @ptrCast(*const ZigClangFunctionType, ty); |
| | 3599 | const fn_proto = try transFnNoProto(rp, fn_no_proto_ty, source_loc, null, false); |
| | 3600 | return &fn_proto.base; |
| | 3601 | }, |
| 3579 | .Paren => { | 3602 | .Paren => { |
| 3580 | const paren_ty = @ptrCast(*const ZigClangParenType, ty); | 3603 | const paren_ty = @ptrCast(*const ZigClangParenType, ty); |
| 3581 | return transQualType(rp, ZigClangParenType_getInnerType(paren_ty), source_loc); | 3604 | return transQualType(rp, ZigClangParenType_getInnerType(paren_ty), source_loc); |