@@ -223,10 +223,13 @@ enum class LogicalReduction { All, Any, Parity };
223223template <LogicalReduction REDUCTION> class LogicalAccumulator {
224224public:
225225 using Type = bool ;
226- explicit LogicalAccumulator (const Descriptor &array) : array_{array} {}
227- void Reinitialize () { result_ = REDUCTION == LogicalReduction::All; }
228- bool Result () const { return result_; }
229- bool Accumulate (bool x) {
226+ RT_API_ATTRS explicit LogicalAccumulator (const Descriptor &array)
227+ : array_{array} {}
228+ RT_API_ATTRS void Reinitialize () {
229+ result_ = REDUCTION == LogicalReduction::All;
230+ }
231+ RT_API_ATTRS bool Result () const { return result_; }
232+ RT_API_ATTRS bool Accumulate (bool x) {
230233 if constexpr (REDUCTION == LogicalReduction::Parity) {
231234 result_ = result_ != x;
232235 } else if (x != (REDUCTION == LogicalReduction::All)) {
@@ -236,7 +239,7 @@ template <LogicalReduction REDUCTION> class LogicalAccumulator {
236239 return true ;
237240 }
238241 template <typename IGNORED = void >
239- bool AccumulateAt (const SubscriptValue at[]) {
242+ RT_API_ATTRS bool AccumulateAt (const SubscriptValue at[]) {
240243 return Accumulate (IsLogicalElementTrue (array_, at));
241244 }
242245
@@ -246,9 +249,9 @@ template <LogicalReduction REDUCTION> class LogicalAccumulator {
246249};
247250
248251template <typename ACCUMULATOR>
249- inline auto GetTotalLogicalReduction (const Descriptor &x, const char *source ,
250- int line, int dim, ACCUMULATOR &&accumulator, const char *intrinsic) ->
251- typename ACCUMULATOR::Type {
252+ RT_API_ATTRS inline auto GetTotalLogicalReduction (const Descriptor &x,
253+ const char *source, int line, int dim, ACCUMULATOR &&accumulator,
254+ const char *intrinsic) -> typename ACCUMULATOR::Type {
252255 Terminator terminator{source, line};
253256 if (dim < 0 || dim > 1 ) {
254257 terminator.Crash (" %s: bad DIM=%d for ARRAY with rank=1" , intrinsic, dim);
@@ -264,8 +267,9 @@ inline auto GetTotalLogicalReduction(const Descriptor &x, const char *source,
264267}
265268
266269template <typename ACCUMULATOR>
267- inline auto ReduceLogicalDimToScalar (const Descriptor &x, int zeroBasedDim,
268- SubscriptValue subscripts[]) -> typename ACCUMULATOR::Type {
270+ RT_API_ATTRS inline auto ReduceLogicalDimToScalar (
271+ const Descriptor &x, int zeroBasedDim, SubscriptValue subscripts[]) ->
272+ typename ACCUMULATOR::Type {
269273 ACCUMULATOR accumulator{x};
270274 SubscriptValue xAt[maxRank];
271275 GetExpandedSubscripts (xAt, x, zeroBasedDim, subscripts);
@@ -282,8 +286,8 @@ inline auto ReduceLogicalDimToScalar(const Descriptor &x, int zeroBasedDim,
282286
283287template <LogicalReduction REDUCTION> struct LogicalReduceHelper {
284288 template <int KIND> struct Functor {
285- void operator ()(Descriptor &result, const Descriptor &x, int dim ,
286- Terminator &terminator, const char *intrinsic) const {
289+ RT_API_ATTRS void operator ()(Descriptor &result, const Descriptor &x,
290+ int dim, Terminator &terminator, const char *intrinsic) const {
287291 // Standard requires result to have same LOGICAL kind as argument.
288292 CreatePartialReductionResult (
289293 result, x, x.ElementBytes (), dim, terminator, intrinsic, x.type ());
@@ -301,8 +305,9 @@ template <LogicalReduction REDUCTION> struct LogicalReduceHelper {
301305};
302306
303307template <LogicalReduction REDUCTION>
304- inline void DoReduceLogicalDimension (Descriptor &result, const Descriptor &x,
305- int dim, Terminator &terminator, const char *intrinsic) {
308+ RT_API_ATTRS inline void DoReduceLogicalDimension (Descriptor &result,
309+ const Descriptor &x, int dim, Terminator &terminator,
310+ const char *intrinsic) {
306311 auto catKind{x.type ().GetCategoryAndKind ()};
307312 RUNTIME_CHECK (terminator, catKind && catKind->first == TypeCategory::Logical);
308313 ApplyLogicalKind<LogicalReduceHelper<REDUCTION>::template Functor, void >(
@@ -314,11 +319,12 @@ inline void DoReduceLogicalDimension(Descriptor &result, const Descriptor &x,
314319class CountAccumulator {
315320public:
316321 using Type = std::int64_t ;
317- explicit CountAccumulator (const Descriptor &array) : array_{array} {}
318- void Reinitialize () { result_ = 0 ; }
319- Type Result () const { return result_; }
322+ RT_API_ATTRS explicit CountAccumulator (const Descriptor &array)
323+ : array_{array} {}
324+ RT_API_ATTRS void Reinitialize () { result_ = 0 ; }
325+ RT_API_ATTRS Type Result () const { return result_; }
320326 template <typename IGNORED = void >
321- bool AccumulateAt (const SubscriptValue at[]) {
327+ RT_API_ATTRS bool AccumulateAt (const SubscriptValue at[]) {
322328 if (IsLogicalElementTrue (array_, at)) {
323329 ++result_;
324330 }
@@ -331,7 +337,7 @@ class CountAccumulator {
331337};
332338
333339template <int KIND> struct CountDimension {
334- void operator ()(Descriptor &result, const Descriptor &x, int dim,
340+ RT_API_ATTRS void operator ()(Descriptor &result, const Descriptor &x, int dim,
335341 Terminator &terminator) const {
336342 // Element size of the descriptor descriptor is the size
337343 // of {TypeCategory::Integer, KIND}.
0 commit comments