Thread overview
Error: cannot call public/export function someFunction from invariant
Oct 18, 2013
simendsjo
Oct 18, 2013
bearophile
Oct 18, 2013
Jonathan M Davis
Oct 18, 2013
simendsjo
Oct 18, 2013
Andrej Mitrovic
October 18, 2013
See topic. Why is this not allowed? The function in question is not virtual.

struct S {
    void someFunction() const {}
    const invariant() { someFunction(); }
}
void main() {
    S s;
}
October 18, 2013
simendsjo:

> See topic. Why is this not allowed? The function in question is not virtual.
>
> struct S {
>     void someFunction() const {}
>     const invariant() { someFunction(); }
> }
> void main() {
>     S s;
> }

It being not virtual is not important. In what cases is invariant() called, simendsjo? I sense an infinite loop.

Bye,
bearophile
October 18, 2013
On Friday, October 18, 2013 11:04:25 bearophile wrote:
> simendsjo:
> > See topic. Why is this not allowed? The function in question is not virtual.
> > 
> > struct S {
> > 
> >     void someFunction() const {}
> >     const invariant() { someFunction(); }
> > 
> > }
> > void main() {
> > 
> >     S s;
> > 
> > }
> 
> It being not virtual is not important. In what cases is invariant() called, simendsjo? I sense an infinite loop.

Yeah, it's probably because someFunction calls the invariant before and after it's called. If you want to call a member function from an invariant, it should be static, or it should be a free function.

- Jonathan M Davis
October 18, 2013
On Friday, 18 October 2013 at 09:08:53 UTC, Jonathan M Davis wrote:
> On Friday, October 18, 2013 11:04:25 bearophile wrote:
>> simendsjo:
>> > See topic. Why is this not allowed? The function in question is
>> > not virtual.
>> > 
>> > struct S {
>> > 
>> >     void someFunction() const {}
>> >     const invariant() { someFunction(); }
>> > 
>> > }
>> > void main() {
>> > 
>> >     S s;
>> > 
>> > }
>> 
>> It being not virtual is not important. In what cases is
>> invariant() called, simendsjo? I sense an infinite loop.
>
> Yeah, it's probably because someFunction calls the invariant before and after
> it's called. If you want to call a member function from an invariant, it
> should be static, or it should be a free function.

Ah, good point - stupid me :) I'll rather move some checking to pre/post contracts.
October 18, 2013
On 10/18/13, Jonathan M Davis <jmdavisProg@gmx.com> wrote:
> If you want to call a member function from an invariant, it should be static, or it should be a free function.

I can also be private, the diagnostic is pretty clear about that. :)