@@ -281,17 +281,43 @@ static void DetermineCopyInOutArgument(
281281 if (actual.isAlternateReturn ()) {
282282 return ;
283283 }
284- const auto *dummyObj =
285- std::get_if<characteristics::DummyDataObject>(&dummy.u );
284+ const auto *dummyObj{
285+ std::get_if<characteristics::DummyDataObject>(&dummy.u )} ;
286286 if (!dummyObj) {
287287 // Only DummyDataObject has the information we need
288288 return ;
289289 }
290+
291+ bool dummyIsValue{
292+ dummyObj->attrs .test (characteristics::DummyDataObject::Attr::Value)};
293+ if (dummyIsValue) {
294+ actual.SetMayNeedCopyIn ();
295+ return ;
296+ }
297+
290298 // Check actual contiguity, unless dummy doesn't care
291- bool actualContiguous =
299+ bool actualTreatAsContiguous{
292300 dummyObj->ignoreTKR .test (common::IgnoreTKR::Contiguous) ||
293- IsSimplyContiguous (actual, sc.foldingContext ());
294- bool actualVectorSubscript = HasVectorSubscript (actual);
301+ IsSimplyContiguous (actual, sc.foldingContext ())};
302+
303+ bool actualHasVectorSubscript{HasVectorSubscript (actual)};
304+ bool actualIsArray{actual.Rank () > 0 };
305+
306+ bool dummyIsArray{dummyObj->type .Rank () > 0 };
307+ bool dummyIsExplicitShape{
308+ dummyIsArray ? IsExplicitShape (*dummyObj->type .shape ()) : false };
309+ bool dummyIsAssumedSize{dummyObj->type .attrs ().test (
310+ characteristics::TypeAndShape::Attr::AssumedSize)};
311+ bool dummyNeedsContiguity{dummyIsArray &&
312+ (dummyIsExplicitShape || dummyIsAssumedSize ||
313+ dummyObj->attrs .test (characteristics::DummyDataObject::Attr::Contiguous))};
314+ if (!actualTreatAsContiguous && dummyNeedsContiguity) {
315+ actual.SetMayNeedCopyIn ();
316+ if (!actualHasVectorSubscript) {
317+ actual.SetMayNeedCopyOut ();
318+ }
319+ }
320+
295321
296322 // TODO
297323}
0 commit comments