diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2022-10-09 01:48:26 -0400 |
|---|---|---|
| committer | Jacob Young <jacobly0@users.noreply.github.com> | 2022-10-25 05:11:28 -0400 |
| commit | a12535f5014cb2d4878581871287f17a31f28961 (patch) | |
| tree | 7bbb5199f9797d19d1c3bb66e391c5d142fec65c /src/codegen/c.zig | |
| parent | f399dd107a2b0387ca54688741d6c3fa0109ed39 (diff) | |
| download | zig-a12535f5014cb2d4878581871287f17a31f28961.tar.gz zig-a12535f5014cb2d4878581871287f17a31f28961.zip | |
cbe: fix global access
Diffstat (limited to 'src/codegen/c.zig')
| -rw-r--r-- | src/codegen/c.zig | 24 |
1 files changed, 10 insertions, 14 deletions
diff --git a/src/codegen/c.zig b/src/codegen/c.zig index 6b25cf8360..a60e6986a4 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -386,6 +386,10 @@ pub const DeclGen = struct { val: Value, decl_index: Decl.Index, ) error{ OutOfMemory, AnalysisFail }!void { + if (ty.isPtrAtRuntime() and !ty.elemType2().isFnOrHasRuntimeBits()) { + return dg.writeCValue(writer, CValue{ .undefined_ptr = ty }); + } + if (ty.isSlice()) { try writer.writeByte('('); try dg.renderTypecast(writer, ty); @@ -404,23 +408,15 @@ pub const DeclGen = struct { // them). The analysis until now should ensure that the C function // pointers are compatible. If they are not, then there is a bug // somewhere and we should let the C compiler tell us about it. - if (ty.castPtrToFn() == null) { - // Determine if we must pointer cast. - if (ty.eql(decl.ty, dg.module)) { - try writer.writeByte('&'); - try dg.renderDeclName(writer, decl_index); - return; - } - + const need_typecast = if (ty.castPtrToFn()) |_| false else !ty.eql(decl.ty, dg.module); + if (need_typecast) { try writer.writeAll("(("); try dg.renderTypecast(writer, ty); - try writer.writeAll(")&"); - try dg.renderDeclName(writer, decl_index); try writer.writeByte(')'); - return; } - + try writer.writeByte('&'); try dg.renderDeclName(writer, decl_index); + if (need_typecast) try writer.writeByte(')'); } // Renders a "parent" pointer by recursing to the root decl/variable @@ -1830,7 +1826,7 @@ pub const DeclGen = struct { if (dg.module.decl_exports.get(decl_index)) |exports| { return writer.writeAll(exports[0].options.name); - } else if (decl.val.tag() == .extern_fn) { + } else if (decl.isExtern()) { return writer.writeAll(mem.sliceTo(decl.name, 0)); } else { const gpa = dg.module.gpa; @@ -1997,7 +1993,7 @@ pub fn genDecl(o: *Object) !void { try o.dg.renderTypeAndName(fwd_decl_writer, o.dg.decl.ty, decl_c_value, .Mut, o.dg.decl.@"align"); try fwd_decl_writer.writeAll(";\n"); - if (variable.init.isUndefDeep()) { + if (variable.is_extern or variable.init.isUndefDeep()) { return; } |
