11
11
#include " flang/Runtime/descriptor.h"
12
12
#include < algorithm>
13
13
#include < cstring>
14
+ #include < optional>
14
15
15
16
namespace Fortran ::runtime {
16
- extern " C" {
17
17
18
- void RTNAME (Transfer)(Descriptor &result, const Descriptor &source,
19
- const Descriptor &mold, const char *sourceFile, int line) {
20
- if (mold.rank () > 0 ) {
21
- std::size_t moldElementBytes{mold.ElementBytes ()};
22
- std::size_t elements{
23
- (source.Elements () * source.ElementBytes () + moldElementBytes - 1 ) /
24
- moldElementBytes};
25
- return RTNAME (TransferSize)(result, source, mold, sourceFile, line,
26
- static_cast <std::int64_t >(elements));
27
- } else {
28
- return RTNAME (TransferSize)(result, source, mold, sourceFile, line, 1 );
29
- }
30
- }
31
-
32
- void RTNAME (TransferSize)(Descriptor &result, const Descriptor &source,
18
+ static void TransferImpl (Descriptor &result, const Descriptor &source,
33
19
const Descriptor &mold, const char *sourceFile, int line,
34
- std::int64_t size ) {
35
- int rank{mold. rank () > 0 ? 1 : 0 };
20
+ std::optional<std:: int64_t > resultExtent ) {
21
+ int rank{resultExtent. has_value () ? 1 : 0 };
36
22
std::size_t elementBytes{mold.ElementBytes ()};
37
23
result.Establish (mold.type (), elementBytes, nullptr , rank, nullptr ,
38
24
CFI_attribute_allocatable, mold.Addendum () != nullptr );
39
- if (rank > 0 ) {
40
- result.GetDimension (0 ).SetBounds (1 , size );
25
+ if (resultExtent ) {
26
+ result.GetDimension (0 ).SetBounds (1 , *resultExtent );
41
27
}
42
28
if (const DescriptorAddendum * addendum{mold.Addendum ()}) {
43
29
*result.Addendum () = *addendum;
@@ -47,7 +33,7 @@ void RTNAME(TransferSize)(Descriptor &result, const Descriptor &source,
47
33
" TRANSFER: could not allocate memory for result; STAT=%d" , stat);
48
34
}
49
35
char *to{result.OffsetElement <char >()};
50
- std::size_t resultBytes{size * elementBytes };
36
+ std::size_t resultBytes{result. Elements () * result. ElementBytes () };
51
37
const std::size_t sourceElementBytes{source.ElementBytes ()};
52
38
std::size_t sourceElements{source.Elements ()};
53
39
SubscriptValue sourceAt[maxRank];
@@ -65,5 +51,27 @@ void RTNAME(TransferSize)(Descriptor &result, const Descriptor &source,
65
51
}
66
52
}
67
53
54
+ extern " C" {
55
+
56
+ void RTNAME (Transfer)(Descriptor &result, const Descriptor &source,
57
+ const Descriptor &mold, const char *sourceFile, int line) {
58
+ if (mold.rank () > 0 ) {
59
+ std::size_t moldElementBytes{mold.ElementBytes ()};
60
+ std::size_t elements{
61
+ (source.Elements () * source.ElementBytes () + moldElementBytes - 1 ) /
62
+ moldElementBytes};
63
+ return TransferImpl (result, source, mold, sourceFile, line,
64
+ static_cast <std::int64_t >(elements));
65
+ } else {
66
+ return TransferImpl (result, source, mold, sourceFile, line, {});
67
+ }
68
+ }
69
+
70
+ void RTNAME (TransferSize)(Descriptor &result, const Descriptor &source,
71
+ const Descriptor &mold, const char *sourceFile, int line,
72
+ std::int64_t size) {
73
+ return TransferImpl (result, source, mold, sourceFile, line, size);
74
+ }
75
+
68
76
} // extern "C"
69
77
} // namespace Fortran::runtime
0 commit comments