This came up in learn:
Say you have this code:

//----
size_t msb(T)(T v)
in
{
  assert(v != 0);
}
out(ret)
{
  assert(v != 0); //Fails? Passes?
}
body
{
  size_t ret = 0;
  while(v >>= 1) ++ret;
  return ret;
}
//----

Question, can this output contract fail?

Apparently, it does fail, since it is passed the variable v, *after* the body of the function is done with it.

IMO, this is wrong. When calling a function with an out contract, the arguments should *also* be passed to the out contract directly. "out" should not be expected to run on the body's "sloppy seconds".

In particular if/when we will have "contracts are managed/compiled by caller", then that behavior is the only behavior we will be able to do (AFAIK).

Or is there something that explicitly states it works that way? Should I file a bug report? ER?

Reply via email to