Skip to content

Commit 1f30465

Browse files
committed
Allow passing to intrinsic
1 parent 256a11e commit 1f30465

File tree

1 file changed

+12
-4
lines changed

1 file changed

+12
-4
lines changed

flang/lib/Semantics/check-call.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,18 @@ namespace Fortran::semantics {
2929
// Raise warnings for some dangerous context of passing global variables
3030
// - any variable from common blocks except
3131
// - 1-element arrays being single member of COMMON
32+
// - passed to intrinsic
3233
// - avy variable from module except
3334
// - having attribute PARAMETER or PRIVATE
3435
// - having DERIVED type
36+
// - passed to intrinsic
3537
// - being arrays having 1-D rank and is not having ALLOCATABLE or POINTER or
3638
// VOLATILE attributes
3739
static void CheckPassGlobalVariable(
3840
const evaluate::Expr<evaluate::SomeType> &actual,
3941
const parser::ContextualMessages &messages, SemanticsContext &context,
40-
evaluate::FoldingContext &foldingContext) {
42+
evaluate::FoldingContext &foldingContext,
43+
const evaluate::SpecificIntrinsic *intrinsic) {
4144
const Symbol *actualFirstSymbol{evaluate::GetFirstSymbol(actual)};
4245
if (actualFirstSymbol) {
4346
bool warn{false};
@@ -47,7 +50,9 @@ static void CheckPassGlobalVariable(
4750
const Symbol *common{FindCommonBlockContaining(*actualFirstSymbol)};
4851
ownerType = "COMMON";
4952
ownerName = common->name().ToString();
50-
if (!(actualFirstSymbol->Rank() == 1 &&
53+
if (intrinsic) {
54+
warn |= false;
55+
} else if (!(actualFirstSymbol->Rank() == 1 &&
5156
actualFirstSymbol->offset() == 0)) {
5257
warn |= true;
5358
} else if (actualFirstSymbol->Rank() == 1) {
@@ -79,6 +84,8 @@ static void CheckPassGlobalVariable(
7984
actualFirstSymbol, foldingContext)};
8085
type->type().category() == TypeCategory::Derived) {
8186
warn |= false;
87+
} else if (intrinsic) {
88+
warn |= false;
8289
} else if (actualFirstSymbol->Rank() != 1) {
8390
warn |= true;
8491
} else if (!actualFirstSymbol->attrs().test(Attr::ALLOCATABLE) &&
@@ -201,7 +208,8 @@ static void CheckImplicitInterfaceArg(evaluate::ActualArgument &arg,
201208
}
202209

203210
if (const auto *expr{arg.UnwrapExpr()}) {
204-
CheckPassGlobalVariable(*expr, messages, context, foldingContext);
211+
CheckPassGlobalVariable(*expr, messages, context, foldingContext,
212+
/*intrinsic=*/nullptr);
205213
}
206214
}
207215

@@ -1239,7 +1247,7 @@ static void CheckExplicitDataArg(const characteristics::DummyDataObject &dummy,
12391247
"%VAL argument must be a scalar numeric or logical expression"_err_en_US);
12401248
}
12411249

1242-
CheckPassGlobalVariable(actual, messages, context, foldingContext);
1250+
CheckPassGlobalVariable(actual, messages, context, foldingContext, intrinsic);
12431251
}
12441252

12451253
static void CheckProcedureArg(evaluate::ActualArgument &arg,

0 commit comments

Comments
 (0)