| ... | ... | @@ -833,6 +833,27 @@ static bool qual_type_has_wrapping_overflow(Context *c, ZigClangQualType qt) { |
| 833 | 833 | } |
| 834 | 834 | } |
| 835 | 835 | |
| 836 | static bool type_is_function(Context *c, const ZigClangType *ty, ZigClangSourceLocation source_loc) { |
| 837 | switch (ZigClangType_getTypeClass(ty)) { |
| 838 | case ZigClangType_FunctionProto: |
| 839 | case ZigClangType_FunctionNoProto: |
| 840 | return true; |
| 841 | case ZigClangType_Elaborated: { |
| 842 | const clang::ElaboratedType *elaborated_ty = reinterpret_cast<const clang::ElaboratedType*>(ty); |
| 843 | ZigClangQualType qt = bitcast(elaborated_ty->getNamedType()); |
| 844 | return type_is_function(c, ZigClangQualType_getTypePtr(qt), source_loc); |
| 845 | } |
| 846 | case ZigClangType_Typedef: { |
| 847 | const ZigClangTypedefType *typedef_ty = reinterpret_cast<const ZigClangTypedefType*>(ty); |
| 848 | const ZigClangTypedefNameDecl *typedef_decl = ZigClangTypedefType_getDecl(typedef_ty); |
| 849 | ZigClangQualType underlying_type = ZigClangTypedefNameDecl_getUnderlyingType(typedef_decl); |
| 850 | return type_is_function(c, ZigClangQualType_getTypePtr(underlying_type), source_loc); |
| 851 | } |
| 852 | default: |
| 853 | return false; |
| 854 | } |
| 855 | } |
| 856 | |
| 836 | 857 | static bool type_is_opaque(Context *c, const ZigClangType *ty, ZigClangSourceLocation source_loc) { |
| 837 | 858 | switch (ZigClangType_getTypeClass(ty)) { |
| 838 | 859 | case ZigClangType_Builtin: { |
| ... | ... | @@ -1034,7 +1055,9 @@ static AstNode *trans_type(Context *c, const ZigClangType *ty, ZigClangSourceLoc |
| 1034 | 1055 | return trans_create_node_prefix_op(c, PrefixOpOptional, child_node); |
| 1035 | 1056 | } |
| 1036 | 1057 | |
| 1037 | | if (type_is_opaque(c, ZigClangQualType_getTypePtr(child_qt), source_loc)) { |
| 1058 | if (type_is_function(c, ZigClangQualType_getTypePtr(child_qt), source_loc)) { |
| 1059 | return trans_create_node_prefix_op(c, PrefixOpOptional, child_node); |
| 1060 | } else if (type_is_opaque(c, ZigClangQualType_getTypePtr(child_qt), source_loc)) { |
| 1038 | 1061 | AstNode *pointer_node = trans_create_node_ptr_type(c, |
| 1039 | 1062 | ZigClangQualType_isConstQualified(child_qt), |
| 1040 | 1063 | ZigClangQualType_isVolatileQualified(child_qt), |