'Execute all constraints.  Errors are caught and returned as a list.
This allows progressing even though some constraints may fail
due to lack of information (e.g. imprecise types such as List(undefined)).'

def propagate(self, typeinfer):

    errors = []
    for constraint in self.constraints:
        loc = constraint.loc
        with typeinfer.warnings.catch_warnings(filename=loc.filename, lineno=loc.line):
            try:
                constraint(typeinfer)
            except TypingError as e:
                errors.append(e)
            except Exception:
                msg = 'Internal    error    at    {con}:\n{sep}\n{err}{sep}\n'
                e = TypingError(msg.format(con=constraint, err=traceback.format_exc(), sep=('--%<' + ('-' * 65))), loc=constraint.loc)
                errors.append(e)
    return errors
