================
@@ -13997,34 +14015,65 @@ void Sema::CheckImplicitConversion(Expr *E, QualType 
T, SourceLocation CC,
 }
 
 static void CheckConditionalOperator(Sema &S, AbstractConditionalOperator *E,
-                                     SourceLocation CC, QualType T);
+                                     SourceLocation CC, QualType T,
+                                     bool IsKnownUnreachable);
 
 static void CheckConditionalOperand(Sema &S, Expr *E, QualType T,
-                                    SourceLocation CC, bool &ICContext) {
+                                    SourceLocation CC, bool &ICContext,
+                                    bool IsKnownUnreachable) {
   E = E->IgnoreParenImpCasts();
   // Diagnose incomplete type for second or third operand in C.
   if (!S.getLangOpts().CPlusPlus && E->getType()->isRecordType())
     S.RequireCompleteExprType(E, diag::err_incomplete_type);
 
   if (auto *CO = dyn_cast<AbstractConditionalOperator>(E))
-    return CheckConditionalOperator(S, CO, CC, T);
+    return CheckConditionalOperator(S, CO, CC, T, IsKnownUnreachable);
 
-  AnalyzeImplicitConversions(S, E, CC);
+  AnalyzeImplicitConversions(S, E, CC, /*IsListInit=*/false,
+                             IsKnownUnreachable);
   if (E->getType() != T)
-    return S.CheckImplicitConversion(E, T, CC, &ICContext);
+    return S.CheckImplicitConversion(E, T, CC, &ICContext,
+                                     /*IsListInit=*/false, IsKnownUnreachable);
 }
 
 static void CheckConditionalOperator(Sema &S, AbstractConditionalOperator *E,
-                                     SourceLocation CC, QualType T) {
-  AnalyzeImplicitConversions(S, E->getCond(), E->getQuestionLoc());
+                                     SourceLocation CC, QualType T,
+                                     bool IsKnownUnreachable) {
+  AnalyzeImplicitConversions(S, E->getCond(), E->getQuestionLoc(),
+                             /*IsListInit=*/false, IsKnownUnreachable);
+
+  bool CondValue;
+  bool CondIsKnown = E->getCond()->EvaluateAsBooleanCondition(
+      CondValue, S.Context, S.isConstantEvaluatedContext());
+  if (CondIsKnown && !S.isConstantEvaluatedContext()) {
+    // The condition may also be evaluated at compile time, for example in a
+    // constexpr function. Only prune an operand if both evaluations agree;
+    // __builtin_is_constant_evaluated() can produce different results.
----------------
TPPPP72 wrote:

Are these comments necessary? We need to seek the opinions of other reviewers.

https://github.com/llvm/llvm-project/pull/226775
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to