stage2: fix comptime_float negation

This commit is contained in:
Andrew Kelley 2021-10-07 17:11:27 -07:00
parent 3df19b765d
commit a0c44e806b
3 changed files with 67 additions and 52 deletions

View File

@ -6639,9 +6639,9 @@ fn zirNegate(
defer tracy.end();
const inst_data = sema.code.instructions.items(.data)[inst].un_node;
const src: LazySrcLoc = .{ .node_offset_bin_op = inst_data.src_node };
const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };
const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };
const src = inst_data.src();
const lhs_src = src;
const rhs_src = src; // TODO better source location
const lhs = sema.resolveInst(.zero);
const rhs = sema.resolveInst(inst_data.operand);
@ -9909,7 +9909,8 @@ fn zirCDefine(
const src: LazySrcLoc = .{ .node_offset = extra.node };
const name = try sema.resolveConstString(block, src, extra.lhs);
if (sema.typeOf(extra.rhs).zigTypeTag() != .Void) {
const rhs = sema.resolveInst(extra.rhs);
if (sema.typeOf(rhs).zigTypeTag() != .Void) {
const value = try sema.resolveConstString(block, src, extra.rhs);
try block.c_import_buf.?.writer().print("#define {s} {s}\n", .{ name, value });
} else {
@ -12085,16 +12086,19 @@ fn resolvePeerTypes(
const chosen_ty = sema.typeOf(chosen);
if (candidate_ty.eql(chosen_ty))
continue;
if (candidate_ty.zigTypeTag() == .NoReturn)
const candidate_ty_tag = candidate_ty.zigTypeTag();
const chosen_ty_tag = chosen_ty.zigTypeTag();
if (candidate_ty_tag == .NoReturn)
continue;
if (chosen_ty.zigTypeTag() == .NoReturn) {
if (chosen_ty_tag == .NoReturn) {
chosen = candidate;
chosen_i = candidate_i + 1;
continue;
}
if (candidate_ty.zigTypeTag() == .Undefined)
if (candidate_ty_tag == .Undefined)
continue;
if (chosen_ty.zigTypeTag() == .Undefined) {
if (chosen_ty_tag == .Undefined) {
chosen = candidate;
chosen_i = candidate_i + 1;
continue;
@ -12117,30 +12121,41 @@ fn resolvePeerTypes(
continue;
}
if (chosen_ty.zigTypeTag() == .ComptimeInt and candidate_ty.isInt()) {
if (chosen_ty_tag == .ComptimeInt and candidate_ty.isInt()) {
chosen = candidate;
chosen_i = candidate_i + 1;
continue;
}
if (chosen_ty.isInt() and candidate_ty.zigTypeTag() == .ComptimeInt) {
if (chosen_ty.isInt() and candidate_ty_tag == .ComptimeInt) {
continue;
}
if (chosen_ty.zigTypeTag() == .ComptimeFloat and candidate_ty.isRuntimeFloat()) {
if ((chosen_ty_tag == .ComptimeFloat or chosen_ty_tag == .ComptimeInt) and
candidate_ty.isRuntimeFloat())
{
chosen = candidate;
chosen_i = candidate_i + 1;
continue;
}
if (chosen_ty.isRuntimeFloat() and
(candidate_ty_tag == .ComptimeFloat or candidate_ty_tag == .ComptimeInt))
{
continue;
}
if (chosen_ty_tag == .Enum and candidate_ty_tag == .EnumLiteral) {
continue;
}
if (chosen_ty_tag == .EnumLiteral and candidate_ty_tag == .Enum) {
chosen = candidate;
chosen_i = candidate_i + 1;
continue;
}
if (chosen_ty.isRuntimeFloat() and candidate_ty.zigTypeTag() == .ComptimeFloat) {
if (chosen_ty_tag == .ComptimeFloat and candidate_ty_tag == .ComptimeInt)
continue;
}
if (chosen_ty.zigTypeTag() == .Enum and candidate_ty.zigTypeTag() == .EnumLiteral) {
continue;
}
if (chosen_ty.zigTypeTag() == .EnumLiteral and candidate_ty.zigTypeTag() == .Enum) {
if (chosen_ty_tag == .ComptimeInt and candidate_ty_tag == .ComptimeFloat) {
chosen = candidate;
chosen_i = candidate_i + 1;
continue;

View File

@ -183,3 +183,37 @@ test "@setEvalBranchQuota" {
try expect(sum == 500500);
}
}
test "constant struct with negation" {
try expect(vertices[0].x == @as(f32, -0.6));
}
const Vertex = struct {
x: f32,
y: f32,
r: f32,
g: f32,
b: f32,
};
const vertices = [_]Vertex{
Vertex{
.x = -0.6,
.y = -0.4,
.r = 1.0,
.g = 0.0,
.b = 0.0,
},
Vertex{
.x = 0.6,
.y = -0.4,
.r = 0.0,
.g = 1.0,
.b = 0.0,
},
Vertex{
.x = 0.0,
.y = 0.6,
.r = 0.0,
.g = 0.0,
.b = 1.0,
},
};

View File

@ -41,40 +41,6 @@ pub fn vec3(x: f32, y: f32, z: f32) Vec3 {
};
}
test "constant struct with negation" {
try expect(vertices[0].x == -0.6);
}
const Vertex = struct {
x: f32,
y: f32,
r: f32,
g: f32,
b: f32,
};
const vertices = [_]Vertex{
Vertex{
.x = -0.6,
.y = -0.4,
.r = 1.0,
.g = 0.0,
.b = 0.0,
},
Vertex{
.x = 0.6,
.y = -0.4,
.r = 0.0,
.g = 1.0,
.b = 0.0,
},
Vertex{
.x = 0.0,
.y = 0.6,
.r = 0.0,
.g = 0.0,
.b = 1.0,
},
};
test "statically initialized struct" {
st_init_str_foo.x += 1;
try expect(st_init_str_foo.x == 14);