{"atom":"regression/sink-context-method","family":"regression","slug":"sink-context-method","header":{"atom":"regression/sink-context-method","kind":"whole-program — a minimal repro, not yet reduced to an atom","source":"curated"},"axes":null,"cols":null,"engines":["rakudo-2026.07","rakupp-3.14.0"],"kinds":["ref","pp"],"defFrom":"rakupp:t/regression/sink-context-method.raku","counts":{"a":1,"f":0,"d":0,"c":0,"r":0,"n":0},"files":["atoms/regression/sink-context-method.grid"],"records":[["0001","","# Regression: a statement whose value is discarded (sink context) invokes the\n# result object's user-defined `sink` method, and every top-level statement is\n# in sink context. Surfaced by HTTP::Status, which registers each status code by\n# creating instances as bare statements (`HTTP::Status.new: 404, 'Not Found'`)\n# whose `method sink { @codes[$!code] = self }` populates a lookup table.\nmy $ok = 0; my $n = 0;\nsub ck($got, $want, $desc) {\n    $n++;\n    if $got eqv $want { $ok++ }\n    else { say \"FAIL: $desc — {$got.raku} vs {$want.raku}\" }\n}\n\nmy @reg;\nclass Node {\n    has $.id;\n    method sink() { @reg[$!id] = \"node-$!id\" }\n    method new($id) { self.bless(:$id) }\n}\n\n# bare top-level statements: sink fires, table populated\nNode.new(1);\nNode.new(2);\nck(@reg[1], \"node-1\", 'top-level bare statement fires sink');\nck(@reg[2], \"node-2\", 'top-level bare statement fires sink (2)');\n\n# a value that IS used must NOT be sunk\nmy @reg2;\nclass Once {\n    has $.k;\n    method sink() { @reg2[$!k] = 1 }\n    method new($k) { self.bless(:$k) }\n}\nmy $kept = Once.new(5);   # assigned → not sunk\nck(@reg2[5].defined, False, 'assigned value is not sunk');\n\n# sink inside a nested block: non-final statements sink\nsub run-them() {\n    Node.new(8);\n    Node.new(9);\n    42;              # final value returned, not the nodes\n}\nrun-them();\nck(@reg[8], \"node-8\", 'nested-block non-final statement sinks');\nck(@reg[9], \"node-9\", 'nested-block non-final statement sinks (2)');\n\nsay $ok == $n ?? 'PASS' !! \"FAIL ($ok/$n)\";","output PASS","a",["PASS","PASS"],0,[["budget","20s"]]]]}