Proposal: Automatic shallow Unqual on IFTI
Lars T. Kyllingstad
public at kyllingen.NOSPAMnet
Tue Jul 20 10:15:15 PDT 2010
On Tue, 20 Jul 2010 16:19:50 +0000, dsimcha wrote:
> Bug 2594 (http://d.puremagic.com/issues/show_bug.cgi?id=2594) has
> languished in Bugzilla for about 1.5 years and really irks me.
> Furthermore, std.math.pow(), for example, doesn't work when passed
> immutable values. In other words, right now you can't do:
>
> immutable uint foo = 5;
> immutable uint bar = 2;
> uint baz = foo ^^ bar;
>
> Lots of functions in Phobos, as well as libs I've written, have
> basically this bug, and fixing/preventing all instances of it is a
> monumental and tedious task.
>
> Therefore, I propose that implicit function template instantiation
> automatically runs the equivalent of a shallow Unqual on its non-ref
> arguments before determining the types. In other words, if a
> const/immutable object could be implicitly cast to shallow mutable, it
> is. For example:
>
> void fun(T, U)(T arg1, U arg2) {
> // Do stuff that assumes arg1, arg2 are shallowly mutable.
> }
>
> void main() {
> immutable uint foo = 3;
> immutable char[] bar = "bar";
>
> // This instantiates fun with T = uint and U = // immutable(char)[],
> NOT T = immutable uint and // U = immutable char[].
> fun(foo, bar);
> }
>
> This would prevent a lot of nasty bugs but would be safe because
> arguments passed by value are shallowly copied and therefore can safely
> be made shallowly mutable, which is why implicitly casting between fully
> const/immutable and shallowly mutable is allowed already by the spec.
++vote
-Lars
More information about the Digitalmars-d
mailing list