@karoliineh discovered that warnings during incremental loading can remain at their old locations. For example, when simply adding/removing empty lines. That causes no AST changes, so no nodes change and their warnings are reused, but locations do change.
The problem is that warnings (messages) have their location (or multiple if grouped!), not a node.