diff --git a/src-self-hosted/clang.zig b/src-self-hosted/clang.zig index 5266f27371b36c50a971768aec8737503c56cd5d..8f3e539162edb1f50580003688850a1cc1ee6161 100644 --- a/src-self-hosted/clang.zig +++ b/src-self-hosted/clang.zig @@ -42,6 +42,7 @@ pub const struct_ZigClangImplicitCastExpr = @OpaqueType(); pub const struct_ZigClangIncompleteArrayType = @OpaqueType(); pub const struct_ZigClangIntegerLiteral = @OpaqueType(); pub const struct_ZigClangMacroDefinitionRecord = @OpaqueType(); +pub const struct_ZigClangMacroQualifiedType = @OpaqueType(); pub const struct_ZigClangMemberExpr = @OpaqueType(); pub const struct_ZigClangNamedDecl = @OpaqueType(); pub const struct_ZigClangNone = @OpaqueType(); @@ -831,6 +832,7 @@ pub const ZigClangImplicitCastExpr = struct_ZigClangImplicitCastExpr; pub const ZigClangIncompleteArrayType = struct_ZigClangIncompleteArrayType; pub const ZigClangIntegerLiteral = struct_ZigClangIntegerLiteral; pub const ZigClangMacroDefinitionRecord = struct_ZigClangMacroDefinitionRecord; +pub const ZigClangMacroQualifiedType = struct_ZigClangMacroQualifiedType; pub const ZigClangMemberExpr = struct_ZigClangMemberExpr; pub const ZigClangNamedDecl = struct_ZigClangNamedDecl; pub const ZigClangNone = struct_ZigClangNone; @@ -937,6 +939,8 @@ pub extern fn ZigClangElaboratedType_getNamedType(*const ZigClangElaboratedType) pub extern fn ZigClangAttributedType_getEquivalentType(*const ZigClangAttributedType) ZigClangQualType; +pub extern fn ZigClangMacroQualifiedType_getModifiedType(*const ZigClangMacroQualifiedType) ZigClangQualType; + pub extern fn ZigClangCStyleCastExpr_getBeginLoc(*const ZigClangCStyleCastExpr) ZigClangSourceLocation; pub extern fn ZigClangCStyleCastExpr_getSubExpr(*const ZigClangCStyleCastExpr) *const ZigClangExpr; pub extern fn ZigClangCStyleCastExpr_getType(*const ZigClangCStyleCastExpr) ZigClangQualType; diff --git a/src/translate_c.cpp b/src/translate_c.cpp index 2214dc7d547c29f108a82ed6c1c7e0c1776c4b73..3acfb05e853ffa09aae2c095f8c6159378b1e978 100644 --- a/src/translate_c.cpp +++ b/src/translate_c.cpp @@ -1213,6 +1213,11 @@ static AstNode *trans_type(Context *c, const ZigClangType *ty, ZigClangSourceLoc const ZigClangAttributedType *attributed_ty = reinterpret_cast(ty); return trans_qual_type(c, ZigClangAttributedType_getEquivalentType(attributed_ty), source_loc); } + case ZigClangType_MacroQualified: + { + const ZigClangMacroQualifiedType *macroqualified_ty = reinterpret_cast(ty); + return trans_qual_type(c, ZigClangMacroQualifiedType_getModifiedType(macroqualified_ty), source_loc); + } case ZigClangType_IncompleteArray: { const ZigClangIncompleteArrayType *incomplete_array_ty = reinterpret_cast(ty); @@ -1262,7 +1267,6 @@ static AstNode *trans_type(Context *c, const ZigClangType *ty, ZigClangSourceLoc case ZigClangType_DeducedTemplateSpecialization: case ZigClangType_DependentAddressSpace: case ZigClangType_DependentVector: - case ZigClangType_MacroQualified: emit_warning(c, source_loc, "unsupported type: '%s'", ZigClangType_getTypeClassName(ty)); return nullptr; } diff --git a/src/zig_clang.cpp b/src/zig_clang.cpp index 1025216dc961022b384c132b55202a4090a3c5a5..3c04a2dc8acf240cfad194ba1705a6c69686cba3 100644 --- a/src/zig_clang.cpp +++ b/src/zig_clang.cpp @@ -2214,6 +2214,11 @@ struct ZigClangQualType ZigClangAttributedType_getEquivalentType(const struct Zi return bitcast(casted->getEquivalentType()); } +struct ZigClangQualType ZigClangMacroQualifiedType_getModifiedType(const struct ZigClangMacroQualifiedType *self) { + auto casted = reinterpret_cast(self); + return bitcast(casted->getModifiedType()); +} + struct ZigClangQualType ZigClangElaboratedType_getNamedType(const struct ZigClangElaboratedType *self) { auto casted = reinterpret_cast(self); return bitcast(casted->getNamedType()); diff --git a/src/zig_clang.h b/src/zig_clang.h index baa0105553f21a2ff737df64b999b0f781fe7e85..c4c5c378ebb4fe552a256d94f074d5181c67f7b6 100644 --- a/src/zig_clang.h +++ b/src/zig_clang.h @@ -112,6 +112,7 @@ struct ZigClangImplicitCastExpr; struct ZigClangIncompleteArrayType; struct ZigClangIntegerLiteral; struct ZigClangMacroDefinitionRecord; +struct ZigClangMacroQualifiedType; struct ZigClangMemberExpr; struct ZigClangNamedDecl; struct ZigClangNone; @@ -1004,6 +1005,8 @@ ZIG_EXTERN_C struct ZigClangQualType ZigClangParenType_getInnerType(const struct ZIG_EXTERN_C struct ZigClangQualType ZigClangAttributedType_getEquivalentType(const struct ZigClangAttributedType *); +ZIG_EXTERN_C struct ZigClangQualType ZigClangMacroQualifiedType_getModifiedType(const struct ZigClangMacroQualifiedType *); + ZIG_EXTERN_C struct ZigClangQualType ZigClangElaboratedType_getNamedType(const struct ZigClangElaboratedType *); ZIG_EXTERN_C enum ZigClangElaboratedTypeKeyword ZigClangElaboratedType_getKeyword(const struct ZigClangElaboratedType *); diff --git a/test/translate_c.zig b/test/translate_c.zig index 17b089d1dbac633401f153cf1f43216bb1c656ef..f78e2181ebad9eac3d56570e88195724d423a4b7 100644 --- a/test/translate_c.zig +++ b/test/translate_c.zig @@ -1814,6 +1814,15 @@ pub fn addCases(cases: *tests.TranslateCContext) void { \\ ); + if (builtin.os != builtin.Os.windows) { + // sysv_abi not currently supported on windows + cases.add("Macro qualified functions", + \\void __attribute__((sysv_abi)) foo(void); + , + \\pub extern fn foo() void; + ); + } + /////////////// Cases for only stage1 because stage2 behavior is better //////////////// cases.addC("Parameterless function prototypes", \\void foo() {}