Bug 6220 – Regression(2.053) static foreach over a string[] no longer produces directly usable strings
Status
RESOLVED
Resolution
FIXED
Severity
regression
Priority
P3
Component
dmd
Product
D
Version
D2
Platform
Other
OS
Windows
Creation time
2011-06-28T18:43:00Z
Last change time
2011-08-13T12:39:14Z
Keywords
patch, rejects-valid
Assigned to
nobody
Creator
sandford
Comments
Comment #0 by sandford — 2011-06-28T18:43:41Z
In DMD 2.052 and prior one could perform a static foreach over static string arrays, such as those produced by traits. However, in DMD 2.053 one has to 'touch' the string before use.
void main(string[] args) {
struct Foobar { real x; real y; real z;};
switch("x") {
foreach(i,member; __traits(allMembers, Foobar)) {
case member : break; // Valid in 2.052
//But in DMD 2.053 this produces an error
//Error: case must be a string or an integral constant, not member
// Required workaround for DMD 2.053
//case member[] : break;
//case member~"" : break;
}
}
}
Also, and I'm not sure if this is a regression or not, if used the pointer of member is not valid i.e. you can not use writeln(member);, etc. Although both i and member.length produce correct results.
Comment #1 by k.hara.pg — 2011-08-05T15:51:22Z
This is regression of Commit:fc67046cf1e66182d959309fb15ef9e2d4c266b9 .
When foreach aggregator is tuple of string literals, the value variable is declared like follows:
const member = aggregator[i];
And variable member is not const-folded (WANTvalue).
But, before fc67046c, it is interpreted (WANTinterpret), then compile had succeeded.
We should declare value variable as manifest constant there for interpretation.