Bug 3974 – ICE(init.c): Static array initializer with more elements than destination array
Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
Other
OS
Windows
Creation time
2010-03-16T01:08:00Z
Last change time
2015-06-09T01:27:39Z
Keywords
ice-on-invalid-code, patch
Assigned to
nobody
Creator
clugdbug
Comments
Comment #0 by clugdbug — 2010-03-16T01:08:35Z
Reported in a comment in bug 3849.
void main() {
struct S { int x; }
S[2] a = [{1}, {2}, {3}];
}
Comment #1 by bearophile_hugs — 2010-03-16T05:20:36Z
Regarding bug 3849, I did put both things in the same bug report because:
- they are strongly semantically related, the compiler has to refuse fixed sized literals with a number of items different from the number specified on the left (this is true for nD arrays too);
- The cause of this ICE can be related to the lack of tests over the number of items in the literal compared to the number on the left. So fixing one bug can even fix the other too, or it can be very quick to fix one when you fix the other. That's why I have not originally marked that as enhancement.
Comment #2 by clugdbug — 2010-04-09T13:35:44Z
Note to bearophile: The case where the number of elements is LESS than the array size (bug 3849) is quite different. Note that, for example,
int [3] x = [ 2: 15]; is currently legal.
This patch is slightly more general, in that it covers the cases like
int[3] toomany = [ 2: 13, 1];
PATCH: init.c line 343 (in ArrayInitializer::semantic()).
if (length == 0)
error(loc, "array dimension overflow");
if (length > dim)
dim = length;
}
+ if (t->ty == Tsarray)
+ {
+ size_t edim = ((TypeSArray *)t)->dim->toInteger();
+ if (dim > edim)
+ {
+ error(loc, "array initializer has %d elements, but array length is %d", dim, edim);
+ return new ExpInitializer(loc, new ErrorExp());
+ }
+ }
unsigned long amax = 0x80000000;
if ((unsigned long) dim * t->nextOf()->size() >= amax)
error(loc, "array dimension %u exceeds max of %ju", dim, amax / t->nextOf()->size());