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