aboutsummaryrefslogtreecommitdiff
path: root/src/ir.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2019-03-24 18:47:36 -0400
committerAndrew Kelley <andrew@ziglang.org>2019-03-24 18:47:36 -0400
commitda9d8a6ecfb0428ce3d6575905f96fa1661c9b80 (patch)
tree2c5085a1a6c81887e527d06380c8389ad4c43b5c /src/ir.cpp
parentaff7b38838628a18f384c1f625d71c085c8eee1f (diff)
downloadzig-da9d8a6ecfb0428ce3d6575905f96fa1661c9b80.tar.gz
zig-da9d8a6ecfb0428ce3d6575905f96fa1661c9b80.zip
implement peer type resolution for enum literals
See #683
Diffstat (limited to 'src/ir.cpp')
-rw-r--r--src/ir.cpp15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/ir.cpp b/src/ir.cpp
index 29b6eef27a..58db315665 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -9573,6 +9573,21 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT
continue;
}
+ if (prev_type->id == ZigTypeIdEnum && cur_type->id == ZigTypeIdEnumLiteral) {
+ TypeEnumField *field = find_enum_type_field(prev_type, cur_inst->value.data.x_enum_literal);
+ if (field != nullptr) {
+ continue;
+ }
+ }
+
+ if (cur_type->id == ZigTypeIdEnum && prev_type->id == ZigTypeIdEnumLiteral) {
+ TypeEnumField *field = find_enum_type_field(cur_type, prev_inst->value.data.x_enum_literal);
+ if (field != nullptr) {
+ prev_inst = cur_inst;
+ continue;
+ }
+ }
+
if (prev_type->id == ZigTypeIdPointer && prev_type->data.pointer.ptr_len == PtrLenC &&
(cur_type->id == ZigTypeIdComptimeInt || cur_type->id == ZigTypeIdInt))
{