//===-- lib/Semantics/check-data.cpp --------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "check-data.h" namespace Fortran::semantics { void DataChecker::Leave(const parser::DataStmtConstant &dataConst) { if (auto *structure{ std::get_if(&dataConst.u)}) { for (const auto &component : std::get>(structure->t)) { const parser::Expr &parsedExpr{ std::get(component.t).v.value()}; if (const auto *expr{GetExpr(parsedExpr)}) { if (!evaluate::IsConstantExpr(*expr)) { // C884 context_.Say(parsedExpr.source, "Structure constructor in data value must be a constant expression"_err_en_US); } } } } // TODO: C886 and C887 for data-stmt-constant } // TODO: C874-C881 void DataChecker::Leave(const parser::DataStmtRepeat &dataRepeat) { if (const auto *designator{parser::Unwrap(dataRepeat)}) { if (auto *dataRef{std::get_if(&designator->u)}) { evaluate::ExpressionAnalyzer exprAnalyzer{context_}; if (MaybeExpr checked{exprAnalyzer.Analyze(*dataRef)}) { auto expr{ evaluate::Fold(context_.foldingContext(), std::move(checked))}; if (auto i64{ToInt64(expr)}) { if (*i64 < 0) { // C882 context_.Say(designator->source, "Repeat count for data value must not be negative"_err_en_US); } } } } } } } // namespace Fortran::semantics