================ @@ -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()); ---------------- budimirarandjelovicsyrmia wrote:
Diagnose is caught in handleIntIntBinOp() and is emitted for C++ in VerifyIntegerConstantExpression(). There are two reasons why diagnostic could be emitted in case of C++: 1) evaluating expression as rvalue fails or evaluation result has side effects or it is not an integer; evaluating expression as rvalue fails if function handleIntIntBinOp() returns false 2) folding is allowed (CanFold == AllowFoldKind::AllowFold); this value depends on place where constant expression is defined; eg. in case on enum folding is allowed and in case of static assertion it is not allowed Also, diagnostic would not be emitted if Diagnoser is suppresed. However, in C case there are no diagnostic for integer constant expression. So I enabled diagnosing in C case (if Diagnoser is not suppressed). In function EvaluateKnownConstIntCheckOverflow() it is expected that evaluating rvalue is successful, so I keep handleIntIntBinOp() returning true. For C++ diagnostic, I modified handleIntIntBinOp() to return false. As folding is allowed for enum and not for static assertion, I added in tests to check both enum and static assertion diagnosing. 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