Commit 449554a730

Andrew Kelley <andrew@ziglang.org>
2022-02-02 02:25:28
stage2: remove anytype fields from the language
closes #10705
1 parent f4a2493
lib/std/crypto/benchmark.zig
@@ -297,8 +297,8 @@ pub fn benchmarkAes8(comptime Aes: anytype, comptime count: comptime_int) !u64 {
 }
 
 const CryptoPwhash = struct {
-    hashFn: anytype,
-    params: anytype,
+    hashFn: @compileError("anytype fields are removed from the language"),
+    params: @compileError("anytype fields are removed from the language"),
     name: []const u8,
 };
 const bcrypt_params = crypto.pwhash.bcrypt.Params{ .rounds_log = 12 };
lib/std/zig/Ast.zig
@@ -366,7 +366,6 @@ pub fn firstToken(tree: Ast, node: Node.Index) TokenIndex {
         .builtin_call,
         .builtin_call_comma,
         .error_set_decl,
-        .@"anytype",
         .@"comptime",
         .@"nosuspend",
         .asm_simple,
@@ -729,7 +728,6 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex {
         .error_value,
         => return datas[n].rhs + end_offset,
 
-        .@"anytype",
         .anyframe_literal,
         .char_literal,
         .integer_literal,
@@ -2935,9 +2933,6 @@ pub const Node = struct {
         /// main_token is the field name identifier.
         /// lastToken() does not include the possible trailing comma.
         container_field,
-        /// `anytype`. both lhs and rhs unused.
-        /// Used by `ContainerField`.
-        @"anytype",
         /// `comptime lhs`. rhs unused.
         @"comptime",
         /// `nosuspend lhs`. rhs unused.
lib/std/zig/parse.zig
@@ -786,19 +786,8 @@ const Parser = struct {
         var align_expr: Node.Index = 0;
         var type_expr: Node.Index = 0;
         if (p.eatToken(.colon)) |_| {
-            if (p.eatToken(.keyword_anytype)) |anytype_tok| {
-                type_expr = try p.addNode(.{
-                    .tag = .@"anytype",
-                    .main_token = anytype_tok,
-                    .data = .{
-                        .lhs = undefined,
-                        .rhs = undefined,
-                    },
-                });
-            } else {
-                type_expr = try p.expectTypeExpr();
-                align_expr = try p.parseByteAlign();
-            }
+            type_expr = try p.expectTypeExpr();
+            align_expr = try p.parseByteAlign();
         }
 
         const value_expr: Node.Index = if (p.eatToken(.equal) == null) 0 else try p.expectExpr();
lib/std/zig/render.zig
@@ -229,8 +229,6 @@ fn renderExpression(gpa: Allocator, ais: *Ais, tree: Ast, node: Ast.Node.Index,
             return renderToken(ais, tree, main_tokens[node] + 2, space);
         },
 
-        .@"anytype" => return renderToken(ais, tree, main_tokens[node], space),
-
         .block_two,
         .block_two_semicolon,
         => {
lib/std/json.zig
@@ -1791,8 +1791,9 @@ fn parseInternal(
             }
             inline for (structInfo.fields) |field, i| {
                 if (!fields_seen[i]) {
-                    if (field.default_value) |default| {
+                    if (field.default_value) |default_ptr| {
                         if (!field.is_comptime) {
+                            const default = @ptrCast(*const field.field_type, default_ptr).*;
                             @field(r, field.name) = default;
                         }
                     } else {
src/stage1/ir.cpp
@@ -19048,6 +19048,10 @@ static ZigType *type_info_to_type(IrAnalyze *ira, Scope *scope, AstNode *source_
                     return ira->codegen->invalid_inst_gen->value->type;
                 }
 
+                if ((err = type_resolve(ira->codegen, elem_type, ResolveStatusAlignmentKnown))) {
+                    return ira->codegen->invalid_inst_gen->value->type;
+                }
+
                 ZigType *ptr_type = get_pointer_to_type_extra2(ira->codegen,
                     elem_type,
                     is_const,
src/AstGen.zig
@@ -468,7 +468,6 @@ fn lvalExpr(gz: *GenZir, scope: *Scope, node: Ast.Node.Index) InnerError!Zir.Ins
         .for_simple,
         .@"suspend",
         .@"continue",
-        .@"anytype",
         .fn_proto_simple,
         .fn_proto_multi,
         .fn_proto_one,
@@ -558,8 +557,6 @@ fn expr(gz: *GenZir, scope: *Scope, rl: ResultLoc, node: Ast.Node.Index) InnerEr
         .asm_output => unreachable, // Handled in `asmExpr`.
         .asm_input => unreachable, // Handled in `asmExpr`.
 
-        .@"anytype" => unreachable, // Handled in `containerDecl`.
-
         .assign => {
             try assign(gz, scope, node);
             return rvalue(gz, rl, .void_value, node);
@@ -3826,7 +3823,6 @@ fn structDeclInner(
     const astgen = gz.astgen;
     const gpa = astgen.gpa;
     const tree = astgen.tree;
-    const node_tags = tree.nodes.items(.tag);
 
     var namespace: Scope.Namespace = .{
         .parent = scope,
@@ -3875,10 +3871,7 @@ fn structDeclInner(
             return astgen.failTok(member.ast.name_token, "struct field missing type", .{});
         }
 
-        const field_type: Zir.Inst.Ref = if (node_tags[member.ast.type_expr] == .@"anytype")
-            .none
-        else
-            try typeExpr(&block_scope, &namespace.base, member.ast.type_expr);
+        const field_type = try typeExpr(&block_scope, &namespace.base, member.ast.type_expr);
         wip_members.appendToField(@enumToInt(field_type));
 
         const doc_comment_index = try astgen.docCommentAsString(member.firstToken());
@@ -3951,8 +3944,6 @@ fn unionDeclInner(
 
     const astgen = gz.astgen;
     const gpa = astgen.gpa;
-    const tree = astgen.tree;
-    const node_tags = tree.nodes.items(.tag);
 
     var namespace: Scope.Namespace = .{
         .parent = scope,
@@ -4013,10 +4004,7 @@ fn unionDeclInner(
         wip_members.nextField(bits_per_field, .{ have_type, have_align, have_value, unused });
 
         if (have_type) {
-            const field_type: Zir.Inst.Ref = if (node_tags[member.ast.type_expr] == .@"anytype")
-                .none
-            else
-                try typeExpr(&block_scope, &namespace.base, member.ast.type_expr);
+            const field_type = try typeExpr(&block_scope, &namespace.base, member.ast.type_expr);
             wip_members.appendToField(@enumToInt(field_type));
         } else if (arg_inst == .none and !have_auto_enum) {
             return astgen.failNode(member_node, "union field missing type", .{});
@@ -7791,7 +7779,6 @@ fn nodeMayNeedMemoryLocation(tree: *const Ast, start_node: Ast.Node.Index, have_
             .ptr_type,
             .ptr_type_bit_range,
             .@"suspend",
-            .@"anytype",
             .fn_proto_simple,
             .fn_proto_multi,
             .fn_proto_one,
@@ -8052,7 +8039,6 @@ fn nodeMayEvalToError(tree: *const Ast, start_node: Ast.Node.Index) BuiltinFn.Ev
             .ptr_type,
             .ptr_type_bit_range,
             .@"suspend",
-            .@"anytype",
             .fn_proto_simple,
             .fn_proto_multi,
             .fn_proto_one,
@@ -8232,7 +8218,6 @@ fn nodeImpliesMoreThanOnePossibleValue(tree: *const Ast, start_node: Ast.Node.In
             .@"resume",
             .array_type,
             .@"suspend",
-            .@"anytype",
             .fn_decl,
             .anyframe_literal,
             .integer_literal,
@@ -8474,7 +8459,6 @@ fn nodeImpliesComptimeOnly(tree: *const Ast, start_node: Ast.Node.Index) bool {
             .@"resume",
             .array_type,
             .@"suspend",
-            .@"anytype",
             .fn_decl,
             .anyframe_literal,
             .integer_literal,
test/behavior/struct_llvm.zig
@@ -618,21 +618,6 @@ test "anonymous struct literal assigned to variable" {
     try expect(vec.@"2" == 99);
 }
 
-test "struct with var field" {
-    if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
-
-    const Point = struct {
-        x: anytype,
-        y: anytype,
-    };
-    const pt = Point{
-        .x = 1,
-        .y = 2,
-    };
-    try expect(pt.x == 1);
-    try expect(pt.y == 2);
-}
-
 test "comptime struct field" {
     if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
 
test/behavior/type_info.zig
@@ -436,13 +436,6 @@ test "@typeInfo does not force declarations into existence" {
     comptime try expect(@typeInfo(S).Struct.fields.len == 1);
 }
 
-test "default value for a anytype field" {
-    if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
-
-    const S = struct { x: anytype };
-    try expect(@typeInfo(S).Struct.fields[0].default_value == null);
-}
-
 fn add(a: i32, b: i32) i32 {
     return a + b;
 }
test/behavior/union_stage1.zig
@@ -419,8 +419,3 @@ test "union enum type gets a separate scope" {
 
     try S.doTheTest();
 }
-
-test "anytype union field: issue #9233" {
-    const Quux = union(enum) { bar: anytype };
-    _ = Quux;
-}
test/compile_errors.zig
@@ -4207,16 +4207,6 @@ pub fn addCases(ctx: *TestContext) !void {
         "tmp.zig:5:17: error: expected type 'void', found 'error{ShouldBeCompileError}'",
     });
 
-    ctx.objErrStage1("var makes structs required to be comptime known",
-        \\export fn entry() void {
-        \\   const S = struct{v: anytype};
-        \\   var s = S{.v=@as(i32, 10)};
-        \\   _ = s;
-        \\}
-    , &[_][]const u8{
-        "tmp.zig:3:4: error: variable of type 'S' must be const or comptime",
-    });
-
     ctx.objErrStage1("@ptrCast discards const qualifier",
         \\export fn entry() void {
         \\    const x: i32 = 1234;