Skip to content

Commit ab7930b

Browse files
authored
[flang] Relax checking of dummy procedures under BIND(C) (#92474)
As was done recently to allow derived types that are not explicitly BIND(C), but meet the requirements of BIND(C), to be acceptable for use in contexts nominally requiring BIND(C), this patch allows procedures that are not explicitly BIND(C) to be used in contexts that nominally require BIND(C) so long as (1) they meet the requirements of BIND(C), and (2) don't use dummy arguments whose implementations may vary under BIND(C), such as VALUE.
1 parent fe2ff54 commit ab7930b

File tree

7 files changed

+361
-204
lines changed

7 files changed

+361
-204
lines changed

flang/include/flang/Semantics/tools.h

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -213,8 +213,7 @@ inline bool IsCUDADeviceContext(const Scope *scope) {
213213
}
214214

215215
inline bool HasCUDAAttr(const Symbol &sym) {
216-
if (const auto *details{
217-
sym.GetUltimate().detailsIf<semantics::ObjectEntityDetails>()}) {
216+
if (const auto *details{sym.GetUltimate().detailsIf<ObjectEntityDetails>()}) {
218217
if (details->cudaDataAttr()) {
219218
return true;
220219
}
@@ -224,17 +223,18 @@ inline bool HasCUDAAttr(const Symbol &sym) {
224223

225224
inline bool NeedCUDAAlloc(const Symbol &sym) {
226225
bool inDeviceSubprogram{IsCUDADeviceContext(&sym.owner())};
227-
if (Fortran::semantics::IsDummy(sym))
226+
if (IsDummy(sym)) {
228227
return false;
229-
if (const auto *details{
230-
sym.GetUltimate().detailsIf<semantics::ObjectEntityDetails>()}) {
228+
}
229+
if (const auto *details{sym.GetUltimate().detailsIf<ObjectEntityDetails>()}) {
231230
if (details->cudaDataAttr() &&
232231
(*details->cudaDataAttr() == common::CUDADataAttr::Device ||
233232
*details->cudaDataAttr() == common::CUDADataAttr::Managed ||
234233
*details->cudaDataAttr() == common::CUDADataAttr::Unified)) {
235234
// Descriptor is allocated on host when in host context.
236-
if (Fortran::semantics::IsAllocatable(sym))
235+
if (IsAllocatable(sym)) {
237236
return inDeviceSubprogram;
237+
}
238238
return true;
239239
}
240240
}
@@ -246,7 +246,7 @@ std::optional<common::CUDADataAttr> GetCUDADataAttr(const Symbol *);
246246

247247
// Return an error if a symbol is not accessible from a scope
248248
std::optional<parser::MessageFormattedText> CheckAccessibleSymbol(
249-
const semantics::Scope &, const Symbol &);
249+
const Scope &, const Symbol &);
250250

251251
// Analysis of image control statements
252252
bool IsImageControlStmt(const parser::ExecutableConstruct &);
@@ -706,14 +706,13 @@ inline const parser::Name *getDesignatorNameIfDataRef(
706706
bool CouldBeDataPointerValuedFunction(const Symbol *);
707707

708708
template <typename R, typename T>
709-
std::optional<R> GetConstExpr(
710-
Fortran::semantics::SemanticsContext &semanticsContext, const T &x) {
711-
using DefaultCharConstantType = Fortran::evaluate::Ascii;
712-
if (const auto *expr{Fortran::semantics::GetExpr(semanticsContext, x)}) {
713-
const auto foldExpr{Fortran::evaluate::Fold(
714-
semanticsContext.foldingContext(), Fortran::common::Clone(*expr))};
709+
std::optional<R> GetConstExpr(SemanticsContext &semanticsContext, const T &x) {
710+
using DefaultCharConstantType = evaluate::Ascii;
711+
if (const auto *expr{GetExpr(semanticsContext, x)}) {
712+
const auto foldExpr{evaluate::Fold(
713+
semanticsContext.foldingContext(), common::Clone(*expr))};
715714
if constexpr (std::is_same_v<R, std::string>) {
716-
return Fortran::evaluate::GetScalarConstantValue<DefaultCharConstantType>(
715+
return evaluate::GetScalarConstantValue<DefaultCharConstantType>(
717716
foldExpr);
718717
}
719718
}

0 commit comments

Comments
 (0)