mirror of
https://github.com/intel/llvm.git
synced 2026-02-05 13:21:04 +08:00
The standard's specification for the ASSOCIATED() intrinsic function describes its optional second argument (TARGET=) as being required to be a valid target for a pointer assignment statement in which the first argument (POINTER=) was the left-hand side. Some Fortran compilers apparently interpret this text as a requirement that the POINTER= argument actually be a valid left-hand side to a pointer assignment statement, and emit an error if it is not so. This particularly affects the use of an explicit NULL pointer as the first argument. Such usage is well-defined, benign, useful, and supported by at least two other compilers, so we should continue to accept it. This patch adds a portability warning and some documentation. In order to implement the portability warning in the best way, the special checks on calls to the ASSOCIATED() intrinsic function have been moved from intrinsic processing to Semantics/check-calls.cpp, whence they have access to semantics' toolchest. Special checks for other intrinsic functions might also migrate in the future in order to keep them all in one place. Differential Revision: https://reviews.llvm.org/D142768
46 lines
1.6 KiB
C++
46 lines
1.6 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 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
|