[SemaExpr] Factor out common diagnostic code for remainder/division.

llvm-svn: 243832
This commit is contained in:
Davide Italiano 2015-08-01 10:13:39 +00:00
parent 503a2594c3
commit f76da1dac9
1 changed files with 16 additions and 18 deletions

View File

@ -7417,6 +7417,19 @@ static void checkArithmeticNull(Sema &S, ExprResult &LHS, ExprResult &RHS,
<< LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
}
static void DiagnoseBadDivideOrRemainderValues(Sema& S, ExprResult &LHS,
ExprResult &RHS,
SourceLocation Loc, bool IsDiv) {
// Check for division/remainder by zero.
unsigned Diag = (IsDiv) ? diag::warn_division_by_zero :
diag::warn_remainder_by_zero;
llvm::APSInt RHSValue;
if (!RHS.get()->isValueDependent() &&
RHS.get()->EvaluateAsInt(RHSValue, S.Context) && RHSValue == 0)
S.DiagRuntimeBehavior(Loc, RHS.get(),
S.PDiag(Diag) << RHS.get()->getSourceRange());
}
QualType Sema::CheckMultiplyDivideOperands(ExprResult &LHS, ExprResult &RHS,
SourceLocation Loc,
bool IsCompAssign, bool IsDiv) {
@ -7435,15 +7448,8 @@ QualType Sema::CheckMultiplyDivideOperands(ExprResult &LHS, ExprResult &RHS,
if (compType.isNull() || !compType->isArithmeticType())
return InvalidOperands(Loc, LHS, RHS);
// Check for division by zero.
llvm::APSInt RHSValue;
if (IsDiv && !RHS.get()->isValueDependent() &&
RHS.get()->EvaluateAsInt(RHSValue, Context) && RHSValue == 0)
DiagRuntimeBehavior(Loc, RHS.get(),
PDiag(diag::warn_division_by_zero)
<< RHS.get()->getSourceRange());
if (IsDiv)
DiagnoseBadDivideOrRemainderValues(*this, LHS, RHS, Loc, IsDiv);
return compType;
}
@ -7467,15 +7473,7 @@ QualType Sema::CheckRemainderOperands(
if (compType.isNull() || !compType->isIntegerType())
return InvalidOperands(Loc, LHS, RHS);
// Check for remainder by zero.
llvm::APSInt RHSValue;
if (!RHS.get()->isValueDependent() &&
RHS.get()->EvaluateAsInt(RHSValue, Context) && RHSValue == 0)
DiagRuntimeBehavior(Loc, RHS.get(),
PDiag(diag::warn_remainder_by_zero)
<< RHS.get()->getSourceRange());
DiagnoseBadDivideOrRemainderValues(*this, LHS, RHS, Loc, false /* IsDiv */);
return compType;
}