aboutsummaryrefslogtreecommitdiff
path: root/src/analyze.cpp
diff options
context:
space:
mode:
authorJimmi HC <jhc@liab.dk>2018-06-29 11:34:38 +0200
committerJimmi HC <jhc@liab.dk>2018-06-29 11:34:38 +0200
commit58b1692182dc2f8da5b535f59e9a89cfab10a7b6 (patch)
treeeb517f2efb684cb5be0a882bb683b84e0fee6766 /src/analyze.cpp
parent4c3f27ce1ea17b5236a022971ebace73a02b7c2b (diff)
downloadzig-58b1692182dc2f8da5b535f59e9a89cfab10a7b6.tar.gz
zig-58b1692182dc2f8da5b535f59e9a89cfab10a7b6.zip
contains_comptime_undefined_value should not follow pointers
Diffstat (limited to 'src/analyze.cpp')
-rw-r--r--src/analyze.cpp72
1 files changed, 1 insertions, 71 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp
index 068ea48c0a..4c200888d8 100644
--- a/src/analyze.cpp
+++ b/src/analyze.cpp
@@ -5296,41 +5296,6 @@ bool contains_comptime_undefined_value(ConstExprValue *value) {
switch (value->type->id) {
case TypeTableEntryIdInvalid:
zig_unreachable();
-
- case TypeTableEntryIdPointer: {
- ConstPtrValue *ptr = &value->data.x_ptr;
- if (ptr->mut == ConstPtrMutRuntimeVar)
- return false;
-
- switch (ptr->special) {
- case ConstPtrSpecialInvalid:
- zig_unreachable();
- case ConstPtrSpecialRef:
- return contains_comptime_undefined_value(ptr->data.ref.pointee);
- case ConstPtrSpecialBaseArray: {
- size_t index = ptr->data.base_array.elem_index;
- ConstExprValue *arr = ptr->data.base_array.array_val;
- if (arr->special == ConstValSpecialUndef)
- return true;
- if (arr->data.x_array.special == ConstArraySpecialUndef)
- return true;
-
- return contains_comptime_undefined_value(&arr->data.x_array.s_none.elements[index]);
- }
- case ConstPtrSpecialBaseStruct: {
- size_t index = ptr->data.base_struct.field_index;
- ConstExprValue *str = ptr->data.base_struct.struct_val;
- if (str->special == ConstValSpecialUndef)
- return true;
-
- return contains_comptime_undefined_value(&str->data.x_struct.fields[index]);
- }
- case ConstPtrSpecialFunction: // TODO: Can a fn ptr have an undefined value?
- case ConstPtrSpecialDiscard:
- case ConstPtrSpecialHardCodedAddr:
- return false;
- }
- }
case TypeTableEntryIdArray: {
ConstArrayValue *arr = &value->data.x_array;
if (arr->special == ConstArraySpecialUndef)
@@ -5344,42 +5309,6 @@ bool contains_comptime_undefined_value(ConstExprValue *value) {
}
case TypeTableEntryIdStruct: {
ConstStructValue *str = &value->data.x_struct;
- if (value->type->data.structure.is_slice) {
- ConstExprValue *len = &str->fields[slice_len_index];
- ConstExprValue *ptr = &str->fields[slice_ptr_index];
- if (len->special == ConstValSpecialUndef)
- return true;
- if (ptr->special == ConstValSpecialUndef)
- return true;
-
- switch (ptr->data.x_ptr.special) {
- case ConstPtrSpecialRef:
- return contains_comptime_undefined_value(ptr->data.x_ptr.data.ref.pointee);
- case ConstPtrSpecialBaseArray: {
- size_t offset = ptr->data.x_ptr.data.base_array.elem_index;
- ConstExprValue *arr = ptr->data.x_ptr.data.base_array.array_val;
- if (arr->special == ConstValSpecialUndef)
- return true;
- if (arr->data.x_array.special == ConstArraySpecialUndef)
- return true;
-
- uint64_t slice_len = bigint_as_unsigned(&len->data.x_bigint);
- for (size_t i = 0; i < slice_len; ++i) {
- if (contains_comptime_undefined_value(&arr->data.x_array.s_none.elements[i + offset]))
- return true;
- }
-
- return false;
- }
- case ConstPtrSpecialBaseStruct:
- case ConstPtrSpecialInvalid:
- case ConstPtrSpecialFunction:
- case ConstPtrSpecialDiscard:
- case ConstPtrSpecialHardCodedAddr:
- zig_unreachable();
- }
- }
-
for (size_t i = 0; i < value->type->data.structure.src_field_count; ++i) {
if (contains_comptime_undefined_value(&str->fields[i]))
return true;
@@ -5400,6 +5329,7 @@ bool contains_comptime_undefined_value(ConstExprValue *value) {
case TypeTableEntryIdUnion:
return contains_comptime_undefined_value(value->data.x_union.payload);
+ case TypeTableEntryIdPointer:
case TypeTableEntryIdArgTuple:
case TypeTableEntryIdVoid:
case TypeTableEntryIdBool: