================ @@ -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()); ---------------- tbaederr wrote:
The constant interpreter already diagnoses this: https://github.com/llvm/llvm-project/blob/51089e360e37962c7841fe0a494ba9fb5368bab2/clang/lib/AST/ExprConstant.cpp#L2850-L2851 and for the test case with the `(-1 << 29)` enum value, this is evaluated in `Sema::VerifyIntegerConstantExpresssion()` and it's also diagnosed here: https://github.com/llvm/llvm-project/blob/51089e360e37962c7841fe0a494ba9fb5368bab2/clang/lib/Sema/SemaExpr.cpp#L18158-L18159 But the diagnostic doesn't show up. Not sure why. If I modify the constant interpreter to `return false` in the negative LHS case, I get the expected diagnostic: ```console /home/tbaeder/test.cpp:2:9: error: expression is not an integral constant expression 2 | X = (-1<<29) // expected-warning {{shifting a negative signed value is undefined}} | ^~~~~~~~ /home/tbaeder/test.cpp:2:12: note: left shift of negative value -1 2 | X = (-1<<29) // expected-warning {{shifting a negative signed value is undefined}} | ^ ``` 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