authorgravatar for evan@lagerdata.comEvan Haas <evan@lagerdata.com> 2022-01-10 11:54:11-08:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-01-11 12:42:23-05:00
logf4b3f1d6022265992f87cea1d9591ffa8ec226d6
tree25813410d61efaaf1520ddf31edb362ef2f0bb18
parent6d9c02a54fc847e9bed3096f910e03babec63acb

translate-c: Handle typedef'ed void return type for functions.

Fixes #10356

3 files changed, 22 insertions(+), 5 deletions(-)

src/translate_c.zig+11-4
...@@ -4824,11 +4824,18 @@ fn qualTypeWasDemotedToOpaque(c: *Context, qt: clang.QualType) bool {...@@ -4824,11 +4824,18 @@ fn qualTypeWasDemotedToOpaque(c: *Context, qt: clang.QualType) bool {
48244824
4825fn isAnyopaque(qt: clang.QualType) bool {4825fn isAnyopaque(qt: clang.QualType) bool {
4826 const ty = qt.getTypePtr();4826 const ty = qt.getTypePtr();
4827 if (ty.getTypeClass() == .Builtin) {4827 switch (ty.getTypeClass()) {
4828 const builtin_ty = @ptrCast(*const clang.BuiltinType, ty);4828 .Builtin => {
4829 return builtin_ty.getKind() == .Void;4829 const builtin_ty = @ptrCast(*const clang.BuiltinType, ty);
4830 return builtin_ty.getKind() == .Void;
4831 },
4832 .Typedef => {
4833 const typedef_ty = @ptrCast(*const clang.TypedefType, ty);
4834 const typedef_decl = typedef_ty.getDecl();
4835 return isAnyopaque(typedef_decl.getUnderlyingType());
4836 },
4837 else => return false,
4830 }4838 }
4831 return false;
4832}4839}
48334840
4834const FnDeclContext = struct {4841const FnDeclContext = struct {
test/run_translated_c.zig+10
...@@ -1809,4 +1809,14 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void {...@@ -1809,4 +1809,14 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void {
1809 \\ return 0;1809 \\ return 0;
1810 \\}1810 \\}
1811 , "");1811 , "");
1812
1813 cases.add("Typedef'ed void used as return type. Issue #10356",
1814 \\typedef void V;
1815 \\V foo(V *f) {}
1816 \\int main(void) {
1817 \\ int x = 0;
1818 \\ foo(&x);
1819 \\ return 0;
1820 \\}
1821 , "");
1812}1822}
test/translate_c.zig+1-1
...@@ -814,7 +814,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -814,7 +814,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
814 , &[_][]const u8{814 , &[_][]const u8{
815 \\pub const Foo = anyopaque;815 \\pub const Foo = anyopaque;
816 ,816 ,
817 \\pub extern fn fun(a: ?*Foo) Foo;817 \\pub extern fn fun(a: ?*Foo) void;
818 });818 });
819819
820 cases.add("duplicate typedef",820 cases.add("duplicate typedef",