diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2018-08-27 18:31:41 -0400 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2018-08-27 18:31:41 -0400 |
| commit | b92fac329e73280ea5d49af675fea84e777b7f0a (patch) | |
| tree | 647c64025db7bd7c5948f8d5493befdf566c0071 /src | |
| parent | ecc54640243ba84ffa3656b73aa7dd6b53474462 (diff) | |
| parent | 45d9d9f953df2167b35878ea02551d9c86ad8a0f (diff) | |
| download | zig-b92fac329e73280ea5d49af675fea84e777b7f0a.tar.gz zig-b92fac329e73280ea5d49af675fea84e777b7f0a.zip | |
Merge branch 'raulgrell-CastToCVoid'
Diffstat (limited to 'src')
| -rw-r--r-- | src/ir.cpp | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/src/ir.cpp b/src/ir.cpp index 710456179c..3117410cd2 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -60,7 +60,7 @@ enum ConstCastResultId { ConstCastResultIdType, ConstCastResultIdUnresolvedInferredErrSet, ConstCastResultIdAsyncAllocatorType, - ConstCastResultIdNullWrapPtr, + ConstCastResultIdNullWrapPtr }; struct ConstCastOnly; @@ -8471,9 +8471,9 @@ static ConstCastOnly types_match_const_cast_only(IrAnalyze *ira, TypeTableEntry if (wanted_type == actual_type) return result; - // * and [*] can do a const-cast-only to ?* and ?[*], respectively - // but not if there is a mutable parent pointer - // and not if the pointer is zero bits + // *T and [*]T may const-cast-only to ?*U and ?[*]U, respectively + // but not if we want a mutable pointer + // and not if the actual pointer has zero bits if (!wanted_is_mutable && wanted_type->id == TypeTableEntryIdOptional && wanted_type->data.maybe.child_type->id == TypeTableEntryIdPointer && actual_type->id == TypeTableEntryIdPointer && type_has_bits(actual_type)) @@ -8488,6 +8488,18 @@ static ConstCastOnly types_match_const_cast_only(IrAnalyze *ira, TypeTableEntry return result; } + // *T and [*]T can always cast to *c_void + if (wanted_type->id == TypeTableEntryIdPointer && + wanted_type->data.pointer.ptr_len == PtrLenSingle && + wanted_type->data.pointer.child_type == g->builtin_types.entry_c_void && + actual_type->id == TypeTableEntryIdPointer && + (!actual_type->data.pointer.is_const || wanted_type->data.pointer.is_const) && + (!actual_type->data.pointer.is_volatile || wanted_type->data.pointer.is_volatile)) + { + assert(actual_type->data.pointer.alignment >= wanted_type->data.pointer.alignment); + return result; + } + // pointer const if (wanted_type->id == TypeTableEntryIdPointer && actual_type->id == TypeTableEntryIdPointer) { ConstCastOnly child = types_match_const_cast_only(ira, wanted_type->data.pointer.child_type, |
