================
@@ -11444,9 +11444,12 @@ static void DiagnoseBadShiftValues(Sema& S, ExprResult 
&LHS, ExprResult &RHS,
   llvm::APSInt Right = RHSResult.Val.getInt();
 
   if (Right.isNegative()) {
-    S.DiagRuntimeBehavior(Loc, RHS.get(),
-                          S.PDiag(diag::warn_shift_negative)
-                            << RHS.get()->getSourceRange());
+    if (S.ExprEvalContexts.back().isConstantEvaluated())
+      S.Diag(Loc, diag::warn_shift_negative) << RHS.get()->getSourceRange();
+    else
+      S.DiagRuntimeBehavior(Loc, RHS.get(),
+                            S.PDiag(diag::warn_shift_negative)
+                              << RHS.get()->getSourceRange());
----------------
AaronBallman wrote:

I still don't think this is the correct fix -- I think the issue is that 
ExprConstant.cpp needs to be taught about these as undefined behaviors. Notice 
how GCC correctly emits the pedantic diagnostic but Clang does not: 
https://godbolt.org/z/arb8Y9G9q

When I step through in the debugger, it seems that we do catch the issue in 
`handleIntIntBinOp()` but we're suppressing diagnostics for it in C more 
broadly. That seems more likely to be the root cause of the issue. (Basically, 
we want the diagnostics to be split between SemaExpr.cpp for runtime reachable 
diagnostics and ExprConstant.cpp for constant expressions.)

CC @tbaederr for opinions on constant expression behavior here.

https://github.com/llvm/llvm-project/pull/70307
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to