Bug 6274 – 'pure' for a whole struct definition

Status
RESOLVED
Resolution
WONTFIX
Severity
enhancement
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2011-07-08T18:03:32Z
Last change time
2022-08-15T14:49:28Z
Assigned to
No Owner
Creator
bearophile_hugs

Comments

Comment #0 by bearophile_hugs — 2011-07-08T18:03:32Z
Just like "final" applied to a class makes all its methods non-virtual: final class Foo { int x; this(int xx) { x = xx; } void bar() {} static void spam() {} } void main() {} I'd like the attribute "pure" applied to a struct/class (in DMD 2.054beta this doesn't compile): pure struct Foo { int x; this(int xx) { x = xx; } void bar() {} static void spam() {} } void main() pure { Foo f = Foo(1); f.bar(); Foo.spam(); } to be equivalent to adding "pure" to all its methods: struct Foo { int x; this(int xx) pure { x = xx; } void bar() pure {} static void spam() pure {} } void main() pure { Foo f = Foo(1); f.bar(); Foo.spam(); }
Comment #1 by bearophile_hugs — 2011-08-12T12:44:00Z
There is something I don't fully understand. The following code compiles with the improvements in DMD 2.055alpha/head, but it needs a "pure" or before "struct Map" (here#1) or at the front() method of Map (here#2). If both are removed it doesn't compile. So is the pure attribute for struct partially working already? @property bool empty(T)(in T[] a) pure nothrow { return !a.length; } @property ref T front(T)(T[] a) pure nothrow { assert(a.length); return a[0]; } void popFront(A)(ref A a) pure nothrow { assert(a.length); a = a[1 .. $]; } pure struct Map(alias fun, R) { // here#1 R _input; this(R input) nothrow pure { _input = input; } @property bool empty() nothrow const pure { return _input.empty; } @property auto ref front() nothrow const { // here#2 return fun(_input.front); } void popFront() nothrow pure { _input.popFront(); } } template map(alias fun) { auto map(R)(R range) { return Map!(fun, R)(range); } } int sqr(int x) pure nothrow { return x * x; } pure nothrow int foo(int n) { int total; foreach (x; map!(sqr)([1, 2, 3, 4])) total += x; return total; } void main() { assert(foo(10) == 30); }
Comment #2 by lt.infiltrator — 2014-03-19T19:21:22Z
Currently, instead of: pure struct Foo { ... } you can do: struct Foo { pure: ... } Is this acceptable?
Comment #3 by razvan.nitu1305 — 2022-08-15T14:49:28Z
Yes, you can use the `pure:` to obtain exactly what is requested. Closing as WONTFIX.