diff --git a/lang/funcs/core/world/schedule_func.go b/lang/funcs/core/world/schedule_func.go index 248855ae..c930dbf1 100644 --- a/lang/funcs/core/world/schedule_func.go +++ b/lang/funcs/core/world/schedule_func.go @@ -142,7 +142,7 @@ func (obj *SchedulePolyFunc) Unify(expr interfaces.Expr) ([]interfaces.Invariant if cfavInvar.Func != expr { continue } - // cfavInvar.Expr is the ExprCall! + // cfavInvar.Expr is the ExprCall! (the return pointer) // cfavInvar.Args are the args that ExprCall uses! if len(cfavInvar.Args) == 0 { return nil, fmt.Errorf("unable to build function with no args") @@ -155,6 +155,13 @@ func (obj *SchedulePolyFunc) Unify(expr interfaces.Expr) ([]interfaces.Invariant var invariants []interfaces.Invariant var invar interfaces.Invariant + // add the relationship to the returned value + invar = &interfaces.EqualityInvariant{ + Expr1: cfavInvar.Expr, + Expr2: dummyOut, + } + invariants = append(invariants, invar) + // add the relationships to the called args invar = &interfaces.EqualityInvariant{ Expr1: cfavInvar.Args[0], @@ -180,7 +187,7 @@ func (obj *SchedulePolyFunc) Unify(expr interfaces.Expr) ([]interfaces.Invariant optsTypeKnown := false // speculate about the type? - if typ, err := cfavInvar.Args[1].Type(); err == nil { + if typ, exists := solved[cfavInvar.Args[1]]; exists { optsTypeKnown = true if typ.Kind != types.KindStruct { return nil, fmt.Errorf("second arg must be of kind struct") @@ -234,6 +241,14 @@ func (obj *SchedulePolyFunc) Unify(expr interfaces.Expr) ([]interfaces.Invariant } invariants = append(invariants, invar) } + // redundant? + if typ, err := cfavInvar.Args[1].Type(); err == nil { + invar := &interfaces.EqualsInvariant{ + Expr: cfavInvar.Args[1], + Type: typ, + } + invariants = append(invariants, invar) + } // If we're strict, require it, otherwise let // in whatever, and let Build() deal with it.