diff --git a/packages/react-reconciler/src/ReactFiber.js b/packages/react-reconciler/src/ReactFiber.js
index f84d7796c99b..ea41e2b10e82 100644
--- a/packages/react-reconciler/src/ReactFiber.js
+++ b/packages/react-reconciler/src/ReactFiber.js
@@ -542,6 +542,8 @@ export function resetWorkInProgress(
workInProgress.dependencies = null;
+ workInProgress.stateNode = null;
+
if (enableProfilerTimer) {
// Note: We don't reset the actualTime counts. It's useful to accumulate
// actual time across multiple render passes.
diff --git a/packages/react-reconciler/src/__tests__/ReactSuspenseList-test.internal.js b/packages/react-reconciler/src/__tests__/ReactSuspenseList-test.internal.js
index c13c31144828..572f0f8518e8 100644
--- a/packages/react-reconciler/src/__tests__/ReactSuspenseList-test.internal.js
+++ b/packages/react-reconciler/src/__tests__/ReactSuspenseList-test.internal.js
@@ -2485,4 +2485,66 @@ describe('ReactSuspenseList', () => {
>,
);
});
+
+ it('can resume class components when revealed together', async () => {
+ let A = createAsyncText('A');
+ let B = createAsyncText('B');
+
+ class ClassComponent extends React.Component {
+ render() {
+ return this.props.children;
+ }
+ }
+
+ function Foo() {
+ return (
+ }>
+
+
+ }>
+
+
+
+
+ }>
+
+
+
+
+
+ );
+ }
+
+ await A.resolve();
+
+ ReactNoop.render();
+
+ expect(Scheduler).toFlushAndYield([
+ 'A',
+ 'Suspend! [B]',
+ 'Loading B',
+ 'Loading A',
+ 'Loading B',
+ ]);
+
+ expect(ReactNoop).toMatchRenderedOutput(
+ <>
+ Loading A
+ Loading B
+ >,
+ );
+
+ await B.resolve();
+
+ ReactNoop.render();
+
+ expect(Scheduler).toFlushAndYield(['A', 'B']);
+
+ expect(ReactNoop).toMatchRenderedOutput(
+ <>
+ A
+ B
+ >,
+ );
+ });
});