digitalmars.D.bugs - [Issue 2954] New: Appaling bug in associative arrays
- d-bugmail puremagic.com (26/26) May 08 2009 http://d.puremagic.com/issues/show_bug.cgi?id=2954
- d-bugmail puremagic.com (30/30) Sep 13 2009 http://d.puremagic.com/issues/show_bug.cgi?id=2954
- d-bugmail puremagic.com (11/11) Nov 11 2010 http://d.puremagic.com/issues/show_bug.cgi?id=2954
- d-bugmail puremagic.com (55/55) Nov 16 2010 http://d.puremagic.com/issues/show_bug.cgi?id=2954
- d-bugmail puremagic.com (6/6) Nov 18 2010 http://d.puremagic.com/issues/show_bug.cgi?id=2954
- d-bugmail puremagic.com (10/11) Nov 19 2010 http://d.puremagic.com/issues/show_bug.cgi?id=2954
- d-bugmail puremagic.com (8/11) Dec 04 2010 http://d.puremagic.com/issues/show_bug.cgi?id=2954
- d-bugmail puremagic.com (11/11) Dec 06 2010 http://d.puremagic.com/issues/show_bug.cgi?id=2954
http://d.puremagic.com/issues/show_bug.cgi?id=2954
Summary: Appaling bug in associative arrays
Product: D
Version: unspecified
Platform: PC
OS/Version: Linux
Status: NEW
Severity: blocker
Priority: P2
Component: DMD
AssignedTo: bugzilla digitalmars.com
ReportedBy: andrei metalanguage.com
This program compiles and prints "Abc":
import std.stdio;
void main() {
uint[string] hash;
char[] a = "abc".dup;
hash[a] = 42;
a[0] = 'A';
writeln(hash.keys);
}
It should not compile because char[] is obviously not convertible to string. By
this I am also reiterating the necessity to make associative arrays a true
library type and have the compiler rewrite the literals and the type name to
use that library type.
--
May 08 2009
http://d.puremagic.com/issues/show_bug.cgi?id=2954
Don <clugdbug yahoo.com.au> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |wrong-code
Version|unspecified |2.020
Blocks| |1934
Summary|Appalling bug in |Appalling bug in
|associative arrays |associative arrays (D2
| |only)
OS/Version|Linux |All
This test case, from bug 1934, is part of the same issue: index expressions for
AAs don't have proper type checking. In the case below, it's not converting the
string literal into a char[3], and consequently, bad code generation results.
Both asserts fail.
void main()
{
char[char[3]] ac;
char[3] c = "abc";
ac["abc"]='a';
assert(ac[c]=='a');
char[dchar[3]] ad;
dchar[3] d = "abc"d;
ad["abc"d]='a';
assert(ad[d]=='a');
}
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Sep 13 2009
http://d.puremagic.com/issues/show_bug.cgi?id=2954
Walter Bright <bugzilla digitalmars.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |bugzilla digitalmars.com
17:56:01 PST ---
http://www.dsource.org/projects/dmd/changeset/749
This fixes Andrei's bug, but Don's is a different bug.
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Nov 11 2010
http://d.puremagic.com/issues/show_bug.cgi?id=2954
Don <clugdbug yahoo.com.au> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |patch
CC| |clugdbug yahoo.com.au
The fix for bug 2684 was incorrect; it was too general. We can't skip the
implicit conversion in all cases where the arrays are equality comparable.
For example, this code:
char[char[3]] ac;
dchar[3] d = "abc"d;
ac[d] = 'w';
gives a poor error message:
bug.d(6): Error: array equality comparison type mismatch, dchar[3u] vs char
[3u]
instead of "cannot implicitly convert"
PATCH:
(1) Add this function to cast.c
/***********************************
* See if both types are arrays that can be compared
* for equality without any casting. Return !=0 if so.
* This is to enable comparing things like an immutable
* array with a mutable one.
*/
int arrayTypeCompatibleWithoutCasting(Loc loc, Type *t1, Type *t2)
{
t1 = t1->toBasetype();
t2 = t2->toBasetype();
if ((t1->ty == Tarray || t1->ty == Tsarray || t1->ty == Tpointer) &&
t2->ty == t1->ty)
{
if (t1->nextOf()->implicitConvTo(t2->nextOf()) >= MATCHconst ||
t2->nextOf()->implicitConvTo(t1->nextOf()) >= MATCHconst)
return 1;
}
return 0;
}
(2) expression.c line 8580
case Taarray:
{ TypeAArray *taa = (TypeAArray *)t1;
+ /* We can skip the implicit conversion if they differ only by
+ * constness (Bugzilla 2684, see also bug 2954b)
+ */
+ if (!arrayTypeCompatibleWithoutCasting(e2->loc, e2->type,
taa->index) )
- if (!arrayTypeCompatible(e2->loc, e2->type, taa->index))
{
e2 = e2->implicitCastTo(sc, taa->index); // type
checking
}
type = taa->next;
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Nov 16 2010
http://d.puremagic.com/issues/show_bug.cgi?id=2954 20:48:37 PST --- The fix still isn't right, as it fails at compile time on line 10. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Nov 18 2010
http://d.puremagic.com/issues/show_bug.cgi?id=2954The fix still isn't right, as it fails at compile time on line 10.It works for me. Hmm. I think this might also be relying on the patch for bug 5218, which I still have active in my local copy. Sorry about that -- it needs to be included as well. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Nov 19 2010
http://d.puremagic.com/issues/show_bug.cgi?id=2954 19:08:10 PST ---I think this might also be relying on the patch for bug 5218, which I still have active in my local copy. Sorry about that -- it needs to be included as well.The patch for bug 5218 enables it to compile, but it fails at runtime with: core.exception.RangeError test(6): Range violation -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Dec 04 2010
http://d.puremagic.com/issues/show_bug.cgi?id=2954
Walter Bright <bugzilla digitalmars.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |RESOLVED
Resolution| |FIXED
12:21:48 PST ---
http://www.dsource.org/projects/dmd/changeset/789
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Dec 06 2010









d-bugmail puremagic.com 