authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-11-24 14:47:33-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-11-24 14:47:33-07:00
logc42763f8cc9223fc43ac3478a5f15d4bd9f438e4
tree8dc9c3e3cf9f6e5ebb4308da37142c70df947fb4
parent57e1f6a89f044e731fe60ce15e98b496dcbaa74f

AstGen: use reachableExpr for return operand

Related: #9630

7 files changed, 15 insertions(+), 6 deletions(-)

lib/std/math/ln.zig+1-1
...@@ -32,7 +32,7 @@ pub fn ln(x: anytype) @TypeOf(x) {...@@ -32,7 +32,7 @@ pub fn ln(x: anytype) @TypeOf(x) {
32 return @as(comptime_int, math.floor(ln_64(@as(f64, x))));32 return @as(comptime_int, math.floor(ln_64(@as(f64, x))));
33 },33 },
34 .Int => |IntType| switch (IntType.signedness) {34 .Int => |IntType| switch (IntType.signedness) {
35 .signed => return @compileError("ln not implemented for signed integers"),35 .signed => @compileError("ln not implemented for signed integers"),
36 .unsigned => return @as(T, math.floor(ln_64(@as(f64, x)))),36 .unsigned => return @as(T, math.floor(ln_64(@as(f64, x)))),
37 },37 },
38 else => @compileError("ln not implemented for " ++ @typeName(T)),38 else => @compileError("ln not implemented for " ++ @typeName(T)),
lib/std/math/log.zig+1-1
...@@ -29,7 +29,7 @@ pub fn log(comptime T: type, base: T, x: T) T {...@@ -29,7 +29,7 @@ pub fn log(comptime T: type, base: T, x: T) T {
2929
30 // TODO implement integer log without using float math30 // TODO implement integer log without using float math
31 .Int => |IntType| switch (IntType.signedness) {31 .Int => |IntType| switch (IntType.signedness) {
32 .signed => return @compileError("log not implemented for signed integers"),32 .signed => @compileError("log not implemented for signed integers"),
33 .unsigned => return @floatToInt(T, math.floor(math.ln(@intToFloat(f64, x)) / math.ln(float_base))),33 .unsigned => return @floatToInt(T, math.floor(math.ln(@intToFloat(f64, x)) / math.ln(float_base))),
34 },34 },
3535
lib/std/math/log10.zig+1-1
...@@ -33,7 +33,7 @@ pub fn log10(x: anytype) @TypeOf(x) {...@@ -33,7 +33,7 @@ pub fn log10(x: anytype) @TypeOf(x) {
33 return @as(comptime_int, math.floor(log10_64(@as(f64, x))));33 return @as(comptime_int, math.floor(log10_64(@as(f64, x))));
34 },34 },
35 .Int => |IntType| switch (IntType.signedness) {35 .Int => |IntType| switch (IntType.signedness) {
36 .signed => return @compileError("log10 not implemented for signed integers"),36 .signed => @compileError("log10 not implemented for signed integers"),
37 .unsigned => return @floatToInt(T, math.floor(log10_64(@intToFloat(f64, x)))),37 .unsigned => return @floatToInt(T, math.floor(log10_64(@intToFloat(f64, x)))),
38 },38 },
39 else => @compileError("log10 not implemented for " ++ @typeName(T)),39 else => @compileError("log10 not implemented for " ++ @typeName(T)),
lib/std/math/log2.zig+1-1
...@@ -39,7 +39,7 @@ pub fn log2(x: anytype) @TypeOf(x) {...@@ -39,7 +39,7 @@ pub fn log2(x: anytype) @TypeOf(x) {
39 return result;39 return result;
40 },40 },
41 .Int => |IntType| switch (IntType.signedness) {41 .Int => |IntType| switch (IntType.signedness) {
42 .signed => return @compileError("log2 not implemented for signed integers"),42 .signed => @compileError("log2 not implemented for signed integers"),
43 .unsigned => return math.log2_int(T, x),43 .unsigned => return math.log2_int(T, x),
44 },44 },
45 else => @compileError("log2 not implemented for " ++ @typeName(T)),45 else => @compileError("log2 not implemented for " ++ @typeName(T)),
lib/std/math/sqrt.zig+1-1
...@@ -26,7 +26,7 @@ pub fn sqrt(x: anytype) Sqrt(@TypeOf(x)) {...@@ -26,7 +26,7 @@ pub fn sqrt(x: anytype) Sqrt(@TypeOf(x)) {
26 return @as(T, sqrt_int(u128, x));26 return @as(T, sqrt_int(u128, x));
27 },27 },
28 .Int => |IntType| switch (IntType.signedness) {28 .Int => |IntType| switch (IntType.signedness) {
29 .signed => return @compileError("sqrt not implemented for signed integers"),29 .signed => @compileError("sqrt not implemented for signed integers"),
30 .unsigned => return sqrt_int(T, x),30 .unsigned => return sqrt_int(T, x),
31 },31 },
32 else => @compileError("sqrt not implemented for " ++ @typeName(T)),32 else => @compileError("sqrt not implemented for " ++ @typeName(T)),
src/AstGen.zig+1-1
...@@ -5963,7 +5963,7 @@ fn ret(gz: *GenZir, scope: *Scope, node: Ast.Node.Index) InnerError!Zir.Inst.Ref...@@ -5963,7 +5963,7 @@ fn ret(gz: *GenZir, scope: *Scope, node: Ast.Node.Index) InnerError!Zir.Inst.Ref
5963 } else .{5963 } else .{
5964 .ty = try gz.addNodeExtended(.ret_type, node),5964 .ty = try gz.addNodeExtended(.ret_type, node),
5965 };5965 };
5966 const operand = try expr(gz, scope, rl, operand_node);5966 const operand = try reachableExpr(gz, scope, rl, operand_node, node);
59675967
5968 switch (nodeMayEvalToError(tree, operand_node)) {5968 switch (nodeMayEvalToError(tree, operand_node)) {
5969 .never => {5969 .never => {
test/compile_errors.zig+9
...@@ -4999,6 +4999,15 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -4999,6 +4999,15 @@ pub fn addCases(ctx: *TestContext) !void {
4999 "tmp.zig:2:5: note: control flow is diverted here",4999 "tmp.zig:2:5: note: control flow is diverted here",
5000 });5000 });
50015001
5002 ctx.objErrStage1("unreachable code - return return",
5003 \\export fn a() i32 {
5004 \\ return return 1;
5005 \\}
5006 , &[_][]const u8{
5007 "tmp.zig:2:5: error: unreachable code",
5008 "tmp.zig:2:12: note: control flow is diverted here",
5009 });
5010
5002 ctx.objErrStage1("bad import",5011 ctx.objErrStage1("bad import",
5003 \\const bogus = @import("bogus-does-not-exist.zig",);5012 \\const bogus = @import("bogus-does-not-exist.zig",);
5004 , &[_][]const u8{5013 , &[_][]const u8{