[clang] [clang] Reject array comparisons in C++26 for unknown/dependent types in templates (PR #191101)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Apr 29 12:02:15 PDT 2026
================
@@ -12860,6 +12837,33 @@ QualType Sema::CheckCompareOperands(ExprResult &LHS, ExprResult &RHS,
return Ty->isPointerType() || Ty->isMemberPointerType();
};
+ // C++1a [array.comp]:
+ // Equality and relational comparisons ([expr.eq], [expr.rel]) between two
+ // operands of array type.
+ // C++2a [depr.array.comp]:
+ // Equality and relational comparisons ([expr.eq], [expr.rel]) between two
+ // operands of array type are deprecated.
+ Expr *LHSStripped = LHS.get()->IgnoreParenImpCasts();
+ Expr *RHSStripped = RHS.get()->IgnoreParenImpCasts();
+ if (getLangOpts().CPlusPlus && LHSStripped->getType()->isArrayType() &&
+ RHSStripped->getType()->isArrayType()) {
+
+ // In an SFINAE context, don't emit an error.
+ // Just return the operands so the caller can return false.
+ if (isSFINAEContext()) {
+ return InvalidOperands(Loc, LHS, RHS);
+ }
+ auto IsDeprArrayComparionIgnored =
+ getDiagnostics().isIgnored(diag::warn_depr_array_comparison, Loc);
+ auto DiagID = getLangOpts().CPlusPlus26 ? diag::warn_array_comparison_cxx26
+ : !getLangOpts().CPlusPlus20 || IsDeprArrayComparionIgnored
+ ? diag::warn_array_comparison
+ : diag::warn_depr_array_comparison;
+ this->Diag(Loc, DiagID)
----------------
Sirraide wrote:
```suggestion
Diag(Loc, DiagID)
```
https://github.com/llvm/llvm-project/pull/191101
More information about the cfe-commits
mailing list