C `restrict` keyword in D

Uknown via Digitalmars-d digitalmars-d at puremagic.com
Sat Sep 2 23:11:10 PDT 2017


On Sunday, 3 September 2017 at 03:49:21 UTC, Moritz Maxeiner 
wrote:
> On Sunday, 3 September 2017 at 03:04:58 UTC, Uknown wrote:
>> [...]
>>
>> void foo(ref RCArray!int arr, ref int val) @safe
>> {
>>     {
>> 	auto copy = arr; //arr's (and copy's) reference counts are 
>> both 2
>> 	arr = RCArray!int([]); // There is another owner, so arr
>> 			       // forgets about the old payload
>>     } // Last owner of the array ('copy') gets destroyed and 
>> happily
>>       // frees the payload.
>>     val = 3; // Oops.
>> }
>>
>> Here, adding `restrict` to foo's parameters like so :
>>
>> void foo(restrict ref RCArray!int arr, restrict ref int val)
>>
>> would make the compiler statically enforce the fact that 
>> neither references are pointing to the same data. This would 
>> cause an error in main, since arr[0] is from the same block of 
>> memory as arr.
>
> How does the compiler know which member of RCArray!int to check 
> for pointing to the same memory chunk as val?

If I understand C's version of restrict correctly, the pointers 
must not refer to the same block. So extending the same here, val 
should not be allowed to be a reference to any members of 
RCArray!int.

This does seem to get get more confusing when the heap is 
involved as a member of a struct.
e.g.
void main() @safe
{
	struct HeapAsMember {
		int* _someArr;
	}
	HeapAsMember x;
	x._someArr = new int;
	void foo(restrict ref HeapAsMember x, restrict ref int val) @safe
	{
		x._someArr = new int;
		val = 0;
	}
	foo(x, x._someArr[0]);
}
I feel that in this case, the compiler should throw an error, 
since val would be a reference to a member pointed to by 
_someArr, which is a member of x. Although, I wonder if such 
analysis would be feasible? This case is trivial, but there could 
be more complicated cases.


More information about the Digitalmars-d mailing list