aboutsummaryrefslogtreecommitdiff
path: root/src/analyze.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2017-02-04 22:12:06 -0500
committerAndrew Kelley <superjoe30@gmail.com>2017-02-04 22:12:06 -0500
commitb840184bb09b9d5e4272f848dcaa7c4973dfdcd5 (patch)
treefb0be751a985d6b52c173da49692171e61e935e2 /src/analyze.cpp
parent419e75eb2313b4910921185211201317cbbb400c (diff)
downloadzig-b840184bb09b9d5e4272f848dcaa7c4973dfdcd5.tar.gz
zig-b840184bb09b9d5e4272f848dcaa7c4973dfdcd5.zip
memcpy and memset builtins support volatile pointers
See #238
Diffstat (limited to 'src/analyze.cpp')
-rw-r--r--src/analyze.cpp13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp
index 0cc8c4fe35..012eb6d7df 100644
--- a/src/analyze.cpp
+++ b/src/analyze.cpp
@@ -2036,7 +2036,8 @@ bool types_match_const_cast_only(TypeTableEntry *expected_type, TypeTableEntry *
// pointer const
if (expected_type->id == TypeTableEntryIdPointer &&
actual_type->id == TypeTableEntryIdPointer &&
- (!actual_type->data.pointer.is_const || expected_type->data.pointer.is_const))
+ (!actual_type->data.pointer.is_const || expected_type->data.pointer.is_const) &&
+ (!actual_type->data.pointer.is_volatile || expected_type->data.pointer.is_volatile))
{
return types_match_const_cast_only(expected_type->data.pointer.child_type,
actual_type->data.pointer.child_type);
@@ -2047,12 +2048,14 @@ bool types_match_const_cast_only(TypeTableEntry *expected_type, TypeTableEntry *
actual_type->id == TypeTableEntryIdStruct &&
expected_type->data.structure.is_slice &&
actual_type->data.structure.is_slice &&
- (!actual_type->data.structure.fields[0].type_entry->data.pointer.is_const ||
- expected_type->data.structure.fields[0].type_entry->data.pointer.is_const))
+ (!actual_type->data.structure.fields[slice_ptr_index].type_entry->data.pointer.is_const ||
+ expected_type->data.structure.fields[slice_ptr_index].type_entry->data.pointer.is_const) &&
+ (!actual_type->data.structure.fields[slice_ptr_index].type_entry->data.pointer.is_volatile ||
+ expected_type->data.structure.fields[slice_ptr_index].type_entry->data.pointer.is_volatile))
{
return types_match_const_cast_only(
- expected_type->data.structure.fields[0].type_entry->data.pointer.child_type,
- actual_type->data.structure.fields[0].type_entry->data.pointer.child_type);
+ expected_type->data.structure.fields[slice_ptr_index].type_entry->data.pointer.child_type,
+ actual_type->data.structure.fields[slice_ptr_index].type_entry->data.pointer.child_type);
}
// maybe