Comment #0 by bearophile_hugs — 2010-06-15T18:11:01Z
Class/struct invariants are:
http://www.digitalmars.com/d/2.0/class.html#Invariant
invariant() BlockStatement
But dmd v2.047 compiles this with no errors:
struct Foo {
invariant {}
}
struct Bar {
invariant
}
class CFoo {
invariant {}
}
class CBar {
invariant
}
void main() {}
See also the second part of the bug 3856
Comment #1 by andrej.mitrovich — 2010-08-29T20:01:39Z
The compiler will still print an error if you add any statements below a class invariant, e.g.:
struct Foo {
invariant {}
}
struct Bar {
int x = 5;
invariant
assert(x == 1);
}
class CFoo {
invariant {}
}
class CBar {
invariant
}
void main()
{
Bar bar;
}
bug4325.d(7): Declaration expected, not 'assert'
So it might not be that bad. The same thing happens if you put "const" "pure" "immutable" without any opening braces or colons, e.g.:
struct Foo {
pure
}
struct Bar {
const
}
class CFoo {
immutable
}
class CBar {
invariant
}
void main()
{
}
Compiles fine.
Comment #2 by yebblies — 2011-06-15T08:30:26Z
This has nothing to do with class invariants. This is caused by invariant currently being an alias for immutable. Change invariant to immutable in the examples and it will make sense.
Comment #3 by bearophile_hugs — 2011-06-15T09:51:04Z
(In reply to comment #2)
> This has nothing to do with class invariants. This is caused by invariant
> currently being an alias for immutable. Change invariant to immutable in the
> examples and it will make sense.
I see, thank you. Do you want me to open a new enhancement request where I ask for the removal of this alias, or do you prefer me to reopen and rename this bug report?
Comment #4 by yebblies — 2011-06-15T11:36:37Z
> I see, thank you. Do you want me to open a new enhancement request where I ask
> for the removal of this alias, or do you prefer me to reopen and rename this
> bug report?
A new report. Changing the focus of old reports makes it more difficult to process them. (for me at least)