When a scope declares the name and perhaps some characteristics of an external subprogram using any of the many means that Fortran supplies for doing such a thing, and that external subprogram's definition is available, check the local declaration against the external definition. In particular, if the global definition's interface cannot be called by means of an implicit interface, ensure that references are via an explicit and compatible interface. Further, extend call site checking so that when a local declaration exists for a known global symbol and the arguments are valid for that local declaration, the arguments are checked against the global's interface, just are is already done when no local declaration exists. Differential Revision: https://reviews.llvm.org/D139042
53 lines
2.0 KiB
C++
53 lines
2.0 KiB
C++
//===-- lib/Semantics/check-call.h ------------------------------*- C++ -*-===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// Constraint checking for procedure references
|
|
|
|
#ifndef FORTRAN_SEMANTICS_CHECK_CALL_H_
|
|
#define FORTRAN_SEMANTICS_CHECK_CALL_H_
|
|
|
|
#include "flang/Evaluate/call.h"
|
|
|
|
namespace Fortran::parser {
|
|
class Messages;
|
|
class ContextualMessages;
|
|
} // namespace Fortran::parser
|
|
namespace Fortran::evaluate::characteristics {
|
|
struct Procedure;
|
|
}
|
|
namespace Fortran::evaluate {
|
|
class FoldingContext;
|
|
}
|
|
|
|
namespace Fortran::semantics {
|
|
class Scope;
|
|
|
|
// Argument treatingExternalAsImplicit should be true when the called procedure
|
|
// does not actually have an explicit interface at the call site, but
|
|
// its characteristics are known because it is a subroutine or function
|
|
// defined at the top level in the same source file. Returns false if
|
|
// messages were created, true if all is well.
|
|
bool CheckArguments(const evaluate::characteristics::Procedure &,
|
|
evaluate::ActualArguments &, evaluate::FoldingContext &, const Scope &,
|
|
bool treatingExternalAsImplicit,
|
|
const evaluate::SpecificIntrinsic *intrinsic);
|
|
|
|
// Checks actual arguments against a procedure with an explicit interface.
|
|
// Reports a buffer of errors when not compatible.
|
|
parser::Messages CheckExplicitInterface(
|
|
const evaluate::characteristics::Procedure &, evaluate::ActualArguments &,
|
|
const evaluate::FoldingContext &, const Scope &,
|
|
const evaluate::SpecificIntrinsic *intrinsic);
|
|
|
|
// Checks actual arguments for the purpose of resolving a generic interface.
|
|
bool CheckInterfaceForGeneric(const evaluate::characteristics::Procedure &,
|
|
evaluate::ActualArguments &, const evaluate::FoldingContext &,
|
|
bool allowActualArgumentConversions = false);
|
|
} // namespace Fortran::semantics
|
|
#endif
|