Skip to content

Commit 9d032d4

Browse files
committed
[flang][Evaluate] OperationCode cleanup, fix for Constant<T>
Make the OperationCode overloads take the derived operation instead of the Operation base class instance. This makes them usable from visitors of "Expr<T>.u". Also, fix small bug: OperationCode(Constant<T>) shoud be "Constant".
1 parent f4972a2 commit 9d032d4

File tree

4 files changed

+25
-39
lines changed

4 files changed

+25
-39
lines changed

flang/include/flang/Evaluate/tools.h

Lines changed: 20 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1402,10 +1402,8 @@ using OperatorSet = common::EnumSet<Operator, 32>;
14021402

14031403
std::string ToString(Operator op);
14041404

1405-
template <typename... Ts, int Kind>
1406-
Operator OperationCode(
1407-
const evaluate::Operation<evaluate::LogicalOperation<Kind>, Ts...> &op) {
1408-
switch (op.derived().logicalOperator) {
1405+
template <int Kind> Operator OperationCode(const LogicalOperation<Kind> &op) {
1406+
switch (op.logicalOperator) {
14091407
case common::LogicalOperator::And:
14101408
return Operator::And;
14111409
case common::LogicalOperator::Or:
@@ -1420,10 +1418,8 @@ Operator OperationCode(
14201418
return Operator::Unknown;
14211419
}
14221420

1423-
template <typename T, typename... Ts>
1424-
Operator OperationCode(
1425-
const evaluate::Operation<evaluate::Relational<T>, Ts...> &op) {
1426-
switch (op.derived().opr) {
1421+
template <typename T> Operator OperationCode(const Relational<T> &op) {
1422+
switch (op.opr) {
14271423
case common::RelationalOperator::LT:
14281424
return Operator::Lt;
14291425
case common::RelationalOperator::LE:
@@ -1440,70 +1436,60 @@ Operator OperationCode(
14401436
return Operator::Unknown;
14411437
}
14421438

1443-
template <typename T, typename... Ts>
1444-
Operator OperationCode(const evaluate::Operation<evaluate::Add<T>, Ts...> &op) {
1439+
template <typename T> Operator OperationCode(const Add<T> &op) {
14451440
return Operator::Add;
14461441
}
14471442

1448-
template <typename T, typename... Ts>
1449-
Operator OperationCode(
1450-
const evaluate::Operation<evaluate::Subtract<T>, Ts...> &op) {
1443+
template <typename T> Operator OperationCode(const Subtract<T> &op) {
14511444
return Operator::Sub;
14521445
}
14531446

1454-
template <typename T, typename... Ts>
1455-
Operator OperationCode(
1456-
const evaluate::Operation<evaluate::Multiply<T>, Ts...> &op) {
1447+
template <typename T> Operator OperationCode(const Multiply<T> &op) {
14571448
return Operator::Mul;
14581449
}
14591450

1460-
template <typename T, typename... Ts>
1461-
Operator OperationCode(
1462-
const evaluate::Operation<evaluate::Divide<T>, Ts...> &op) {
1451+
template <typename T> Operator OperationCode(const Divide<T> &op) {
14631452
return Operator::Div;
14641453
}
14651454

1466-
template <typename T, typename... Ts>
1467-
Operator OperationCode(
1468-
const evaluate::Operation<evaluate::Power<T>, Ts...> &op) {
1455+
template <typename T> Operator OperationCode(const Power<T> &op) {
14691456
return Operator::Pow;
14701457
}
14711458

1472-
template <typename T, typename... Ts>
1473-
Operator OperationCode(
1474-
const evaluate::Operation<evaluate::RealToIntPower<T>, Ts...> &op) {
1459+
template <typename T> Operator OperationCode(const RealToIntPower<T> &op) {
14751460
return Operator::Pow;
14761461
}
14771462

1478-
template <typename T, common::TypeCategory C, typename... Ts>
1479-
Operator OperationCode(
1480-
const evaluate::Operation<evaluate::Convert<T, C>, Ts...> &op) {
1463+
template <typename T, common::TypeCategory C>
1464+
Operator OperationCode(const Convert<T, C> &op) {
14811465
if constexpr (C == T::category) {
14821466
return Operator::Resize;
14831467
} else {
14841468
return Operator::Convert;
14851469
}
14861470
}
14871471

1488-
template <typename T, typename... Ts>
1489-
Operator OperationCode(
1490-
const evaluate::Operation<evaluate::Extremum<T>, Ts...> &op) {
1491-
if (op.derived().ordering == evaluate::Ordering::Greater) {
1472+
template <typename T> Operator OperationCode(const Extremum<T> &op) {
1473+
if (op.ordering == Ordering::Greater) {
14921474
return Operator::Max;
14931475
} else {
14941476
return Operator::Min;
14951477
}
14961478
}
14971479

1498-
template <typename T> Operator OperationCode(const evaluate::Constant<T> &x) {
1480+
template <typename T> Operator OperationCode(const Constant<T> &x) {
14991481
return Operator::Constant;
15001482
}
15011483

1484+
template <typename T> Operator OperationCode(const Designator<T> &x) {
1485+
return Operator::Identity;
1486+
}
1487+
15021488
template <typename T> Operator OperationCode(const T &) {
15031489
return Operator::Unknown;
15041490
}
15051491

1506-
Operator OperationCode(const evaluate::ProcedureDesignator &proc);
1492+
Operator OperationCode(const ProcedureDesignator &proc);
15071493

15081494
} // namespace operation
15091495

flang/lib/Evaluate/tools.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1693,17 +1693,17 @@ struct ArgumentExtractor
16931693
// to int(kind=4) for example.
16941694
return (*this)(x.template operand<0>());
16951695
} else {
1696-
return std::make_pair(operation::OperationCode(x),
1696+
return std::make_pair(operation::OperationCode(x.derived()),
16971697
OperationArgs(x, std::index_sequence_for<Os...>{}));
16981698
}
16991699
}
17001700

17011701
template <typename T> Result operator()(const Designator<T> &x) const {
1702-
return {operation::Operator::Identity, {AsSomeExpr(x)}};
1702+
return {operation::OperationCode(x), {AsSomeExpr(x)}};
17031703
}
17041704

17051705
template <typename T> Result operator()(const Constant<T> &x) const {
1706-
return {operation::Operator::Identity, {AsSomeExpr(x)}};
1706+
return {operation::OperationCode(x), {AsSomeExpr(x)}};
17071707
}
17081708

17091709
template <typename... Rs>

flang/test/Semantics/OpenMP/atomic04.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ subroutine more_invalid_atomic_update_stmts()
180180
x = x
181181

182182
!$omp atomic update
183-
!ERROR: The atomic variable x should appear as an argument in the update operation
183+
!ERROR: This is not a valid ATOMIC UPDATE operation
184184
x = 1
185185

186186
!$omp atomic update

flang/test/Semantics/OpenMP/atomic05.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ program OmpAtomic
1919
x = 2 * 4
2020
!ERROR: At most one clause from the 'memory-order' group is allowed on ATOMIC construct
2121
!$omp atomic update release, seq_cst
22-
!ERROR: The atomic variable x should appear as an argument in the update operation
22+
!ERROR: This is not a valid ATOMIC UPDATE operation
2323
x = 10
2424
!ERROR: At most one clause from the 'memory-order' group is allowed on ATOMIC construct
2525
!$omp atomic capture release, seq_cst

0 commit comments

Comments
 (0)