brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · 452a891 Raw
65 lines · cpp
1//===-- lib/Semantics/check-nullify.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 "check-nullify.h"10#include "definable.h"11#include "flang/Evaluate/expression.h"12#include "flang/Parser/message.h"13#include "flang/Parser/parse-tree.h"14#include "flang/Semantics/expression.h"15#include "flang/Semantics/tools.h"16 17namespace Fortran::semantics {18 19void NullifyChecker::Leave(const parser::NullifyStmt &nullifyStmt) {20  CHECK(context_.location());21  const Scope &scope{context_.FindScope(*context_.location())};22  for (const parser::PointerObject &pointerObject : nullifyStmt.v) {23    common::visit(24        common::visitors{25            [&](const parser::Name &name) {26              if (name.symbol) {27                if (auto whyNot{WhyNotDefinable(name.source, scope,28                        DefinabilityFlags{DefinabilityFlag::PointerDefinition},29                        *name.symbol)}) {30                  context_.messages()31                      .Say(name.source,32                          "'%s' may not appear in NULLIFY"_err_en_US,33                          name.source)34                      .Attach(std::move(35                          whyNot->set_severity(parser::Severity::Because)));36                }37              }38            },39            [&](const parser::StructureComponent &structureComponent) {40              const auto &component{structureComponent.component};41              SourceName at{component.source};42              if (const auto *checkedExpr{GetExpr(context_, pointerObject)}) {43                if (auto whyNot{WhyNotDefinable(at, scope,44                        DefinabilityFlags{DefinabilityFlag::PointerDefinition},45                        *checkedExpr)}) {46                  context_.messages()47                      .Say(at, "'%s' may not appear in NULLIFY"_err_en_US, at)48                      .Attach(std::move(49                          whyNot->set_severity(parser::Severity::Because)));50                }51              }52            },53        },54        pointerObject.u);55  }56  // From 9.7.3.1(1)57  //   A pointer-object shall not depend on the value,58  //   bounds, or association status of another pointer-59  //   object in the same NULLIFY statement.60  // This restriction is the programmer's responsibility.61  // Some dependencies can be found compile time or at62  // runtime, but for now we choose to skip such checks.63}64} // namespace Fortran::semantics65