65 lines · cpp
1//===-- lib/Evaluate/common.cpp -------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "flang/Evaluate/common.h"10#include "flang/Common/idioms.h"11 12using namespace Fortran::parser::literals;13 14namespace Fortran::evaluate {15 16void FoldingContext::RealFlagWarnings(17 const RealFlags &flags, const char *operation) {18 static constexpr auto warning{common::UsageWarning::FoldingException};19 if (!realFlagWarningContext_.empty()) {20 // Override 'operation' with a string like21 // "compilation-time evaluation of a call to '...'"22 operation = realFlagWarningContext_.c_str();23 }24 if (flags.test(RealFlag::Overflow)) {25 Warn(warning, "overflow on %s"_warn_en_US, operation);26 }27 if (flags.test(RealFlag::DivideByZero)) {28 if (std::strcmp(operation, "division") == 0) {29 Warn(warning, "division by zero"_warn_en_US);30 } else {31 Warn(warning, "division by zero on %s"_warn_en_US, operation);32 }33 }34 if (flags.test(RealFlag::InvalidArgument)) {35 Warn(warning, "invalid argument on %s"_warn_en_US, operation);36 }37 if (flags.test(RealFlag::Underflow)) {38 Warn(warning, "underflow on %s"_warn_en_US, operation);39 }40}41 42ConstantSubscript &FoldingContext::StartImpliedDo(43 parser::CharBlock name, ConstantSubscript n) {44 auto pair{impliedDos_.insert(std::make_pair(name, n))};45 CHECK(pair.second);46 return pair.first->second;47}48 49std::optional<ConstantSubscript> FoldingContext::GetImpliedDo(50 parser::CharBlock name) const {51 if (auto iter{impliedDos_.find(name)}; iter != impliedDos_.cend()) {52 return {iter->second};53 } else {54 return std::nullopt;55 }56}57 58void FoldingContext::EndImpliedDo(parser::CharBlock name) {59 auto iter{impliedDos_.find(name)};60 if (iter != impliedDos_.end()) {61 impliedDos_.erase(iter);62 }63}64} // namespace Fortran::evaluate65