[compiler] Add VoidUseMemo rule to RecommendedLatest (#34783)
Adds a new error category VoidUseMemo which is only enabled in the RecommendedLatest preset for now.
lauren committed
Oct 8, 2025 at 15:55 UTC
4b3e662e4ce54eb54a8701c48a967cc84a389501
2 files changed
+17
-2
compiler/packages/babel-plugin-react-compiler/src/CompilerError.ts
+16
-1
@@ -536,7 +536,8 @@ function printErrorSummary(category: ErrorCategory, message: string): string {
536
case ErrorCategory.StaticComponents:
537
case ErrorCategory.Suppression:
538
case ErrorCategory.Syntax:
539
- case ErrorCategory.UseMemo: {
539
+ case ErrorCategory.UseMemo:
540
+ case ErrorCategory.VoidUseMemo: {
541
heading = 'Error';
542
break;
543
}
@@ -582,6 +583,10 @@ export enum ErrorCategory {
583
* Checking for valid usage of manual memoization
584
*/
585
UseMemo = 'UseMemo',
586
+ /**
587
+ * Checking that useMemos always return a value
588
+ */
589
+ VoidUseMemo = 'VoidUseMemo',
590
/**
591
* Checking for higher order functions acting as factories for components/hooks
592
*/
@@ -977,6 +982,16 @@ function getRuleForCategoryImpl(category: ErrorCategory): LintRule {
982
preset: LintRulePreset.Recommended,
983
};
984
}
985
+ case ErrorCategory.VoidUseMemo: {
986
+ return {
987
+ category,
988
+ severity: ErrorSeverity.Error,
989
+ name: 'void-use-memo',
990
+ description:
991
+ 'Validates that useMemos always return a value. See [`useMemo()` docs](https://react.dev/reference/react/useMemo) for more information.',
992
+ preset: LintRulePreset.RecommendedLatest,
993
+ };
994
+ }
995
case ErrorCategory.IncompatibleLibrary: {
996
return {
997
category,
compiler/packages/babel-plugin-react-compiler/src/Inference/DropManualMemoization.ts
+1
-1
@@ -454,7 +454,7 @@ export function dropManualMemoization(
454
if (!hasNonVoidReturn(funcToCheck.loweredFunc.func)) {
455
errors.pushDiagnostic(
456
CompilerDiagnostic.create({
457
- category: ErrorCategory.UseMemo,
457
+ category: ErrorCategory.VoidUseMemo,
458
reason: 'useMemo() callbacks must return a value',
459
description: `This ${
460
manualMemo.loadInstr.value.kind === 'PropertyLoad'