code: func (n *EvalMaybeTainted) Eval(ctx EvalContext) (interface{}, error) {
  	state := *n.State
  	change := *n.Change
  	err := *n.Error
  
  	if state != nil && state.Status == states.ObjectTainted {
  		log.Printf("[TRACE] EvalMaybeTainted: %s was already tainted, so nothing to do", n.Addr.Absolute(ctx.Path()))
  		return nil, nil
  	}
  
  	if n.StateOutput != nil {
  		if err != nil && change.Action == plans.Create {
  			// If there are errors during a _create_ then the object is
  			// in an undefined state, and so we'll mark it as tainted so
  			// we can try again on the next run.
  			//
  			// We don't do this for other change actions because errors
  			// during updates will often not change the remote object at all.
  			// If there _were_ changes prior to the error, it's the provider's
  			// responsibility to record the effect of those changes in the
  			// object value it returned.
  			log.Printf("[TRACE] EvalMaybeTainted: %s encountered an error during creation, so it is now marked as tainted", n.Addr.Absolute(ctx.Path()))
  			*n.StateOutput = state.AsTainted()
  		} else {
  			*n.StateOutput = state
  		}
  	}
  
  	return nil, nil
  }
docs: // TODO: test