brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.0 KiB · 119ea3c Raw
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