authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-05-11 14:50:39-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-05-11 14:51:08-07:00
logfb3952615948748baab6cac02371a7cbfff4e9ac
treefbe96459ea6e1314172d177f4f080a7801d72569
parentbcf15e39e2d4e2243f475852aca7749e40a70fbd

AstGen: support emitting multiple compile errors


3 files changed, 256 insertions(+), 64 deletions(-)

BRANCH_TODO+2-3
...@@ -44,9 +44,6 @@...@@ -44,9 +44,6 @@
4444
45 * sort compile errors before presenting them to eliminate nondeterministic error reporting45 * sort compile errors before presenting them to eliminate nondeterministic error reporting
4646
47 * when handling decls, catch the error and continue, so that
48 AstGen can report more than one compile error.
49
50 * AstGen: add result location pointers to function calls47 * AstGen: add result location pointers to function calls
51 * nested function decl: how to refer to params?48 * nested function decl: how to refer to params?
5249
...@@ -66,3 +63,5 @@...@@ -66,3 +63,5 @@
6663
67 * better anonymous Decl naming convention64 * better anonymous Decl naming convention
68 - avoid the global atomic integer for the number because of contention65 - avoid the global atomic integer for the number because of contention
66
67 * AstGen memory leak with `block_gz.labeled_store_to_block_ptr_list.append`
src/AstGen.zig+240-60
...@@ -3317,20 +3317,32 @@ fn structDeclInner(...@@ -3317,20 +3317,32 @@ fn structDeclInner(
3317 switch (node_tags[fn_proto]) {3317 switch (node_tags[fn_proto]) {
3318 .fn_proto_simple => {3318 .fn_proto_simple => {
3319 var params: [1]ast.Node.Index = undefined;3319 var params: [1]ast.Node.Index = undefined;
3320 try astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProtoSimple(&params, fn_proto));3320 astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProtoSimple(&params, fn_proto)) catch |err| switch (err) {
3321 error.OutOfMemory => return error.OutOfMemory,
3322 error.AnalysisFail => {},
3323 };
3321 continue;3324 continue;
3322 },3325 },
3323 .fn_proto_multi => {3326 .fn_proto_multi => {
3324 try astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProtoMulti(fn_proto));3327 astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProtoMulti(fn_proto)) catch |err| switch (err) {
3328 error.OutOfMemory => return error.OutOfMemory,
3329 error.AnalysisFail => {},
3330 };
3325 continue;3331 continue;
3326 },3332 },
3327 .fn_proto_one => {3333 .fn_proto_one => {
3328 var params: [1]ast.Node.Index = undefined;3334 var params: [1]ast.Node.Index = undefined;
3329 try astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProtoOne(&params, fn_proto));3335 astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProtoOne(&params, fn_proto)) catch |err| switch (err) {
3336 error.OutOfMemory => return error.OutOfMemory,
3337 error.AnalysisFail => {},
3338 };
3330 continue;3339 continue;
3331 },3340 },
3332 .fn_proto => {3341 .fn_proto => {
3333 try astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProto(fn_proto));3342 astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProto(fn_proto)) catch |err| switch (err) {
3343 error.OutOfMemory => return error.OutOfMemory,
3344 error.AnalysisFail => {},
3345 };
3334 continue;3346 continue;
3335 },3347 },
3336 else => unreachable,3348 else => unreachable,
...@@ -3338,50 +3350,83 @@ fn structDeclInner(...@@ -3338,50 +3350,83 @@ fn structDeclInner(
3338 },3350 },
3339 .fn_proto_simple => {3351 .fn_proto_simple => {
3340 var params: [1]ast.Node.Index = undefined;3352 var params: [1]ast.Node.Index = undefined;
3341 try astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProtoSimple(&params, member_node));3353 astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProtoSimple(&params, member_node)) catch |err| switch (err) {
3354 error.OutOfMemory => return error.OutOfMemory,
3355 error.AnalysisFail => {},
3356 };
3342 continue;3357 continue;
3343 },3358 },
3344 .fn_proto_multi => {3359 .fn_proto_multi => {
3345 try astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProtoMulti(member_node));3360 astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProtoMulti(member_node)) catch |err| switch (err) {
3361 error.OutOfMemory => return error.OutOfMemory,
3362 error.AnalysisFail => {},
3363 };
3346 continue;3364 continue;
3347 },3365 },
3348 .fn_proto_one => {3366 .fn_proto_one => {
3349 var params: [1]ast.Node.Index = undefined;3367 var params: [1]ast.Node.Index = undefined;
3350 try astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProtoOne(&params, member_node));3368 astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProtoOne(&params, member_node)) catch |err| switch (err) {
3369 error.OutOfMemory => return error.OutOfMemory,
3370 error.AnalysisFail => {},
3371 };
3351 continue;3372 continue;
3352 },3373 },
3353 .fn_proto => {3374 .fn_proto => {
3354 try astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProto(member_node));3375 astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProto(member_node)) catch |err| switch (err) {
3376 error.OutOfMemory => return error.OutOfMemory,
3377 error.AnalysisFail => {},
3378 };
3355 continue;3379 continue;
3356 },3380 },
33573381
3358 .global_var_decl => {3382 .global_var_decl => {
3359 try astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.globalVarDecl(member_node));3383 astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.globalVarDecl(member_node)) catch |err| switch (err) {
3384 error.OutOfMemory => return error.OutOfMemory,
3385 error.AnalysisFail => {},
3386 };
3360 continue;3387 continue;
3361 },3388 },
3362 .local_var_decl => {3389 .local_var_decl => {
3363 try astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.localVarDecl(member_node));3390 astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.localVarDecl(member_node)) catch |err| switch (err) {
3391 error.OutOfMemory => return error.OutOfMemory,
3392 error.AnalysisFail => {},
3393 };
3364 continue;3394 continue;
3365 },3395 },
3366 .simple_var_decl => {3396 .simple_var_decl => {
3367 try astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.simpleVarDecl(member_node));3397 astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.simpleVarDecl(member_node)) catch |err| switch (err) {
3398 error.OutOfMemory => return error.OutOfMemory,
3399 error.AnalysisFail => {},
3400 };
3368 continue;3401 continue;
3369 },3402 },
3370 .aligned_var_decl => {3403 .aligned_var_decl => {
3371 try astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.alignedVarDecl(member_node));3404 astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.alignedVarDecl(member_node)) catch |err| switch (err) {
3405 error.OutOfMemory => return error.OutOfMemory,
3406 error.AnalysisFail => {},
3407 };
3372 continue;3408 continue;
3373 },3409 },
33743410
3375 .@"comptime" => {3411 .@"comptime" => {
3376 try astgen.comptimeDecl(gz, scope, &wip_decls, member_node);3412 astgen.comptimeDecl(gz, scope, &wip_decls, member_node) catch |err| switch (err) {
3413 error.OutOfMemory => return error.OutOfMemory,
3414 error.AnalysisFail => {},
3415 };
3377 continue;3416 continue;
3378 },3417 },
3379 .@"usingnamespace" => {3418 .@"usingnamespace" => {
3380 try astgen.usingnamespaceDecl(gz, scope, &wip_decls, member_node);3419 astgen.usingnamespaceDecl(gz, scope, &wip_decls, member_node) catch |err| switch (err) {
3420 error.OutOfMemory => return error.OutOfMemory,
3421 error.AnalysisFail => {},
3422 };
3381 continue;3423 continue;
3382 },3424 },
3383 .test_decl => {3425 .test_decl => {
3384 try astgen.testDecl(gz, scope, &wip_decls, member_node);3426 astgen.testDecl(gz, scope, &wip_decls, member_node) catch |err| switch (err) {
3427 error.OutOfMemory => return error.OutOfMemory,
3428 error.AnalysisFail => {},
3429 };
3385 continue;3430 continue;
3386 },3431 },
3387 else => unreachable,3432 else => unreachable,
...@@ -3530,20 +3575,32 @@ fn unionDeclInner(...@@ -3530,20 +3575,32 @@ fn unionDeclInner(
3530 switch (node_tags[fn_proto]) {3575 switch (node_tags[fn_proto]) {
3531 .fn_proto_simple => {3576 .fn_proto_simple => {
3532 var params: [1]ast.Node.Index = undefined;3577 var params: [1]ast.Node.Index = undefined;
3533 try astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProtoSimple(&params, fn_proto));3578 astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProtoSimple(&params, fn_proto)) catch |err| switch (err) {
3579 error.OutOfMemory => return error.OutOfMemory,
3580 error.AnalysisFail => {},
3581 };
3534 continue;3582 continue;
3535 },3583 },
3536 .fn_proto_multi => {3584 .fn_proto_multi => {
3537 try astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProtoMulti(fn_proto));3585 astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProtoMulti(fn_proto)) catch |err| switch (err) {
3586 error.OutOfMemory => return error.OutOfMemory,
3587 error.AnalysisFail => {},
3588 };
3538 continue;3589 continue;
3539 },3590 },
3540 .fn_proto_one => {3591 .fn_proto_one => {
3541 var params: [1]ast.Node.Index = undefined;3592 var params: [1]ast.Node.Index = undefined;
3542 try astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProtoOne(&params, fn_proto));3593 astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProtoOne(&params, fn_proto)) catch |err| switch (err) {
3594 error.OutOfMemory => return error.OutOfMemory,
3595 error.AnalysisFail => {},
3596 };
3543 continue;3597 continue;
3544 },3598 },
3545 .fn_proto => {3599 .fn_proto => {
3546 try astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProto(fn_proto));3600 astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProto(fn_proto)) catch |err| switch (err) {
3601 error.OutOfMemory => return error.OutOfMemory,
3602 error.AnalysisFail => {},
3603 };
3547 continue;3604 continue;
3548 },3605 },
3549 else => unreachable,3606 else => unreachable,
...@@ -3551,50 +3608,83 @@ fn unionDeclInner(...@@ -3551,50 +3608,83 @@ fn unionDeclInner(
3551 },3608 },
3552 .fn_proto_simple => {3609 .fn_proto_simple => {
3553 var params: [1]ast.Node.Index = undefined;3610 var params: [1]ast.Node.Index = undefined;
3554 try astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProtoSimple(&params, member_node));3611 astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProtoSimple(&params, member_node)) catch |err| switch (err) {
3612 error.OutOfMemory => return error.OutOfMemory,
3613 error.AnalysisFail => {},
3614 };
3555 continue;3615 continue;
3556 },3616 },
3557 .fn_proto_multi => {3617 .fn_proto_multi => {
3558 try astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProtoMulti(member_node));3618 astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProtoMulti(member_node)) catch |err| switch (err) {
3619 error.OutOfMemory => return error.OutOfMemory,
3620 error.AnalysisFail => {},
3621 };
3559 continue;3622 continue;
3560 },3623 },
3561 .fn_proto_one => {3624 .fn_proto_one => {
3562 var params: [1]ast.Node.Index = undefined;3625 var params: [1]ast.Node.Index = undefined;
3563 try astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProtoOne(&params, member_node));3626 astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProtoOne(&params, member_node)) catch |err| switch (err) {
3627 error.OutOfMemory => return error.OutOfMemory,
3628 error.AnalysisFail => {},
3629 };
3564 continue;3630 continue;
3565 },3631 },
3566 .fn_proto => {3632 .fn_proto => {
3567 try astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProto(member_node));3633 astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProto(member_node)) catch |err| switch (err) {
3634 error.OutOfMemory => return error.OutOfMemory,
3635 error.AnalysisFail => {},
3636 };
3568 continue;3637 continue;
3569 },3638 },
35703639
3571 .global_var_decl => {3640 .global_var_decl => {
3572 try astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.globalVarDecl(member_node));3641 astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.globalVarDecl(member_node)) catch |err| switch (err) {
3642 error.OutOfMemory => return error.OutOfMemory,
3643 error.AnalysisFail => {},
3644 };
3573 continue;3645 continue;
3574 },3646 },
3575 .local_var_decl => {3647 .local_var_decl => {
3576 try astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.localVarDecl(member_node));3648 astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.localVarDecl(member_node)) catch |err| switch (err) {
3649 error.OutOfMemory => return error.OutOfMemory,
3650 error.AnalysisFail => {},
3651 };
3577 continue;3652 continue;
3578 },3653 },
3579 .simple_var_decl => {3654 .simple_var_decl => {
3580 try astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.simpleVarDecl(member_node));3655 astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.simpleVarDecl(member_node)) catch |err| switch (err) {
3656 error.OutOfMemory => return error.OutOfMemory,
3657 error.AnalysisFail => {},
3658 };
3581 continue;3659 continue;
3582 },3660 },
3583 .aligned_var_decl => {3661 .aligned_var_decl => {
3584 try astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.alignedVarDecl(member_node));3662 astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.alignedVarDecl(member_node)) catch |err| switch (err) {
3663 error.OutOfMemory => return error.OutOfMemory,
3664 error.AnalysisFail => {},
3665 };
3585 continue;3666 continue;
3586 },3667 },
35873668
3588 .@"comptime" => {3669 .@"comptime" => {
3589 try astgen.comptimeDecl(gz, scope, &wip_decls, member_node);3670 astgen.comptimeDecl(gz, scope, &wip_decls, member_node) catch |err| switch (err) {
3671 error.OutOfMemory => return error.OutOfMemory,
3672 error.AnalysisFail => {},
3673 };
3590 continue;3674 continue;
3591 },3675 },
3592 .@"usingnamespace" => {3676 .@"usingnamespace" => {
3593 try astgen.usingnamespaceDecl(gz, scope, &wip_decls, member_node);3677 astgen.usingnamespaceDecl(gz, scope, &wip_decls, member_node) catch |err| switch (err) {
3678 error.OutOfMemory => return error.OutOfMemory,
3679 error.AnalysisFail => {},
3680 };
3594 continue;3681 continue;
3595 },3682 },
3596 .test_decl => {3683 .test_decl => {
3597 try astgen.testDecl(gz, scope, &wip_decls, member_node);3684 astgen.testDecl(gz, scope, &wip_decls, member_node) catch |err| switch (err) {
3685 error.OutOfMemory => return error.OutOfMemory,
3686 error.AnalysisFail => {},
3687 };
3598 continue;3688 continue;
3599 },3689 },
3600 else => unreachable,3690 else => unreachable,
...@@ -3878,20 +3968,32 @@ fn containerDecl(...@@ -3878,20 +3968,32 @@ fn containerDecl(
3878 switch (node_tags[fn_proto]) {3968 switch (node_tags[fn_proto]) {
3879 .fn_proto_simple => {3969 .fn_proto_simple => {
3880 var params: [1]ast.Node.Index = undefined;3970 var params: [1]ast.Node.Index = undefined;
3881 try astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProtoSimple(&params, fn_proto));3971 astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProtoSimple(&params, fn_proto)) catch |err| switch (err) {
3972 error.OutOfMemory => return error.OutOfMemory,
3973 error.AnalysisFail => {},
3974 };
3882 continue;3975 continue;
3883 },3976 },
3884 .fn_proto_multi => {3977 .fn_proto_multi => {
3885 try astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProtoMulti(fn_proto));3978 astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProtoMulti(fn_proto)) catch |err| switch (err) {
3979 error.OutOfMemory => return error.OutOfMemory,
3980 error.AnalysisFail => {},
3981 };
3886 continue;3982 continue;
3887 },3983 },
3888 .fn_proto_one => {3984 .fn_proto_one => {
3889 var params: [1]ast.Node.Index = undefined;3985 var params: [1]ast.Node.Index = undefined;
3890 try astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProtoOne(&params, fn_proto));3986 astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProtoOne(&params, fn_proto)) catch |err| switch (err) {
3987 error.OutOfMemory => return error.OutOfMemory,
3988 error.AnalysisFail => {},
3989 };
3891 continue;3990 continue;
3892 },3991 },
3893 .fn_proto => {3992 .fn_proto => {
3894 try astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProto(fn_proto));3993 astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProto(fn_proto)) catch |err| switch (err) {
3994 error.OutOfMemory => return error.OutOfMemory,
3995 error.AnalysisFail => {},
3996 };
3895 continue;3997 continue;
3896 },3998 },
3897 else => unreachable,3999 else => unreachable,
...@@ -3899,50 +4001,83 @@ fn containerDecl(...@@ -3899,50 +4001,83 @@ fn containerDecl(
3899 },4001 },
3900 .fn_proto_simple => {4002 .fn_proto_simple => {
3901 var params: [1]ast.Node.Index = undefined;4003 var params: [1]ast.Node.Index = undefined;
3902 try astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProtoSimple(&params, member_node));4004 astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProtoSimple(&params, member_node)) catch |err| switch (err) {
4005 error.OutOfMemory => return error.OutOfMemory,
4006 error.AnalysisFail => {},
4007 };
3903 continue;4008 continue;
3904 },4009 },
3905 .fn_proto_multi => {4010 .fn_proto_multi => {
3906 try astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProtoMulti(member_node));4011 astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProtoMulti(member_node)) catch |err| switch (err) {
4012 error.OutOfMemory => return error.OutOfMemory,
4013 error.AnalysisFail => {},
4014 };
3907 continue;4015 continue;
3908 },4016 },
3909 .fn_proto_one => {4017 .fn_proto_one => {
3910 var params: [1]ast.Node.Index = undefined;4018 var params: [1]ast.Node.Index = undefined;
3911 try astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProtoOne(&params, member_node));4019 astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProtoOne(&params, member_node)) catch |err| switch (err) {
4020 error.OutOfMemory => return error.OutOfMemory,
4021 error.AnalysisFail => {},
4022 };
3912 continue;4023 continue;
3913 },4024 },
3914 .fn_proto => {4025 .fn_proto => {
3915 try astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProto(member_node));4026 astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProto(member_node)) catch |err| switch (err) {
4027 error.OutOfMemory => return error.OutOfMemory,
4028 error.AnalysisFail => {},
4029 };
3916 continue;4030 continue;
3917 },4031 },
39184032
3919 .global_var_decl => {4033 .global_var_decl => {
3920 try astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.globalVarDecl(member_node));4034 astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.globalVarDecl(member_node)) catch |err| switch (err) {
4035 error.OutOfMemory => return error.OutOfMemory,
4036 error.AnalysisFail => {},
4037 };
3921 continue;4038 continue;
3922 },4039 },
3923 .local_var_decl => {4040 .local_var_decl => {
3924 try astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.localVarDecl(member_node));4041 astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.localVarDecl(member_node)) catch |err| switch (err) {
4042 error.OutOfMemory => return error.OutOfMemory,
4043 error.AnalysisFail => {},
4044 };
3925 continue;4045 continue;
3926 },4046 },
3927 .simple_var_decl => {4047 .simple_var_decl => {
3928 try astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.simpleVarDecl(member_node));4048 astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.simpleVarDecl(member_node)) catch |err| switch (err) {
4049 error.OutOfMemory => return error.OutOfMemory,
4050 error.AnalysisFail => {},
4051 };
3929 continue;4052 continue;
3930 },4053 },
3931 .aligned_var_decl => {4054 .aligned_var_decl => {
3932 try astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.alignedVarDecl(member_node));4055 astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.alignedVarDecl(member_node)) catch |err| switch (err) {
4056 error.OutOfMemory => return error.OutOfMemory,
4057 error.AnalysisFail => {},
4058 };
3933 continue;4059 continue;
3934 },4060 },
39354061
3936 .@"comptime" => {4062 .@"comptime" => {
3937 try astgen.comptimeDecl(gz, scope, &wip_decls, member_node);4063 astgen.comptimeDecl(gz, scope, &wip_decls, member_node) catch |err| switch (err) {
4064 error.OutOfMemory => return error.OutOfMemory,
4065 error.AnalysisFail => {},
4066 };
3938 continue;4067 continue;
3939 },4068 },
3940 .@"usingnamespace" => {4069 .@"usingnamespace" => {
3941 try astgen.usingnamespaceDecl(gz, scope, &wip_decls, member_node);4070 astgen.usingnamespaceDecl(gz, scope, &wip_decls, member_node) catch |err| switch (err) {
4071 error.OutOfMemory => return error.OutOfMemory,
4072 error.AnalysisFail => {},
4073 };
3942 continue;4074 continue;
3943 },4075 },
3944 .test_decl => {4076 .test_decl => {
3945 try astgen.testDecl(gz, scope, &wip_decls, member_node);4077 astgen.testDecl(gz, scope, &wip_decls, member_node) catch |err| switch (err) {
4078 error.OutOfMemory => return error.OutOfMemory,
4079 error.AnalysisFail => {},
4080 };
3946 continue;4081 continue;
3947 },4082 },
3948 else => unreachable,4083 else => unreachable,
...@@ -4044,20 +4179,32 @@ fn containerDecl(...@@ -4044,20 +4179,32 @@ fn containerDecl(
4044 switch (node_tags[fn_proto]) {4179 switch (node_tags[fn_proto]) {
4045 .fn_proto_simple => {4180 .fn_proto_simple => {
4046 var params: [1]ast.Node.Index = undefined;4181 var params: [1]ast.Node.Index = undefined;
4047 try astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProtoSimple(&params, fn_proto));4182 astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProtoSimple(&params, fn_proto)) catch |err| switch (err) {
4183 error.OutOfMemory => return error.OutOfMemory,
4184 error.AnalysisFail => {},
4185 };
4048 continue;4186 continue;
4049 },4187 },
4050 .fn_proto_multi => {4188 .fn_proto_multi => {
4051 try astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProtoMulti(fn_proto));4189 astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProtoMulti(fn_proto)) catch |err| switch (err) {
4190 error.OutOfMemory => return error.OutOfMemory,
4191 error.AnalysisFail => {},
4192 };
4052 continue;4193 continue;
4053 },4194 },
4054 .fn_proto_one => {4195 .fn_proto_one => {
4055 var params: [1]ast.Node.Index = undefined;4196 var params: [1]ast.Node.Index = undefined;
4056 try astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProtoOne(&params, fn_proto));4197 astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProtoOne(&params, fn_proto)) catch |err| switch (err) {
4198 error.OutOfMemory => return error.OutOfMemory,
4199 error.AnalysisFail => {},
4200 };
4057 continue;4201 continue;
4058 },4202 },
4059 .fn_proto => {4203 .fn_proto => {
4060 try astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProto(fn_proto));4204 astgen.fnDecl(gz, &wip_decls, member_node, body, tree.fnProto(fn_proto)) catch |err| switch (err) {
4205 error.OutOfMemory => return error.OutOfMemory,
4206 error.AnalysisFail => {},
4207 };
4061 continue;4208 continue;
4062 },4209 },
4063 else => unreachable,4210 else => unreachable,
...@@ -4065,50 +4212,83 @@ fn containerDecl(...@@ -4065,50 +4212,83 @@ fn containerDecl(
4065 },4212 },
4066 .fn_proto_simple => {4213 .fn_proto_simple => {
4067 var params: [1]ast.Node.Index = undefined;4214 var params: [1]ast.Node.Index = undefined;
4068 try astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProtoSimple(&params, member_node));4215 astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProtoSimple(&params, member_node)) catch |err| switch (err) {
4216 error.OutOfMemory => return error.OutOfMemory,
4217 error.AnalysisFail => {},
4218 };
4069 continue;4219 continue;
4070 },4220 },
4071 .fn_proto_multi => {4221 .fn_proto_multi => {
4072 try astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProtoMulti(member_node));4222 astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProtoMulti(member_node)) catch |err| switch (err) {
4223 error.OutOfMemory => return error.OutOfMemory,
4224 error.AnalysisFail => {},
4225 };
4073 continue;4226 continue;
4074 },4227 },
4075 .fn_proto_one => {4228 .fn_proto_one => {
4076 var params: [1]ast.Node.Index = undefined;4229 var params: [1]ast.Node.Index = undefined;
4077 try astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProtoOne(&params, member_node));4230 astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProtoOne(&params, member_node)) catch |err| switch (err) {
4231 error.OutOfMemory => return error.OutOfMemory,
4232 error.AnalysisFail => {},
4233 };
4078 continue;4234 continue;
4079 },4235 },
4080 .fn_proto => {4236 .fn_proto => {
4081 try astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProto(member_node));4237 astgen.fnDecl(gz, &wip_decls, member_node, 0, tree.fnProto(member_node)) catch |err| switch (err) {
4238 error.OutOfMemory => return error.OutOfMemory,
4239 error.AnalysisFail => {},
4240 };
4082 continue;4241 continue;
4083 },4242 },
40844243
4085 .global_var_decl => {4244 .global_var_decl => {
4086 try astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.globalVarDecl(member_node));4245 astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.globalVarDecl(member_node)) catch |err| switch (err) {
4246 error.OutOfMemory => return error.OutOfMemory,
4247 error.AnalysisFail => {},
4248 };
4087 continue;4249 continue;
4088 },4250 },
4089 .local_var_decl => {4251 .local_var_decl => {
4090 try astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.localVarDecl(member_node));4252 astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.localVarDecl(member_node)) catch |err| switch (err) {
4253 error.OutOfMemory => return error.OutOfMemory,
4254 error.AnalysisFail => {},
4255 };
4091 continue;4256 continue;
4092 },4257 },
4093 .simple_var_decl => {4258 .simple_var_decl => {
4094 try astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.simpleVarDecl(member_node));4259 astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.simpleVarDecl(member_node)) catch |err| switch (err) {
4260 error.OutOfMemory => return error.OutOfMemory,
4261 error.AnalysisFail => {},
4262 };
4095 continue;4263 continue;
4096 },4264 },
4097 .aligned_var_decl => {4265 .aligned_var_decl => {
4098 try astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.alignedVarDecl(member_node));4266 astgen.globalVarDecl(gz, scope, &wip_decls, member_node, tree.alignedVarDecl(member_node)) catch |err| switch (err) {
4267 error.OutOfMemory => return error.OutOfMemory,
4268 error.AnalysisFail => {},
4269 };
4099 continue;4270 continue;
4100 },4271 },
41014272
4102 .@"comptime" => {4273 .@"comptime" => {
4103 try astgen.comptimeDecl(gz, scope, &wip_decls, member_node);4274 astgen.comptimeDecl(gz, scope, &wip_decls, member_node) catch |err| switch (err) {
4275 error.OutOfMemory => return error.OutOfMemory,
4276 error.AnalysisFail => {},
4277 };
4104 continue;4278 continue;
4105 },4279 },
4106 .@"usingnamespace" => {4280 .@"usingnamespace" => {
4107 try astgen.usingnamespaceDecl(gz, scope, &wip_decls, member_node);4281 astgen.usingnamespaceDecl(gz, scope, &wip_decls, member_node) catch |err| switch (err) {
4282 error.OutOfMemory => return error.OutOfMemory,
4283 error.AnalysisFail => {},
4284 };
4108 continue;4285 continue;
4109 },4286 },
4110 .test_decl => {4287 .test_decl => {
4111 try astgen.testDecl(gz, scope, &wip_decls, member_node);4288 astgen.testDecl(gz, scope, &wip_decls, member_node) catch |err| switch (err) {
4289 error.OutOfMemory => return error.OutOfMemory,
4290 error.AnalysisFail => {},
4291 };
4112 continue;4292 continue;
4113 },4293 },
4114 else => unreachable,4294 else => unreachable,
src/Compilation.zig+14-1
...@@ -1676,8 +1676,21 @@ pub fn totalErrorCount(self: *Compilation) usize {...@@ -1676,8 +1676,21 @@ pub fn totalErrorCount(self: *Compilation) usize {
16761676
1677 if (self.bin_file.options.module) |module| {1677 if (self.bin_file.options.module) |module| {
1678 total += module.failed_exports.items().len +1678 total += module.failed_exports.items().len +
1679 module.failed_files.items().len +
1680 @boolToInt(module.failed_root_src_file != null);1679 @boolToInt(module.failed_root_src_file != null);
1680
1681 for (module.failed_files.items()) |entry| {
1682 if (entry.value) |_| {
1683 total += 1;
1684 } else {
1685 const file = entry.key;
1686 assert(file.zir_loaded);
1687 const payload_index = file.zir.extra[@enumToInt(Zir.ExtraIndex.compile_errors)];
1688 assert(payload_index != 0);
1689 const header = file.zir.extraData(Zir.Inst.CompileErrors, payload_index);
1690 total += header.data.items_len;
1691 }
1692 }
1693
1681 // Skip errors for Decls within files that failed parsing.1694 // Skip errors for Decls within files that failed parsing.
1682 // When a parse error is introduced, we keep all the semantic analysis for1695 // When a parse error is introduced, we keep all the semantic analysis for
1683 // the previous parse success, including compile errors, but we cannot1696 // the previous parse success, including compile errors, but we cannot