facebook/react · error · Error

Expected overrideSuspense() to not get called for earlier Re

Error message

Expected overrideSuspense() to not get called for earlier React versions.

What it means

overrideSuspense(id, forceFallback) powers the 'toggle suspend' control on Suspense boundaries. It requires the renderer to expose setSuspenseHandler and scheduleUpdate (React 16.9+); on older React, DevTools has no API to force a boundary to show its fallback, so calling this throws immediately. The stock UI hides the control via supportsTogglingSuspense (renderer.js:452-454, also declared false by the legacy and flight backends).

Source

Thrown at packages/react-devtools-shared/src/backend/fiber/renderer.js:7512

  function shouldSuspendFiberAlwaysFalse() {
    return false;
  }

  const forceFallbackForFibers = new Set<Fiber>();

  function shouldSuspendFiberAccordingToSet(fiber: Fiber): boolean {
    return (
      forceFallbackForFibers.has(fiber) ||
      (fiber.alternate !== null && forceFallbackForFibers.has(fiber.alternate))
    );
  }

  function overrideSuspense(id: number, forceFallback: boolean) {
    if (
      typeof setSuspenseHandler !== 'function' ||
      typeof scheduleUpdate !== 'function'
    ) {
      throw new Error(
        'Expected overrideSuspense() to not get called for earlier React versions.',
      );
    }
    const devtoolsInstance = idToDevToolsInstanceMap.get(id);
    if (devtoolsInstance === undefined) {
      return;
    }
    const nearestFiber = getNearestFiber(devtoolsInstance);
    if (nearestFiber === null) {
      return;
    }
    let fiber = nearestFiber;
    while (fiber.tag !== SuspenseComponent) {
      if (fiber.return === null) {
        return;
      }
      fiber = fiber.return;
    }

View on GitHub (pinned to eafeac097b)

Solutions

  1. Upgrade react/react-dom to >=16.9.
  2. Gate the suspense toggle on inspectedElement.canToggleSuspense before sending 'overrideSuspense'.
  3. Reload after dependency version swaps so the hook re-inspects renderer capabilities.
  4. Confirm the selected renderer is the Fiber renderer (legacy/flight backends never support suspense toggling).

Example fix

// before
onClick={() => bridge.send('overrideSuspense', {id, rendererID, forceFallback: true})}

// after
const canToggleSuspense = inspectedElement?.canToggleSuspense === true;
onClick={() => canToggleSuspense && bridge.send('overrideSuspense', {id, rendererID, forceFallback: true})}
Defensive patterns

Strategy: validation

Validate before calling

// gate on the backend-provided flag (renderer.js:6311-6313)
if (inspectedElement?.canToggleSuspense === true) {
  bridge.send('overrideSuspense', {id, rendererID, forceFallback});
}

Prevention

When it happens

Trigger: Clicking 'Suspend'/' Unsuspend' on a Suspense boundary on a page running React <16.9, or a custom frontend sending the 'overrideSuspense' bridge message without checking canToggleSuspense / supportsTogglingSuspense.

Common situations: Older React 16.x apps (pre-16.9) with suspense UI explored in DevTools; test harnesses embedding react-devtools-shared against pinned legacy renderers; HMR downgrades of react-dom.

Related errors


AI-assisted analysis of facebook/react@eafeac097b (2026-08-21). Data as JSON: /api/errors/6a9eab071d84a888. Report an issue: GitHub.