composer prohibits explains why you cannot upgrade

A refused upgrade produces a wall of conflict output that names twenty packages and does not say which one is responsible. prohibits answers the question directly.

$ composer prohibits symfony/console 4.2
laravel/framework  v5.6.39  requires  symfony/console (~3.3)

$ composer why doctrine/inflector
laravel/framework  v5.6.39  requires  doctrine/inflector (~1.1)

$ composer why-not php 7.3
some/package  1.4.0  requires  php (^7.0 <7.3)

why-not is the alias worth remembering, and pointing it at php is how you find out what is pinning a project to an old runtime. The output is a single line naming the package and the constraint, which turns an afternoon of bisecting into a decision about one dependency. It reads the installed tree rather than resolving, so it is instant.