From 4aaf7353a4210d0626ca4dd60c26f5426680db01 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Mon, 29 Jun 2026 11:16:38 +0100 Subject: [PATCH] Fix circular dependency --- go/ql/lib/semmle/go/controlflow/IR.qll | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/IR.qll b/go/ql/lib/semmle/go/controlflow/IR.qll index 7de46c2b700..f554e66810a 100644 --- a/go/ql/lib/semmle/go/controlflow/IR.qll +++ b/go/ql/lib/semmle/go/controlflow/IR.qll @@ -1263,8 +1263,20 @@ module IR { MkLiteralElementTarget(ControlFlow::Node write) { write.isAdditional(any(CompositeLit lit).getAnElement(), "lit-init") } or - /** A result variable write target. */ - MkResultWriteTarget(WriteResultInstruction w) + /** + * A result variable write target. Parameterized by `ControlFlow::Node` + * rather than `WriteResultInstruction` to avoid a circular dependency: + * `WriteResultInstruction extends WriteInstruction` needs + * `MkResultWriteTarget(this)` to hold, which would in turn require + * `this` to already be a `WriteResultInstruction`. + */ + MkResultWriteTarget(ControlFlow::Node w) { + exists(ReturnStmt ret, int idx | + w.isAdditional(ret, "result-write:" + idx.toString()) and + exists(ret.getEnclosingFunction().getResultVar(idx)) and + exists(ret.getAnExpr()) + ) + } /** A representation of the target of a write instruction. */ class WriteTarget extends TWriteTarget {