[Issue 13897] Wrong purity of inner function
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Fri Dec 26 23:14:45 PST 2014
https://issues.dlang.org/show_bug.cgi?id=13897
Kenji Hara <k.hara.pg at gmail.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |RESOLVED
Resolution|--- |INVALID
--- Comment #2 from Kenji Hara <k.hara.pg at gmail.com> ---
(In reply to bearophile_hugs from comment #0)
> This compiles with no errors in dmd 2.067alpha:
It's an intentional language change.
Until 2.066, the nested function foo had been deduced as a strong purity
function. But if foo is declared in struct or class scope, it had been deduced
as a weak purity function. That was inconsistent.
// 2.066 and earlier
void main() {
int x;
void foo() pure { // wrongly deduced as strong purity
x++; // modifying enclosing scope via context pointer was rejected.
}
}
struct S {
int x;
void foo() pure { // weak purity
x++; // OK
}
}
In git-head, a nested function without any type qualifiers is deduced to weak
purity so it has a hidden mutable context pointer, and the semantics is
consistent with member functions.
// 2.067alpha
void main() {
int x;
void foo() pure { // deduced as weak purity, so
x++; // modifying enclosing scope via context pointer is accepted.
}
void bar() immutable pure { // deduced as strong purity
x++; // NG
}
}
struct S {
int x;
void foo() pure { // weak purity
x++;
}
void bar() immutable pure { // strong purity
x++; // NG
}
}
See also issue 9148 comments for more detail.
--
More information about the Digitalmars-d-bugs
mailing list