I don't think that input validation of top-level widgets happens automatically. Neither the info manual nor the source code suggest otherwise.
Composite widgets (e.g.
editable-list) automatically validate their childs upon validation, but you need to explicitly validate top-level widgets yourself before using their values.
For instance, if your form has some kind of “Apply” button, you'd iterate through all relevant input widgets in its
:notify action, and validate each widget by calling its
:validate property, e.g.:
(let ((unvalidated-widgets my-widgets)
(while (and unvalidated-widgets (not form-invalid))
(let ((widget (pop unvalidated-widgets)))
(when (widget-apply input-field :validate)
(setq form-invalid t)
(message "Widget %s failed verification: %s"
(widget-get widget :tag)
(widget-get widget :error)))))
;; The form is valid, do whatever you want to do with its data
my-widgets is a list of widgets in your form.