|
13 | 13 | #include "flang/Parser/parse-tree.h" |
14 | 14 | #include "flang/Semantics/expression.h" |
15 | 15 | #include "flang/Semantics/openmp-modifiers.h" |
| 16 | +#include "flang/Semantics/openmp-utils.h" |
16 | 17 | #include "flang/Semantics/symbol.h" |
17 | 18 |
|
18 | 19 | #include <list> |
@@ -128,6 +129,11 @@ Object makeObject(const parser::OmpObject &object, |
128 | 129 | return makeObject(std::get<parser::Designator>(object.u), semaCtx); |
129 | 130 | } |
130 | 131 |
|
| 132 | +Object makeObject(const parser::EntityDecl &decl, |
| 133 | + semantics::SemanticsContext &semaCtx) { |
| 134 | + return makeObject(std::get<parser::ObjectName>(decl.t), semaCtx); |
| 135 | +} |
| 136 | + |
131 | 137 | ObjectList makeObjects(const parser::OmpArgumentList &objects, |
132 | 138 | semantics::SemanticsContext &semaCtx) { |
133 | 139 | return makeList(objects.v, [&](const parser::OmpArgument &arg) { |
@@ -275,12 +281,10 @@ makeIteratorSpecifiers(const parser::OmpIteratorSpecifier &inp, |
275 | 281 | auto &tds = std::get<parser::TypeDeclarationStmt>(inp.t); |
276 | 282 | auto &entities = std::get<std::list<parser::EntityDecl>>(tds.t); |
277 | 283 | for (const parser::EntityDecl &ed : entities) { |
278 | | - auto &name = std::get<parser::ObjectName>(ed.t); |
279 | | - assert(name.symbol && "Expecting symbol for iterator variable"); |
280 | | - auto *stype = name.symbol->GetType(); |
281 | | - assert(stype && "Expecting symbol type"); |
282 | | - IteratorSpecifier spec{{evaluate::DynamicType::From(*stype), |
283 | | - makeObject(name, semaCtx), range}}; |
| 284 | + auto *symbol = std::get<parser::ObjectName>(ed.t).symbol; |
| 285 | + auto *type = DEREF(symbol).GetType(); |
| 286 | + IteratorSpecifier spec{{evaluate::DynamicType::From(DEREF(type)), |
| 287 | + makeObject(ed, semaCtx), range}}; |
284 | 288 | specifiers.emplace_back(std::move(spec)); |
285 | 289 | } |
286 | 290 |
|
@@ -983,19 +987,24 @@ Initializer make(const parser::OmpClause::Initializer &inp, |
983 | 987 | semantics::SemanticsContext &semaCtx) { |
984 | 988 | const parser::OmpInitializerExpression &iexpr = inp.v.v; |
985 | 989 | Initializer initializer; |
986 | | - for (const parser::OmpStylizedInstance &styleInstance : iexpr.v) { |
987 | | - auto &instance = |
988 | | - std::get<parser::OmpStylizedInstance::Instance>(styleInstance.t); |
989 | | - if (const auto *as = std::get_if<parser::AssignmentStmt>(&instance.u)) { |
990 | | - auto &expr = std::get<parser::Expr>(as->t); |
991 | | - initializer.v.push_back(makeExpr(expr, semaCtx)); |
992 | | - } else if (const auto *call = std::get_if<parser::CallStmt>(&instance.u)) { |
993 | | - assert(call->typedCall && "Expecting typedCall"); |
994 | | - const auto &procRef = *call->typedCall; |
995 | | - initializer.v.push_back(semantics::SomeExpr(procRef)); |
996 | | - } else { |
997 | | - llvm_unreachable("Unexpected initializer"); |
998 | | - } |
| 990 | + |
| 991 | + for (const parser::OmpStylizedInstance &sinst : iexpr.v) { |
| 992 | + ObjectList variables; |
| 993 | + llvm::transform( |
| 994 | + std::get<std::list<parser::OmpStylizedDeclaration>>(sinst.t), |
| 995 | + std::back_inserter(variables), |
| 996 | + [&](const parser::OmpStylizedDeclaration &s) { |
| 997 | + return makeObject(s.var, semaCtx); |
| 998 | + }); |
| 999 | + |
| 1000 | + SomeExpr instance = [&]() { |
| 1001 | + if (auto &&expr = semantics::omp::MakeEvaluateExpr(sinst)) |
| 1002 | + return std::move(*expr); |
| 1003 | + llvm_unreachable("Expecting expression instance"); |
| 1004 | + }(); |
| 1005 | + |
| 1006 | + initializer.v.push_back( |
| 1007 | + StylizedInstance{{std::move(variables), std::move(instance)}}); |
999 | 1008 | } |
1000 | 1009 |
|
1001 | 1010 | return initializer; |
|
0 commit comments