Fixing const arrays

Steven Schveighoffer schveiguy at yahoo.com
Mon Dec 12 05:54:05 PST 2011


On Sun, 11 Dec 2011 16:34:34 -0500, Jonathan M Davis <jmdavisProg at gmx.com>  
wrote:

> On Sunday, December 11, 2011 10:34:40 Andrei Alexandrescu wrote:
>> On 12/11/11 9:46 AM, dsimcha wrote:
>> > On 12/10/2011 4:47 PM, Andrei Alexandrescu wrote:
>> >> We decided to fix this issue by automatically shedding the top-level
>> >> const when passing an array or a pointer by value into a function.
>> >
>> > Really silly question: Why not do the same for primitives (int, float,
>> > char, etc.) or even structs without indirection? I've seen plenty of
>> > code that blows up when passed an immutable double because it tries to
>> > mutate its arguments. About 1.5 years ago I fixed a bug like this in
>> > std.math.pow().
>>
>> Yes, that would be good to do as well.
>
> Actually, that could be a problem for some stuff. It might be an  
> acceptable
> problem, but it creates a problem nonetheless. What about containers?  
> You can
> have arrays with immutable elements, but if you made it so that  
> immutable int
> and int were the same as far as templates were concerned, then it would  
> be
> impossible to have a container which held immutable elements. How big of  
> a
> problem that is, I don't know, but I'd be concerned about some of the  
> side
> effects.
>
> Another concern would be what would happen with primitives when they're  
> inside
> of arrays. e.g.
>
> void func(T)(T[] arr)
>
> Having T lose its constness would be a big problem here.

T does not lose its constness here.  const(U[]) would go to const(U)[],  
which would then set T = const(U).

>
> Now, if we're talking only IFTI - such func(cast(immutable int)2)  
> instantiates
> with int and func!(immutable int)(2) still instantiates with immutable  
> int -
> and it's only for primitives by themselves (e.g. func above is  
> unaffected),
> then it likely isn't a problem. But we need to really look at the side  
> effects
> of trying to treat primitives as mutable in templates.

We are talking only IFTI.

Specifically, we are saying, for purposes of implying template parameters  
during IFTI, strip all the qualifiers from the pieces passed by value, as  
long as it doesn't affect any pieces passed by reference.

I bet doing this one thing would instantly trim at least 10k of bloat from  
an executable.  I'm looking at you, writeln.

>
> And if you're going to do that with primitives, it also opens up the  
> question
> as to what to do with structs which are value types. Should they be  
> treated
> the same?

Yes.

-Steve


More information about the Digitalmars-d mailing list