Strange Bug in LDC vs DMD
FoxyBrown via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Fri Jun 30 05:50:24 PDT 2017
I am using dirEntries to iterate over files to rename them.
I am renaming them in a loop(will change but added code for
testing).
In DMD the renaming works but in LDC the renaming fails. It fails
in a way that I can't quite tell and I cannot debug because
visual D is not working properly for LDC.
The code essentially look like the following:
auto dFiles = dirEntries(loc, mask, _mode);
foreach (d; dFiles)
{
auto newName = Recompute(d.name)
writeln(newName);
rename(d.name, newName);
}
but when I comment out rename, it works under LDC.
The funny thing is, newName is printed wrong so Recompute is
effected by the rename.
This shouldn't occur.
Now, dirEntries is a range, so I'm curious if the recomputation
is occurring after the rename(if it did then the recomputation
would be invalid and produce the results it is producing)?
When I forcably convert dirEntries in to an array(manually,
unfortunately, as I can't seem to use array() on dirEntries),
everything works).
struct file { public string name; }
auto dFiles = dirEntries(loc, mask, _mode);
file[] files;
foreach (d; dFiles)
{
file f;
f.name = d.name;
files ~= f;
}
foreach (d; files)
{
auto newName = Recompute(d.name)
writeln(newName);
rename(d.name, newName);
}
While it works, the main issue is that a different behavior is
observed between DMD and LDC in the first case.
It would be nice to know how to simplify the code though so
"lazy" evaluation of dirEntries did not occur.
More information about the Digitalmars-d-learn
mailing list