diff --git a/compiler/forget/src/__tests__/fixtures/compiler/invalid-freeze-mutable-lambda.expect.md b/compiler/forget/src/__tests__/fixtures/compiler/invalid-freeze-mutable-lambda.expect.md
new file mode 100644
index 0000000000..41f4979204
--- /dev/null
+++ b/compiler/forget/src/__tests__/fixtures/compiler/invalid-freeze-mutable-lambda.expect.md
@@ -0,0 +1,62 @@
+
+## Input
+
+```javascript
+function Component(props) {
+ const [x, setX] = useState({ value: "" });
+ const onChange = (e) => {
+ // INVALID! should use copy-on-write and pass the new value
+ x.value = e.target.value;
+ setX(x);
+ };
+ return ;
+}
+
+```
+
+## Code
+
+```javascript
+import { unstable_useMemoCache as useMemoCache } from "react";
+function Component(props) {
+ const $ = useMemoCache(7);
+ let t0;
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
+ t0 = { value: "" };
+ $[0] = t0;
+ } else {
+ t0 = $[0];
+ }
+ const [x, setX] = useState(t0);
+ const c_1 = $[1] !== x;
+ const c_2 = $[2] !== setX;
+ let t1;
+ if (c_1 || c_2) {
+ t1 = (e) => {
+ // INVALID! should use copy-on-write and pass the new value
+ x.value = e.target.value;
+ setX(x);
+ };
+ $[1] = x;
+ $[2] = setX;
+ $[3] = t1;
+ } else {
+ t1 = $[3];
+ }
+ const onChange = t1;
+ const c_4 = $[4] !== x.value;
+ const c_5 = $[5] !== onChange;
+ let t2;
+ if (c_4 || c_5) {
+ t2 = ;
+ $[4] = x.value;
+ $[5] = onChange;
+ $[6] = t2;
+ } else {
+ t2 = $[6];
+ }
+ return t2;
+}
+
+```
+
\ No newline at end of file
diff --git a/compiler/forget/src/__tests__/fixtures/compiler/invalid-freeze-mutable-lambda.js b/compiler/forget/src/__tests__/fixtures/compiler/invalid-freeze-mutable-lambda.js
new file mode 100644
index 0000000000..c4d62da44c
--- /dev/null
+++ b/compiler/forget/src/__tests__/fixtures/compiler/invalid-freeze-mutable-lambda.js
@@ -0,0 +1,9 @@
+function Component(props) {
+ const [x, setX] = useState({ value: "" });
+ const onChange = (e) => {
+ // INVALID! should use copy-on-write and pass the new value
+ x.value = e.target.value;
+ setX(x);
+ };
+ return ;
+}