digitalmars.D.bugs - [Issue 4418] New: Is alloca() pure?
- d-bugmail puremagic.com (37/37) Jul 02 2010 http://d.puremagic.com/issues/show_bug.cgi?id=4418
- d-bugmail puremagic.com (15/15) Jul 13 2010 http://d.puremagic.com/issues/show_bug.cgi?id=4418
- d-bugmail puremagic.com (8/8) Jul 13 2010 http://d.puremagic.com/issues/show_bug.cgi?id=4418
http://d.puremagic.com/issues/show_bug.cgi?id=4418 Summary: Is alloca() pure? Product: D Version: D2 Platform: All OS/Version: All Status: NEW Severity: enhancement Priority: P2 Component: DMD AssignedTo: nobody puremagic.com ReportedBy: bearophile_hugs eml.cc Given the same input alloca() generally returns different pointers, so it's not a pure function. But the same is true for the ptr field of an array newly allocated on the heap inside a pure function, and the memory allocated by alloca() never escapes the function, so it looks more pure than normal heap allocation. import std.c.stdlib: alloca; pure int foo(int n) { auto arr = new int[n]; for (int i; i < n; i++) arr[i] = i; return arr[0]; } pure int bar(int n) { // line 9, error int* arr = cast(int*)alloca(int.sizeof * n); for (int i; i < n; i++) arr[i] = i; return arr[0]; } void main() {} Compiling that program with dmd v2.047 produces: test.d(9): Error: pure function 'bar' cannot call impure function 'alloca' -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Jul 02 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4418 bearophile_hugs eml.cc changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED Resolution| |INVALID alloca() can't be pure because you can use alloca() inside a loop too (see bug 3822 ), and an expected optimization of pure functions is to pull them out of loops (because they always return the same result or throw an exception/error, see bug 4453 ). I prefer alloca() to free its memory only at the end of the function (and not at the end of the scope of the for loop). -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Jul 13 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4418 A D function that uses some kind of implementation of C99 Variable Length Arrays can be pure (and they get deallocated at the end of their scope, for example at the end of a for loop, and not only at the end of the function). -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Jul 13 2010