diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2023-04-29 11:13:51 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-04-29 11:13:51 -0700 |
| commit | c83ab7cc6a7d779eecd51eb10c46d1242aaf1d9d (patch) | |
| tree | 0a079e25b35539cfa169cb529eec278c15003d4c /src | |
| parent | 7baf0de807afc8c2c56cc1278e624e9103c30cfb (diff) | |
| parent | bd8b5c25ece2fa158196381004db6e655226576c (diff) | |
| download | zig-c83ab7cc6a7d779eecd51eb10c46d1242aaf1d9d.tar.gz zig-c83ab7cc6a7d779eecd51eb10c46d1242aaf1d9d.zip | |
Merge pull request #15503 from r00ster91/noinline
Sema: emit error for always_inline call of noinline function
Diffstat (limited to 'src')
| -rw-r--r-- | src/Sema.zig | 10 | ||||
| -rw-r--r-- | src/type.zig | 13 |
2 files changed, 21 insertions, 2 deletions
diff --git a/src/Sema.zig b/src/Sema.zig index df199be97c..8593edf6cc 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -6565,7 +6565,10 @@ fn analyzeCall( }; if (modifier == .never_inline and func_ty_info.cc == .Inline) { - return sema.fail(block, call_src, "no-inline call of inline function", .{}); + return sema.fail(block, call_src, "'never_inline' call of inline function", .{}); + } + if (modifier == .always_inline and func_ty_info.is_noinline) { + return sema.fail(block, call_src, "'always_inline' call of noinline function", .{}); } const gpa = sema.gpa; @@ -8784,7 +8787,8 @@ fn funcCommon( if (!is_generic and block.params.items.len == 0 and !var_args and !inferred_error_set and alignment.? == 0 and address_space.? == target_util.defaultAddressSpace(target, .function) and - section == .default) + section == .default and + !is_noinline) { if (bare_return_type.zigTypeTag() == .NoReturn and cc.? == .Unspecified) { break :fn_ty Type.initTag(.fn_noreturn_no_args); @@ -9002,6 +9006,7 @@ fn funcCommon( .addrspace_is_generic = address_space == null, .is_var_args = var_args, .is_generic = is_generic, + .is_noinline = is_noinline, .noalias_bits = noalias_bits, }); }; @@ -19217,6 +19222,7 @@ fn zirReify(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData, in .cc = cc, .is_var_args = is_var_args, .is_generic = false, + .is_noinline = false, .align_is_generic = false, .cc_is_generic = false, .section_is_generic = false, diff --git a/src/type.zig b/src/type.zig index 816a1ee2e0..b25f13342d 100644 --- a/src/type.zig +++ b/src/type.zig @@ -666,6 +666,9 @@ pub const Type = extern union { if (a_info.is_generic != b_info.is_generic) return false; + if (a_info.is_noinline != b_info.is_noinline) + return false; + if (a_info.noalias_bits != b_info.noalias_bits) return false; @@ -1074,6 +1077,7 @@ pub const Type = extern union { } std.hash.autoHash(hasher, fn_info.is_var_args); std.hash.autoHash(hasher, fn_info.is_generic); + std.hash.autoHash(hasher, fn_info.is_noinline); std.hash.autoHash(hasher, fn_info.noalias_bits); std.hash.autoHash(hasher, fn_info.param_types.len); @@ -1454,6 +1458,7 @@ pub const Type = extern union { .alignment = payload.alignment, .is_var_args = payload.is_var_args, .is_generic = payload.is_generic, + .is_noinline = payload.is_noinline, .comptime_params = comptime_params.ptr, .align_is_generic = payload.align_is_generic, .cc_is_generic = payload.cc_is_generic, @@ -2069,6 +2074,9 @@ pub const Type = extern union { .function => { const fn_info = ty.fnInfo(); + if (fn_info.is_noinline) { + try writer.writeAll("noinline "); + } try writer.writeAll("fn("); for (fn_info.param_types, 0..) |param_ty, i| { if (i != 0) try writer.writeAll(", "); @@ -4863,6 +4871,7 @@ pub const Type = extern union { .alignment = 0, .is_var_args = false, .is_generic = false, + .is_noinline = false, .align_is_generic = false, .cc_is_generic = false, .section_is_generic = false, @@ -4877,6 +4886,7 @@ pub const Type = extern union { .alignment = 0, .is_var_args = false, .is_generic = false, + .is_noinline = false, .align_is_generic = false, .cc_is_generic = false, .section_is_generic = false, @@ -4891,6 +4901,7 @@ pub const Type = extern union { .alignment = 0, .is_var_args = false, .is_generic = false, + .is_noinline = false, .align_is_generic = false, .cc_is_generic = false, .section_is_generic = false, @@ -4905,6 +4916,7 @@ pub const Type = extern union { .alignment = 0, .is_var_args = false, .is_generic = false, + .is_noinline = false, .align_is_generic = false, .cc_is_generic = false, .section_is_generic = false, @@ -6367,6 +6379,7 @@ pub const Type = extern union { cc: std.builtin.CallingConvention, is_var_args: bool, is_generic: bool, + is_noinline: bool, align_is_generic: bool, cc_is_generic: bool, section_is_generic: bool, |
