[Issue 10999] Limited type matching

d-bugmail at puremagic.com d-bugmail at puremagic.com
Tue Sep 10 09:22:20 PDT 2013


http://d.puremagic.com/issues/show_bug.cgi?id=10999



--- Comment #5 from Maxim Fomin <maxim at maxim-fomin.ru> 2013-09-10 09:22:15 PDT ---
(In reply to comment #4)
> (In reply to comment #3)
> 
> > Reinterpreting short as ushort has nothing to do with type safety - you cannot
> > corrupt anything,
> 
> "Type safety" is not the same as "memory safety". ushort and short have two
> different ranges, so Ada language (and functional languages as Haskell, etc)
> refuse the conversion between them. I don't like the introduction of more
> implicit type conversions.

Note, that you left important piece of quote. Please elaborate on which kind of
type safety is broken by conversion from short to ushort (please with examples
of system languages like C/C++). (different ranges is not a problem because it
is the same data reinterpreted in differen ways - which is not a surprise in
low-level languages)

> The D type system tells apart the two types:
> 
> 
> import std.stdio;
> void bar(ushort[2]) { "A".writeln; }
> void bar(short[2]) { "B".writeln; }
> void main() {
>     ushort[2] a;
>     short[2] b;
>     bar(a);
>     bar(b);
> }
> 
> 
> So if you write only the first bar, and you call it with an ushort[2], with
> your proposal this compiles. If later you add the second bar, now the second
> bar gets called. This is also what happens with single ushort and short value
> arguments, but generally it's not a clean design you want to expand to arrays
> too.

This can't be an argument as similar situation can be created with other
conversions in D. In other words, if you consider your example as an argument
against implicit conversion, following should also be disallowed:

import std.stdio;

void bar(bool) { "bool".writeln; }
void bar(long) { "long".writeln; }
void main() {
    int a;
    bar(a); // long
    bar(1); // bool
    bar(2); // long
}

import std.stdio;

void bar(int[]) { "int[]".writeln; }
void bar(int[1]) { "int[1]".writeln; }
void main() {
    int[1] a;
    bar(a);    // int[1]
    bar([1]); // int[1]
    bar([]);  // int[]
    bar([1,1]); //int[]
}

and some other conversion stuff.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list