[clang] [Clang] Implement P2809: Trivial infinite loops are not Undefined Behavior (PR #90066)

Eli Friedman via cfe-commits cfe-commits at lists.llvm.org
Thu May 2 11:52:45 PDT 2024


================
@@ -908,6 +908,72 @@ void CodeGenFunction::EmitIfStmt(const IfStmt &S) {
     incrementProfileCounter(&S);
 }
 
+bool CodeGenFunction::checkIfLoopMustProgress(const Expr *ControllingExpression,
+                                              bool HasEmptyBody) {
+  if (CGM.getCodeGenOpts().getFiniteLoops() ==
+      CodeGenOptions::FiniteLoopsKind::Never)
+    return false;
+
+  // Now apply rules for plain C (see  6.8.5.6 in C11).
+  // Loops with constant conditions do not have to make progress in any C
+  // version.
+  // As an extension, we consisider loops whose constant expression
+  // can be constant-folded.
+  Expr::EvalResult Result;
+  bool CondIsConstInt =
+      !ControllingExpression ||
+      (ControllingExpression->EvaluateAsInt(Result, getContext()) &&
+       Result.Val.isInt());
+
+  bool CondIsTrue = CondIsConstInt && (!ControllingExpression ||
+                                       Result.Val.getInt().getBoolValue());
+
+  if (getLangOpts().C99 && CondIsConstInt)
----------------
efriedma-quic wrote:

Where did getLangOpts().C99 come from?  I think the old code treated c89/c99/c++98 as equivalent (never must-progress).

https://github.com/llvm/llvm-project/pull/90066


More information about the cfe-commits mailing list