| ... | @@ -833,6 +833,27 @@ static bool qual_type_has_wrapping_overflow(Context *c, ZigClangQualType qt) { | ... | @@ -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 | static bool type_is_opaque(Context *c, const ZigClangType *ty, ZigClangSourceLocation source_loc) { | 857 | static bool type_is_opaque(Context *c, const ZigClangType *ty, ZigClangSourceLocation source_loc) { |
| 837 | switch (ZigClangType_getTypeClass(ty)) { | 858 | switch (ZigClangType_getTypeClass(ty)) { |
| 838 | case ZigClangType_Builtin: { | 859 | case ZigClangType_Builtin: { |
| ... | @@ -1034,7 +1055,9 @@ static AstNode *trans_type(Context *c, const ZigClangType *ty, ZigClangSourceLoc | ... | @@ -1034,7 +1055,9 @@ static AstNode *trans_type(Context *c, const ZigClangType *ty, ZigClangSourceLoc |
| 1034 | return trans_create_node_prefix_op(c, PrefixOpOptional, child_node); | 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 | AstNode *pointer_node = trans_create_node_ptr_type(c, | 1061 | AstNode *pointer_node = trans_create_node_ptr_type(c, |
| 1039 | ZigClangQualType_isConstQualified(child_qt), | 1062 | ZigClangQualType_isConstQualified(child_qt), |
| 1040 | ZigClangQualType_isVolatileQualified(child_qt), | 1063 | ZigClangQualType_isVolatileQualified(child_qt), |