authorgravatar for jacoblevgw@gmail.comJacob G-W <jacoblevgw@gmail.com> 2021-04-28 17:01:24-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-04-28 19:54:04-04:00
log2354cbafdb01d2a763b82cf03a72adef0794f187
tree94dd0dc3b1e0be009effdbe5ac62edcc1640e660
parentc90e52b74cd8f1fda78d786d38f2b8154374ce1c

stage2: implement #8364


2 files changed, 44 insertions(+), 4 deletions(-)

src/AstGen.zig+23-2
......@@ -247,7 +247,11 @@ pub const align_rl: ResultLoc = .{ .ty = .u16_type };
247247pub const bool_rl: ResultLoc = .{ .ty = .bool_type };
248248
249249pub fn typeExpr(gz: *GenZir, scope: *Scope, type_node: ast.Node.Index) InnerError!Zir.Inst.Ref {
250 return expr(gz, scope, .{ .ty = .type_type }, type_node);
250 const prev_force_comptime = gz.force_comptime;
251 gz.force_comptime = true;
252 const e = expr(gz, scope, .{ .ty = .type_type }, type_node);
253 gz.force_comptime = prev_force_comptime;
254 return e;
251255}
252256
253257fn lvalExpr(gz: *GenZir, scope: *Scope, node: ast.Node.Index) InnerError!Zir.Inst.Ref {
......@@ -821,7 +825,8 @@ pub fn expr(gz: *GenZir, scope: *Scope, rl: ResultLoc, node: ast.Node.Index) Inn
821825 .char_literal => return charLiteral(gz, scope, rl, node),
822826 .error_set_decl => return errorSetDecl(gz, scope, rl, node),
823827 .array_access => return arrayAccess(gz, scope, rl, node),
824 .@"comptime" => return comptimeExpr(gz, scope, rl, node_datas[node].lhs),
828 // we use comptimeExprFromAst here as it is explicitly put there by the user, `comptimeExpr` can be used by the compiler, even in a comptime scope
829 .@"comptime" => return comptimeExprFromAst(gz, scope, rl, node_datas[node].lhs),
825830 .@"switch", .switch_comma => return switchExpr(gz, scope, rl, node),
826831
827832 .@"nosuspend" => return nosuspendExpr(gz, scope, rl, node),
......@@ -1460,6 +1465,22 @@ pub fn comptimeExpr(
14601465 return result;
14611466}
14621467
1468pub fn comptimeExprFromAst(
1469 gz: *GenZir,
1470 scope: *Scope,
1471 rl: ResultLoc,
1472 node: ast.Node.Index,
1473) InnerError!Zir.Inst.Ref {
1474 const astgen = gz.astgen;
1475 if (gz.force_comptime) {
1476 return astgen.failNode(node, "redundant comptime keyword in already comptime scope", .{});
1477 }
1478 gz.force_comptime = true;
1479 const result = try expr(gz, scope, rl, node);
1480 gz.force_comptime = false;
1481 return result;
1482}
1483
14631484fn breakExpr(parent_gz: *GenZir, parent_scope: *Scope, node: ast.Node.Index) InnerError!Zir.Inst.Ref {
14641485 const astgen = parent_gz.astgen;
14651486 const tree = &astgen.file.tree;
test/stage2/test.zig+21-2
......@@ -1008,7 +1008,7 @@ pub fn addCases(ctx: *TestContext) !void {
10081008 "Hello, World!\n",
10091009 );
10101010 try case.files.append(.{
1011 .src =
1011 .src =
10121012 \\pub fn print() void {
10131013 \\ asm volatile ("syscall"
10141014 \\ :
......@@ -1024,6 +1024,25 @@ pub fn addCases(ctx: *TestContext) !void {
10241024 .path = "print.zig",
10251025 });
10261026 }
1027 {
1028 var case = ctx.exe("redundant comptime", linux_x64);
1029 case.addError(
1030 \\export fn _start() void {
1031 \\ var a: comptime u32 = 0;
1032 \\}
1033 ,
1034 &.{":2:21: error: redundant comptime keyword in already comptime scope"},
1035 );
1036 case.addError(
1037 \\export fn _start() void {
1038 \\ comptime {
1039 \\ var a: u32 = comptime 0;
1040 \\ }
1041 \\}
1042 ,
1043 &.{":3:31: error: redundant comptime keyword in already comptime scope"},
1044 );
1045 }
10271046 {
10281047 var case = ctx.exe("import private", linux_x64);
10291048 case.addError(
......@@ -1048,7 +1067,7 @@ pub fn addCases(ctx: *TestContext) !void {
10481067 },
10491068 );
10501069 try case.files.append(.{
1051 .src =
1070 .src =
10521071 \\// dummy comment to make print be on line 2
10531072 \\fn print() void {
10541073 \\ asm volatile ("syscall"