9.4. A debugging order
When something fails, working outward in this order avoids most wasted effort:
-
laurelParse— is it a syntax problem? -
laurelToCore— is it a resolution or lowering problem? -
laurelAnalyze --keep-all-files out— did a pass transform the construct in a way you did not expect? -
Read the final Core program before looking at any SMT.
-
Only then,
--vc-directory vcs --no-solveto inspect the query.
For a failing obligation specifically, the usual moves are to weaken the goal until it passes —
which tells you which conjunct is at fault — and to add asserts at intermediate points, since a
proof that fails at the end often fails because a fact you assumed was available never was. When
an obligation times out rather than fails, suspect a quantifier: check whether a forall needs a
trigger, or whether one it has is firing far too often.