Against enforce()

Steven Schveighoffer schveiguy at yahoo.com
Mon Mar 21 07:35:58 PDT 2011


On Mon, 21 Mar 2011 10:08:56 -0400, Don <nospam at nospam.com> wrote:

> Steven Schveighoffer wrote:

>> Will there not be an expectation that a pure function will not  
>> read/write shared data that will be broken (i.e. why did the compiler  
>> allow this, I thought I was safe from this!)?
>
> If you pass the address of global or shared data into a weakly pure  
> function, it won't be pure. If you have a function with a strongly pure  
> signature, global data can never be passed to it.

Just on this one point, TLS or __gshared references are indistinguishable  
 from normal references, but shared references are not the same, the type  
system lets you know it's shared.  I thought this was the main reason why  
we were allowed to create weak-pure functions, because d has this  
distinction.  Are you allowed to declare a function like this?

int foo(shared int *x) pure {return *x;}

I was under the impression that a pure function couldn't access shared  
data -- period.  Is this not true?  Clearly, this theoretically weak-pure  
function could not be called from a strong-pure function, so the pure  
decoration is useless.

But this is very similar to a delegate that does the same thing.

Why does one make sense and the other not?  In other words, if I have a  
function like this:

int foo(int delegate() x) pure {...}

is this *ever* callable from a strong-pure function?  Or does the delegate  
have to be declared pure?  It seems to me that either:

1) it's not ever callable from a strong-pure function, making the pure  
decoration useless or
2) it's callable from a strong pure function, but then the compiler needs  
to generate two copies of the function, one with a pure delegate, one  
without.

On item 2, the reason I feel this way is in the case where foo wants to  
pass the delegate to another pure function, it might optimize that call  
differently if the delegate is known to be pure.  Or maybe we don't/can't  
care...

Thanks for having patience, I'm asking all these questions because I want  
to make sure we do not put in rules that are wrong but hard to remove  
later when everything uses them -- even though I don't understand  
everything going on here ;)

-Steve


More information about the Digitalmars-d mailing list