Bug 15083 – declaring a variable, cannot access frame pointer
Status
RESOLVED
Resolution
INVALID
Severity
major
Priority
P1
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2015-09-18T11:09:31Z
Last change time
2022-10-13T05:18:41Z
Assigned to
No Owner
Creator
John Colvin
Comments
Comment #0 by john.loughran.colvin — 2015-09-18T11:09:31Z
This uses phobos, but I'm pretty sure typeof should work here so it's a dmd bug.
import std.file;
void file_test(string path, string filetype, string term){
typeof(dirEntries(path, filetype, SpanMode.depth)) files;
}
Error: cannot access frame pointer of std.file.dirEntries.FilterResult!(f, DirIterator).FilterResult
Comment #1 by schuetzm — 2015-09-18T13:11:09Z
(In reply to John Colvin from comment #0)
> This uses phobos, but I'm pretty sure typeof should work here so it's a dmd
> bug.
typeof itself _does_ work, this compiles fine:
pragma(msg, typeof(dirEntries(path, filetype, SpanMode.depth)));
// prints: FilterResult!(f, DirIterator)
But FilteResult is evidently a Voldemort type, and you can't declare a variable of this type. So I believe this is not a bug.
Comment #2 by john.loughran.colvin — 2015-09-18T13:36:18Z
(In reply to Marc Schütz from comment #1)
> (In reply to John Colvin from comment #0)
> > This uses phobos, but I'm pretty sure typeof should work here so it's a dmd
> > bug.
>
> typeof itself _does_ work, this compiles fine:
>
> pragma(msg, typeof(dirEntries(path, filetype, SpanMode.depth)));
> // prints: FilterResult!(f, DirIterator)
good point
> But FilteResult is evidently a Voldemort type, and you can't declare a
> variable of this type. So I believe this is not a bug.
You can definitely declare variables with Voldemort types.
e.g.
auto foo(){ struct S{} return S(); }
void bar(){ typeof(foo()) a; }
is fine.
The problem here is to do with the initialiser.
typeof(dirEntries(path, filetype, SpanMode.depth)) files = void;
doesn't cause any problems.
Comment #3 by schuetzm — 2015-09-18T15:30:41Z
(In reply to John Colvin from comment #2)
> You can definitely declare variables with Voldemort types.
>
> e.g.
> auto foo(){ struct S{} return S(); }
> void bar(){ typeof(foo()) a; }
>
> is fine.
>
That's not a "real" Voldemort type with a closure; try this instead:
auto foo(){
int x;
struct S {
int baz() { return x; }
}
return S();
}
void bar(){ typeof(foo()) a; } // Error: cannot access frame pointer of xx.foo.S
>
> The problem here is to do with the initialiser.
>
> typeof(dirEntries(path, filetype, SpanMode.depth)) files = void;
>
> doesn't cause any problems.
This could either be an oversight (= bug), or it could be intentional. I suspect the latter, because it allows to actually declare a Voldemort variable that is only initialized later.
Comment #4 by john.loughran.colvin — 2015-09-18T15:53:46Z
(In reply to Marc Schütz from comment #3)
> (In reply to John Colvin from comment #2)
> > You can definitely declare variables with Voldemort types.
> >
> > e.g.
> > auto foo(){ struct S{} return S(); }
> > void bar(){ typeof(foo()) a; }
> >
> > is fine.
> >
>
> That's not a "real" Voldemort type with a closure; try this instead:
>
> auto foo(){
> int x;
> struct S {
> int baz() { return x; }
> }
> return S();
> }
> void bar(){ typeof(foo()) a; } // Error: cannot access frame pointer of
> xx.foo.S
OK, I see what you mean.
> >
> > The problem here is to do with the initialiser.
> >
> > typeof(dirEntries(path, filetype, SpanMode.depth)) files = void;
> >
> > doesn't cause any problems.
>
> This could either be an oversight (= bug), or it could be intentional. I
> suspect the latter, because it allows to actually declare a Voldemort
> variable that is only initialized later.
Yes, I think it probably is intentional, or at least not a problem that it's allowed.
Comment #5 by razvan.nitu1305 — 2022-10-13T05:18:41Z
According to Marc Schutz's comments this is not a bug.