diff options
| author | gingerBill <bill@gingerbill.org> | 2020-06-12 14:37:27 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2020-06-12 14:37:27 +0100 |
| commit | 4533c02cc7fbc7d14edb8719c3bf4dc83a411672 (patch) | |
| tree | 697757db2fdef13b52a6f9df91a3819ff550beb6 /src/types.cpp | |
| parent | 01d12770fac3138f3d406a6fd1660018fd0f7e27 (diff) | |
Improve `intrinsics.type_is_simple_compare`
Diffstat (limited to 'src/types.cpp')
| -rw-r--r-- | src/types.cpp | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/src/types.cpp b/src/types.cpp index a9e9eb0f1..8395d1097 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -108,6 +108,7 @@ enum BasicFlag { BasicFlag_Ordered = BasicFlag_Integer | BasicFlag_Float | BasicFlag_String | BasicFlag_Pointer | BasicFlag_Rune, BasicFlag_OrderedNumeric = BasicFlag_Integer | BasicFlag_Float | BasicFlag_Rune, BasicFlag_ConstantType = BasicFlag_Boolean | BasicFlag_Numeric | BasicFlag_String | BasicFlag_Pointer | BasicFlag_Rune, + BasicFlag_SimpleCompare = BasicFlag_Boolean | BasicFlag_Numeric | BasicFlag_Pointer | BasicFlag_Rune, }; struct BasicType { @@ -1261,8 +1262,11 @@ bool is_type_simple_compare(Type *t) { case Type_Array: return is_type_simple_compare(t->Array.elem); + case Type_EnumeratedArray: + return is_type_simple_compare(t->EnumeratedArray.elem); + case Type_Basic: - if (t->Basic.flags & (BasicFlag_Integer|BasicFlag_Float|BasicFlag_Complex|BasicFlag_Rune|BasicFlag_Pointer)) { + if (t->Basic.flags & BasicFlag_SimpleCompare) { return true; } return false; @@ -1272,6 +1276,28 @@ bool is_type_simple_compare(Type *t) { case Type_BitSet: case Type_BitField: return true; + + case Type_Struct: + for_array(i, t->Struct.fields) { + Entity *f = t->Struct.fields[i]; + if (!is_type_simple_compare(f->type)) { + return false; + } + } + return true; + + case Type_Union: + for_array(i, t->Union.variants) { + Type *v = t->Union.variants[i]; + if (!is_type_simple_compare(v)) { + return false; + } + } + return true; + + case Type_SimdVector: + return is_type_simple_compare(t->SimdVector.elem); + } return false; |