authorgravatar for kappaloris@gmail.comLoris Cro <kappaloris@gmail.com> 2025-02-13 20:05:00+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-02-26 14:41:33-05:00
logfff8eff2bd0cc36b192d0ab43b522161227c3c2d
tree13980a602ac4a993da81002010ef6e6fa65a2eea
parent8957b2707464a4dc7f0572bfc08fd104408bc8a3

initial implementation of `@deprecated`


9 files changed, 60 insertions(+), 2 deletions(-)

lib/std/zig/AstGen.zig+13
......@@ -9695,6 +9695,19 @@ fn builtinCall(
96959695 .volatile_cast,
96969696 => return ptrCast(gz, scope, ri, node),
96979697
9698 .deprecated => {
9699 _ = try gz.addExtendedNodeSmall(.deprecated, node, 0);
9700 switch (params.len) {
9701 0 => return .void_value,
9702 1 => return expr(gz, scope, ri, params[0]),
9703 else => return astgen.failNode(
9704 node,
9705 "expected 0 or 1 argument, found {}",
9706 .{params.len},
9707 ),
9708 }
9709 },
9710
96989711 // zig fmt: off
96999712 .has_decl => return hasDeclOrField(gz, scope, ri, node, params[0], params[1], .has_decl),
97009713 .has_field => return hasDeclOrField(gz, scope, ri, node, params[0], params[1], .has_field),
lib/std/zig/AstRlAnnotate.zig+5-2
......@@ -817,8 +817,6 @@ fn blockExpr(astrl: *AstRlAnnotate, parent_block: ?*Block, ri: ResultInfo, node:
817817}
818818
819819fn builtinCall(astrl: *AstRlAnnotate, block: ?*Block, ri: ResultInfo, node: Ast.Node.Index, args: []const Ast.Node.Index) !bool {
820 _ = ri; // Currently, no builtin consumes its result location.
821
822820 const tree = astrl.tree;
823821 const main_tokens = tree.nodes.items(.main_token);
824822 const builtin_token = main_tokens[node];
......@@ -828,6 +826,11 @@ fn builtinCall(astrl: *AstRlAnnotate, block: ?*Block, ri: ResultInfo, node: Ast.
828826 if (expected != args.len) return false;
829827 }
830828 switch (info.tag) {
829 .deprecated => if (args.len >= 1) {
830 return astrl.expr(args[0], block, ri);
831 } else {
832 return false;
833 },
831834 .import => return false,
832835 .branch_hint => {
833836 _ = try astrl.expr(args[0], block, ResultInfo.type_only);
lib/std/zig/BuiltinFn.zig+9
......@@ -121,6 +121,7 @@ pub const Tag = enum {
121121 work_item_id,
122122 work_group_size,
123123 work_group_id,
124 deprecated,
124125};
125126
126127pub const EvalToError = enum {
......@@ -1016,6 +1017,14 @@ pub const list = list: {
10161017 .illegal_outside_function = true,
10171018 },
10181019 },
1020 .{
1021 "@deprecated",
1022 .{
1023 .tag = .deprecated,
1024 .param_count = null,
1025 .eval_to_error = .maybe,
1026 },
1027 },
10191028 });
10201029};
10211030
lib/std/zig/Zir.zig+4
......@@ -2112,6 +2112,9 @@ pub const Inst = struct {
21122112 /// any code may have gone here, avoiding false-positive "unreachable code" errors.
21132113 astgen_error,
21142114
2115 /// `operand` is `src_node: i32`.
2116 deprecated,
2117
21152118 pub const InstData = struct {
21162119 opcode: Extended,
21172120 small: u16,
......@@ -4310,6 +4313,7 @@ fn findTrackableInner(
43104313 .value_placeholder => unreachable,
43114314
43124315 // Once again, we start with the boring tags.
4316 .deprecated,
43134317 .this,
43144318 .ret_addr,
43154319 .builtin_src,
src/Compilation.zig+1
......@@ -869,6 +869,7 @@ pub const cache_helpers = struct {
869869 hh.add(mod.sanitize_c);
870870 hh.add(mod.sanitize_thread);
871871 hh.add(mod.fuzz);
872 hh.add(mod.allow_deprecated);
872873 hh.add(mod.unwind_tables);
873874 hh.add(mod.structured_cfg);
874875 hh.add(mod.no_builtin);
src/Package/Module.zig+11
......@@ -27,6 +27,7 @@ red_zone: bool,
2727sanitize_c: bool,
2828sanitize_thread: bool,
2929fuzz: bool,
30allow_deprecated: bool,
3031unwind_tables: std.builtin.UnwindTables,
3132cc_argv: []const []const u8,
3233/// (SPIR-V) whether to generate a structured control flow graph or not
......@@ -95,6 +96,7 @@ pub const CreateOptions = struct {
9596 sanitize_c: ?bool = null,
9697 sanitize_thread: ?bool = null,
9798 fuzz: ?bool = null,
99 allow_deprecated: ?bool = null,
98100 structured_cfg: ?bool = null,
99101 no_builtin: ?bool = null,
100102 };
......@@ -234,6 +236,12 @@ pub fn create(arena: Allocator, options: CreateOptions) !*Package.Module {
234236 break :b false;
235237 };
236238
239 const allow_deprecated = b: {
240 if (options.inherited.allow_deprecated) |x| break :b x;
241 if (options.parent) |p| break :b p.allow_deprecated;
242 break :b false;
243 };
244
237245 const code_model = b: {
238246 if (options.inherited.code_model) |x| break :b x;
239247 if (options.parent) |p| break :b p.code_model;
......@@ -380,6 +388,7 @@ pub fn create(arena: Allocator, options: CreateOptions) !*Package.Module {
380388 .sanitize_c = sanitize_c,
381389 .sanitize_thread = sanitize_thread,
382390 .fuzz = fuzz,
391 .allow_deprecated = allow_deprecated,
383392 .unwind_tables = unwind_tables,
384393 .cc_argv = options.cc_argv,
385394 .structured_cfg = structured_cfg,
......@@ -474,6 +483,7 @@ pub fn create(arena: Allocator, options: CreateOptions) !*Package.Module {
474483 .sanitize_c = sanitize_c,
475484 .sanitize_thread = sanitize_thread,
476485 .fuzz = fuzz,
486 .allow_deprecated = allow_deprecated,
477487 .unwind_tables = unwind_tables,
478488 .cc_argv = &.{},
479489 .structured_cfg = structured_cfg,
......@@ -532,6 +542,7 @@ pub fn createLimited(gpa: Allocator, options: LimitedOptions) Allocator.Error!*P
532542 .sanitize_c = undefined,
533543 .sanitize_thread = undefined,
534544 .fuzz = undefined,
545 .allow_deprecated = undefined,
535546 .unwind_tables = undefined,
536547 .cc_argv = undefined,
537548 .structured_cfg = undefined,
src/Sema.zig+10
......@@ -1091,6 +1091,7 @@ fn analyzeBodyInner(
10911091 const map = &sema.inst_map;
10921092 const tags = sema.code.instructions.items(.tag);
10931093 const datas = sema.code.instructions.items(.data);
1094 const mod = block.ownerModule();
10941095
10951096 var crash_info = crash_report.prepAnalyzeBody(sema, block, body);
10961097 crash_info.push();
......@@ -1341,6 +1342,15 @@ fn analyzeBodyInner(
13411342 .extended => ext: {
13421343 const extended = datas[@intFromEnum(inst)].extended;
13431344 break :ext switch (extended.opcode) {
1345 .deprecated => {
1346 if (!mod.allow_deprecated) {
1347 const src_node: i32 = @bitCast(extended.operand);
1348 const src = block.nodeOffset(src_node);
1349 return sema.fail(block, src, "found deprecated code", .{});
1350 }
1351
1352 break :ext .void_value;
1353 },
13441354 // zig fmt: off
13451355 .struct_decl => try sema.zirStructDecl( block, extended, inst),
13461356 .enum_decl => try sema.zirEnumDecl( block, extended, inst),
src/main.zig+6
......@@ -520,6 +520,8 @@ const usage_build_generic =
520520 \\ -fno-sanitize-thread Disable Thread Sanitizer
521521 \\ -ffuzz Enable fuzz testing instrumentation
522522 \\ -fno-fuzz Disable fuzz testing instrumentation
523 \\ -fallow-deprecated Allow usage of deprecated code
524 \\ -fno-allow-deprecated Disallow usage of deprecated code
523525 \\ -funwind-tables Always produce unwind table entries for all functions
524526 \\ -fasync-unwind-tables Always produce asynchronous unwind table entries for all functions
525527 \\ -fno-unwind-tables Never produce unwind table entries
......@@ -1454,6 +1456,10 @@ fn buildOutputType(
14541456 mod_opts.fuzz = true;
14551457 } else if (mem.eql(u8, arg, "-fno-fuzz")) {
14561458 mod_opts.fuzz = false;
1459 } else if (mem.eql(u8, arg, "-fallow-deprecated")) {
1460 mod_opts.allow_deprecated = true;
1461 } else if (mem.eql(u8, arg, "-fno-allow-deprecated")) {
1462 mod_opts.allow_deprecated = false;
14571463 } else if (mem.eql(u8, arg, "-fllvm")) {
14581464 create_module.opts.use_llvm = true;
14591465 } else if (mem.eql(u8, arg, "-fno-llvm")) {
src/print_zir.zig+1
......@@ -535,6 +535,7 @@ const Writer = struct {
535535 .c_va_start,
536536 .in_comptime,
537537 .value_placeholder,
538 .deprecated,
538539 => try self.writeExtNode(stream, extended),
539540
540541 .builtin_src => {