diff --git a/packages/react-reconciler/src/__tests__/ReactHooks-test.internal.js b/packages/react-reconciler/src/__tests__/ReactHooks-test.internal.js
index 087c8572cd66e..6a480958e5d83 100644
--- a/packages/react-reconciler/src/__tests__/ReactHooks-test.internal.js
+++ b/packages/react-reconciler/src/__tests__/ReactHooks-test.internal.js
@@ -1699,6 +1699,57 @@ describe('ReactHooks', () => {
).toThrow('Hello');
});
+ it('does not fire a false positive warning when previous effect unmounts the component', () => {
+ let {useState, useEffect} = React;
+ let globalListener;
+
+ function A() {
+ const [show, setShow] = useState(true);
+ function hideMe() {
+ setShow(false);
+ }
+ return show ? : null;
+ }
+
+ function B(props) {
+ return ;
+ }
+
+ function C({hideMe}) {
+ const [, setState] = useState();
+
+ useEffect(() => {
+ let isStale = false;
+
+ globalListener = () => {
+ if (!isStale) {
+ setState('hello');
+ }
+ };
+
+ return () => {
+ isStale = true;
+ hideMe();
+ };
+ });
+ return null;
+ }
+
+ ReactTestRenderer.act(() => {
+ ReactTestRenderer.create();
+ });
+
+ expect(() => {
+ globalListener();
+ globalListener();
+ }).toWarnDev([
+ 'An update to C inside a test was not wrapped in act',
+ 'An update to C inside a test was not wrapped in act',
+ // Note: should *not* warn about updates on unmounted component.
+ // Because there's no way for component to know it got unmounted.
+ ]);
+ });
+
// Regression test for https://github.com/facebook/react/issues/14790
it('does not fire a false positive warning when suspending memo', async () => {
const {Suspense, useState} = React;