Commit 6d1292552e
lib/zig.h
@@ -65,8 +65,17 @@ typedef char bool;
#elif zig_has_attribute(aligned)
#define zig_align(alignment) __attribute__((aligned(alignment)))
#elif _MSC_VER
+#define zig_align zig_align_unavailable
#else
-#error the C compiler being used does not support aligning variables
+#define zig_align zig_align_unavailable
+#endif
+
+#if zig_has_attribute(aligned)
+#define zig_align_fn(alignment) __attribute__((aligned(alignment)))
+#elif _MSC_VER
+#define zig_align_fn zig_align_fn_unavailable
+#else
+#define zig_align_fn zig_align_fn_unavailable
#endif
#if zig_has_builtin(unreachable)
src/codegen/c.zig
@@ -1387,6 +1387,7 @@ pub const DeclGen = struct {
try dg.renderType(w, Type.void, kind);
}
try w.writeByte(')');
+ if (fn_info.alignment > 0) try w.print(" zig_align_fn({})", .{fn_info.alignment});
}
fn renderPtrToFnTypedef(dg: *DeclGen, t: Type) error{ OutOfMemory, AnalysisFail }![]const u8 {
test/behavior/align.zig
@@ -520,7 +520,6 @@ test "align(@alignOf(T)) T does not force resolution of T" {
test "align(N) on functions" {
if (builtin.zig_backend == .stage1) return error.SkipZigTest;
- if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO