Skip to content

Commit

Permalink
[flang] Distinguish usage and portability warning messages
Browse files Browse the repository at this point in the history
Using recently established message severity codes, upgrade
non-fatal messages to usage and portability warnings as
appropriate.

Differential Revision: https://reviews.llvm.org/D121246
  • Loading branch information
klausler committed Mar 9, 2022
1 parent 0605724 commit a53967c
Show file tree
Hide file tree
Showing 37 changed files with 200 additions and 188 deletions.
2 changes: 1 addition & 1 deletion flang/lib/Evaluate/check-expression.cpp
Expand Up @@ -410,7 +410,7 @@ std::optional<Expr<SomeType>> NonPointerInitializationExpr(const Symbol &symbol,
symbol.owner().context().ShouldWarn(
common::LanguageFeature::LogicalIntegerAssignment)) {
context.messages().Say(
"nonstandard usage: initialization of %s with %s"_en_US,
"nonstandard usage: initialization of %s with %s"_port_en_US,
symTS->type().AsFortran(), x.GetType().value().AsFortran());
}
}
Expand Down
10 changes: 5 additions & 5 deletions flang/lib/Evaluate/common.cpp
Expand Up @@ -16,20 +16,20 @@ namespace Fortran::evaluate {
void RealFlagWarnings(
FoldingContext &context, const RealFlags &flags, const char *operation) {
if (flags.test(RealFlag::Overflow)) {
context.messages().Say("overflow on %s"_en_US, operation);
context.messages().Say("overflow on %s"_warn_en_US, operation);
}
if (flags.test(RealFlag::DivideByZero)) {
if (std::strcmp(operation, "division") == 0) {
context.messages().Say("division by zero"_en_US);
context.messages().Say("division by zero"_warn_en_US);
} else {
context.messages().Say("division on %s"_en_US);
context.messages().Say("division on %s"_warn_en_US);
}
}
if (flags.test(RealFlag::InvalidArgument)) {
context.messages().Say("invalid argument on %s"_en_US, operation);
context.messages().Say("invalid argument on %s"_warn_en_US, operation);
}
if (flags.test(RealFlag::Underflow)) {
context.messages().Say("underflow on %s"_en_US, operation);
context.messages().Say("underflow on %s"_warn_en_US, operation);
}
}

Expand Down
3 changes: 2 additions & 1 deletion flang/lib/Evaluate/fold-complex.cpp
Expand Up @@ -30,7 +30,8 @@ Expr<Type<TypeCategory::Complex, KIND>> FoldIntrinsicFunction(
context, std::move(funcRef), *callable);
} else {
context.messages().Say(
"%s(complex(kind=%d)) cannot be folded on host"_en_US, name, KIND);
"%s(complex(kind=%d)) cannot be folded on host"_warn_en_US, name,
KIND);
}
} else if (name == "conjg") {
return FoldElementalIntrinsic<T, T>(
Expand Down
31 changes: 17 additions & 14 deletions flang/lib/Evaluate/fold-implementation.h
Expand Up @@ -1534,19 +1534,19 @@ Expr<TO> FoldOperation(
auto converted{Scalar<TO>::ConvertSigned(*value)};
if (converted.overflow) {
ctx.messages().Say(
"INTEGER(%d) to INTEGER(%d) conversion overflowed"_en_US,
"INTEGER(%d) to INTEGER(%d) conversion overflowed"_warn_en_US,
Operand::kind, TO::kind);
}
return ScalarConstantToExpr(std::move(converted.value));
} else if constexpr (FromCat == TypeCategory::Real) {
auto converted{value->template ToInteger<Scalar<TO>>()};
if (converted.flags.test(RealFlag::InvalidArgument)) {
ctx.messages().Say(
"REAL(%d) to INTEGER(%d) conversion: invalid argument"_en_US,
"REAL(%d) to INTEGER(%d) conversion: invalid argument"_warn_en_US,
Operand::kind, TO::kind);
} else if (converted.flags.test(RealFlag::Overflow)) {
ctx.messages().Say(
"REAL(%d) to INTEGER(%d) conversion overflowed"_en_US,
"REAL(%d) to INTEGER(%d) conversion overflowed"_warn_en_US,
Operand::kind, TO::kind);
}
return ScalarConstantToExpr(std::move(converted.value));
Expand Down Expand Up @@ -1651,7 +1651,7 @@ Expr<T> FoldOperation(FoldingContext &context, Negate<T> &&x) {
auto negated{value->Negate()};
if (negated.overflow) {
context.messages().Say(
"INTEGER(%d) negation overflowed"_en_US, T::kind);
"INTEGER(%d) negation overflowed"_warn_en_US, T::kind);
}
return Expr<T>{Constant<T>{std::move(negated.value)}};
} else {
Expand Down Expand Up @@ -1691,7 +1691,7 @@ Expr<T> FoldOperation(FoldingContext &context, Add<T> &&x) {
auto sum{folded->first.AddSigned(folded->second)};
if (sum.overflow) {
context.messages().Say(
"INTEGER(%d) addition overflowed"_en_US, T::kind);
"INTEGER(%d) addition overflowed"_warn_en_US, T::kind);
}
return Expr<T>{Constant<T>{sum.value}};
} else {
Expand All @@ -1716,7 +1716,7 @@ Expr<T> FoldOperation(FoldingContext &context, Subtract<T> &&x) {
auto difference{folded->first.SubtractSigned(folded->second)};
if (difference.overflow) {
context.messages().Say(
"INTEGER(%d) subtraction overflowed"_en_US, T::kind);
"INTEGER(%d) subtraction overflowed"_warn_en_US, T::kind);
}
return Expr<T>{Constant<T>{difference.value}};
} else {
Expand All @@ -1742,7 +1742,7 @@ Expr<T> FoldOperation(FoldingContext &context, Multiply<T> &&x) {
auto product{folded->first.MultiplySigned(folded->second)};
if (product.SignedMultiplicationOverflowed()) {
context.messages().Say(
"INTEGER(%d) multiplication overflowed"_en_US, T::kind);
"INTEGER(%d) multiplication overflowed"_warn_en_US, T::kind);
}
return Expr<T>{Constant<T>{product.lower}};
} else {
Expand Down Expand Up @@ -1780,12 +1780,13 @@ Expr<T> FoldOperation(FoldingContext &context, Divide<T> &&x) {
if constexpr (T::category == TypeCategory::Integer) {
auto quotAndRem{folded->first.DivideSigned(folded->second)};
if (quotAndRem.divisionByZero) {
context.messages().Say("INTEGER(%d) division by zero"_en_US, T::kind);
context.messages().Say(
"INTEGER(%d) division by zero"_warn_en_US, T::kind);
return Expr<T>{std::move(x)};
}
if (quotAndRem.overflow) {
context.messages().Say(
"INTEGER(%d) division overflowed"_en_US, T::kind);
"INTEGER(%d) division overflowed"_warn_en_US, T::kind);
}
return Expr<T>{Constant<T>{quotAndRem.quotient}};
} else {
Expand All @@ -1810,12 +1811,13 @@ Expr<T> FoldOperation(FoldingContext &context, Power<T> &&x) {
auto power{folded->first.Power(folded->second)};
if (power.divisionByZero) {
context.messages().Say(
"INTEGER(%d) zero to negative power"_en_US, T::kind);
"INTEGER(%d) zero to negative power"_warn_en_US, T::kind);
} else if (power.overflow) {
context.messages().Say("INTEGER(%d) power overflowed"_en_US, T::kind);
context.messages().Say(
"INTEGER(%d) power overflowed"_warn_en_US, T::kind);
} else if (power.zeroToZero) {
context.messages().Say(
"INTEGER(%d) 0**0 is not defined"_en_US, T::kind);
"INTEGER(%d) 0**0 is not defined"_warn_en_US, T::kind);
}
return Expr<T>{Constant<T>{power.power}};
} else {
Expand All @@ -1824,7 +1826,8 @@ Expr<T> FoldOperation(FoldingContext &context, Power<T> &&x) {
Constant<T>{(*callable)(context, folded->first, folded->second)}};
} else {
context.messages().Say(
"Power for %s cannot be folded on host"_en_US, T{}.AsFortran());
"Power for %s cannot be folded on host"_warn_en_US,
T{}.AsFortran());
}
}
}
Expand Down Expand Up @@ -1907,7 +1910,7 @@ Expr<Type<TypeCategory::Real, KIND>> ToReal(
From converted{From::ConvertUnsigned(real.RawBits()).value};
if (original != converted) { // C1601
context.messages().Say(
"Nonzero bits truncated from BOZ literal constant in REAL intrinsic"_en_US);
"Nonzero bits truncated from BOZ literal constant in REAL intrinsic"_warn_en_US);
}
} else if constexpr (IsNumericCategoryExpr<From>()) {
result = Fold(context, ConvertToType<Result>(std::move(x)));
Expand Down
18 changes: 10 additions & 8 deletions flang/lib/Evaluate/fold-integer.cpp
Expand Up @@ -420,7 +420,7 @@ Expr<Type<TypeCategory::Integer, KIND>> FoldIntrinsicFunction(
typename Scalar<T>::ValueWithOverflow j{i.ABS()};
if (j.overflow) {
context.messages().Say(
"abs(integer(kind=%d)) folding overflowed"_en_US, KIND);
"abs(integer(kind=%d)) folding overflowed"_warn_en_US, KIND);
}
return j.value;
}));
Expand All @@ -440,7 +440,7 @@ Expr<Type<TypeCategory::Integer, KIND>> FoldIntrinsicFunction(
auto y{x.template ToInteger<Scalar<T>>(mode)};
if (y.flags.test(RealFlag::Overflow)) {
context.messages().Say(
"%s intrinsic folding overflow"_en_US, name);
"%s intrinsic folding overflow"_warn_en_US, name);
}
return y.value;
}));
Expand Down Expand Up @@ -506,7 +506,7 @@ Expr<Type<TypeCategory::Integer, KIND>> FoldIntrinsicFunction(
if (len.value() != 1) {
// Do not die, this was not checked before
context.messages().Say(
"Character in intrinsic function %s must have length one"_en_US,
"Character in intrinsic function %s must have length one"_warn_en_US,
name);
} else {
return std::visit(
Expand Down Expand Up @@ -761,9 +761,9 @@ Expr<Type<TypeCategory::Integer, KIND>> FoldIntrinsicFunction(
const Scalar<T> &y) -> Scalar<T> {
auto quotRem{x.DivideSigned(y)};
if (quotRem.divisionByZero) {
context.messages().Say("mod() by zero"_en_US);
context.messages().Say("mod() by zero"_warn_en_US);
} else if (quotRem.overflow) {
context.messages().Say("mod() folding overflowed"_en_US);
context.messages().Say("mod() folding overflowed"_warn_en_US);
}
return quotRem.remainder;
}));
Expand All @@ -774,7 +774,8 @@ Expr<Type<TypeCategory::Integer, KIND>> FoldIntrinsicFunction(
const Scalar<T> &y) -> Scalar<T> {
auto result{x.MODULO(y)};
if (result.overflow) {
context.messages().Say("modulo() folding overflowed"_en_US);
context.messages().Say(
"modulo() folding overflowed"_warn_en_US);
}
return result.value;
}));
Expand Down Expand Up @@ -894,7 +895,8 @@ Expr<Type<TypeCategory::Integer, KIND>> FoldIntrinsicFunction(
typename Scalar<T>::ValueWithOverflow result{j.SIGN(k)};
if (result.overflow) {
context.messages().Say(
"sign(integer(kind=%d)) folding overflowed"_en_US, KIND);
"sign(integer(kind=%d)) folding overflowed"_warn_en_US,
KIND);
}
return result.value;
}));
Expand All @@ -915,7 +917,7 @@ Expr<Type<TypeCategory::Integer, KIND>> FoldIntrinsicFunction(
}
} else {
context.messages().Say(
"size(array,dim=%jd) dimension is out of range for rank-%d array"_en_US,
"size(array,dim=%jd) dimension is out of range for rank-%d array"_warn_en_US,
*dim, rank);
}
}
Expand Down
11 changes: 6 additions & 5 deletions flang/lib/Evaluate/fold-real.cpp
Expand Up @@ -35,7 +35,7 @@ Expr<Type<TypeCategory::Real, KIND>> FoldIntrinsicFunction(
context, std::move(funcRef), *callable);
} else {
context.messages().Say(
"%s(real(kind=%d)) cannot be folded on host"_en_US, name, KIND);
"%s(real(kind=%d)) cannot be folded on host"_warn_en_US, name, KIND);
}
} else if (name == "amax0" || name == "amin0" || name == "amin1" ||
name == "amax1" || name == "dmin1" || name == "dmax1") {
Expand All @@ -48,7 +48,7 @@ Expr<Type<TypeCategory::Real, KIND>> FoldIntrinsicFunction(
context, std::move(funcRef), *callable);
} else {
context.messages().Say(
"%s(real(kind=%d), real(kind%d)) cannot be folded on host"_en_US,
"%s(real(kind=%d), real(kind%d)) cannot be folded on host"_warn_en_US,
name, KIND, KIND);
}
} else if (name == "bessel_jn" || name == "bessel_yn") {
Expand All @@ -60,7 +60,7 @@ Expr<Type<TypeCategory::Real, KIND>> FoldIntrinsicFunction(
context, std::move(funcRef), *callable);
} else {
context.messages().Say(
"%s(integer(kind=4), real(kind=%d)) cannot be folded on host"_en_US,
"%s(integer(kind=4), real(kind=%d)) cannot be folded on host"_warn_en_US,
name, KIND);
}
}
Expand Down Expand Up @@ -90,7 +90,8 @@ Expr<Type<TypeCategory::Real, KIND>> FoldIntrinsicFunction(
const Scalar<T> &x) -> Scalar<T> {
ValueWithRealFlags<Scalar<T>> y{x.ToWholeNumber(mode)};
if (y.flags.test(RealFlag::Overflow)) {
context.messages().Say("%s intrinsic folding overflow"_en_US, name);
context.messages().Say(
"%s intrinsic folding overflow"_warn_en_US, name);
}
return y.value;
}));
Expand Down Expand Up @@ -148,7 +149,7 @@ Expr<Type<TypeCategory::Real, KIND>> FoldIntrinsicFunction(
SCALE(y)};
if (result.flags.test(RealFlag::Overflow)) {
context.messages().Say(
"SCALE intrinsic folding overflow"_en_US);
"SCALE intrinsic folding overflow"_warn_en_US);
}
return result.value;
}));
Expand Down
4 changes: 2 additions & 2 deletions flang/lib/Evaluate/fold-reduction.h
Expand Up @@ -173,7 +173,7 @@ static Expr<T> FoldProduct(
}};
if (overflow) {
context.messages().Say(
"PRODUCT() of %s data overflowed"_en_US, T::AsFortran());
"PRODUCT() of %s data overflowed"_warn_en_US, T::AsFortran());
} else {
return Expr<T>{DoReduction<T>(*array, dim, identity, accumulator)};
}
Expand Down Expand Up @@ -212,7 +212,7 @@ static Expr<T> FoldSum(FoldingContext &context, FunctionRef<T> &&ref) {
}};
if (overflow) {
context.messages().Say(
"SUM() of %s data overflowed"_en_US, T::AsFortran());
"SUM() of %s data overflowed"_warn_en_US, T::AsFortran());
} else {
return Expr<T>{DoReduction<T>(*array, dim, identity, accumulator)};
}
Expand Down
2 changes: 1 addition & 1 deletion flang/lib/Evaluate/host.cpp
Expand Up @@ -102,7 +102,7 @@ void HostFloatingPointEnvironment::SetUpHostFloatingPointEnvironment(
fesetround(FE_TONEAREST);
context.messages().Say(
"TiesAwayFromZero rounding mode is not available when folding constants"
" with host runtime; using TiesToEven instead"_en_US);
" with host runtime; using TiesToEven instead"_warn_en_US);
break;
}
flags_.clear();
Expand Down
2 changes: 1 addition & 1 deletion flang/lib/Evaluate/intrinsics.cpp
Expand Up @@ -2476,7 +2476,7 @@ std::optional<SpecificCall> IntrinsicProcTable::Implementation::Probe(
context.messages().Say(
"argument types do not match specific intrinsic '%s' "
"requirements; using '%s' generic instead and converting the "
"result to %s if needed"_en_US,
"result to %s if needed"_port_en_US,
call.name, genericName, newType.AsFortran());
specificCall->specificIntrinsic.name = call.name;
specificCall->specificIntrinsic.characteristics.value()
Expand Down
4 changes: 2 additions & 2 deletions flang/lib/Evaluate/variable.cpp
Expand Up @@ -223,14 +223,14 @@ std::optional<Expr<SomeCharacter>> Substring::Fold(FoldingContext &context) {
if (!result) { // error cases
if (*lbi < 1) {
context.messages().Say(
"Lower bound (%jd) on substring is less than one"_en_US,
"Lower bound (%jd) on substring is less than one"_warn_en_US,
static_cast<std::intmax_t>(*lbi));
*lbi = 1;
lower_ = AsExpr(Constant<SubscriptInteger>{1});
}
if (length && *ubi > *length) {
context.messages().Say(
"Upper bound (%jd) on substring is greater than character length (%jd)"_en_US,
"Upper bound (%jd) on substring is greater than character length (%jd)"_warn_en_US,
static_cast<std::intmax_t>(*ubi),
static_cast<std::intmax_t>(*length));
*ubi = *length;
Expand Down
6 changes: 3 additions & 3 deletions flang/lib/Parser/basic-parsers.h
Expand Up @@ -856,7 +856,7 @@ template <LanguageFeature LF, typename PA> class NonstandardParser {
auto result{parser_.Parse(state)};
if (result) {
state.Nonstandard(CharBlock{at, std::max(state.GetLocation(), at + 1)},
LF, "nonstandard usage"_en_US);
LF, "nonstandard usage"_port_en_US);
}
return result;
}
Expand Down Expand Up @@ -887,8 +887,8 @@ template <LanguageFeature LF, typename PA> class DeprecatedParser {
auto at{state.GetLocation()};
auto result{parser_.Parse(state)};
if (result) {
state.Nonstandard(
CharBlock{at, state.GetLocation()}, LF, "deprecated usage"_en_US);
state.Nonstandard(CharBlock{at, state.GetLocation()}, LF,
"deprecated usage"_port_en_US);
}
return result;
}
Expand Down

0 comments on commit a53967c

Please sign in to comment.