Skip to content

Commit 66b0170

Browse files
Review updates
1 parent 8bc59ff commit 66b0170

File tree

9 files changed

+47
-31
lines changed

9 files changed

+47
-31
lines changed

flang/include/flang/Parser/parse-tree.h

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3880,9 +3880,7 @@ struct OmpDeclareMapperSpecifier {
38803880
struct OpenMPDeclareMapperConstruct {
38813881
TUPLE_CLASS_BOILERPLATE(OpenMPDeclareMapperConstruct);
38823882
CharBlock source;
3883-
std::tuple<Verbatim, OmpDeclareMapperSpecifier,
3884-
std::list<std::list<OmpMapClause>>>
3885-
t;
3883+
std::tuple<Verbatim, OmpDeclareMapperSpecifier, OmpClauseList> t;
38863884
};
38873885

38883886
// 2.16 declare-reduction -> DECLARE REDUCTION (reduction-identifier : type-list
@@ -3935,10 +3933,10 @@ struct OpenMPDeclarativeAllocate {
39353933
struct OpenMPDeclarativeConstruct {
39363934
UNION_CLASS_BOILERPLATE(OpenMPDeclarativeConstruct);
39373935
CharBlock source;
3938-
std::variant<OpenMPDeclarativeAllocate, OpenMPDeclareReductionConstruct,
3939-
OpenMPDeclareSimdConstruct, OpenMPDeclareTargetConstruct,
3940-
OpenMPThreadprivate, OpenMPRequiresConstruct,
3941-
OpenMPDeclareMapperConstruct>
3936+
std::variant<OpenMPDeclarativeAllocate, OpenMPDeclareMapperConstruct,
3937+
OpenMPDeclareReductionConstruct, OpenMPDeclareSimdConstruct,
3938+
OpenMPDeclareTargetConstruct, OpenMPThreadprivate,
3939+
OpenMPRequiresConstruct>
39423940
u;
39433941
};
39443942

flang/lib/Parser/openmp-parsers.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -840,11 +840,10 @@ TYPE_PARSER(sourced(construct<OpenMPDeclareTargetConstruct>(
840840
TYPE_PARSER(construct<OmpDeclareMapperSpecifier>(
841841
maybe(name / ":" / !":"_tok), typeSpec / "::", name))
842842

843-
// ?.? (not 4.5) Declare Mapper Construct
844-
TYPE_PARSER(sourced(
845-
construct<OpenMPDeclareMapperConstruct>(verbatim("DECLARE MAPPER"_tok),
846-
"(" >> Parser<OmpDeclareMapperSpecifier>{} / ")",
847-
many("MAP" >> parenthesized(many(Parser<OmpMapClause>{}))))))
843+
// OpenMP 5.2: 5.8.8 Declare Mapper Construct
844+
TYPE_PARSER(sourced(construct<OpenMPDeclareMapperConstruct>(
845+
verbatim("DECLARE MAPPER"_tok),
846+
"(" >> Parser<OmpDeclareMapperSpecifier>{} / ")", Parser<OmpClauseList>{})))
848847

849848
TYPE_PARSER(construct<OmpReductionCombiner>(Parser<AssignmentStmt>{}) ||
850849
construct<OmpReductionCombiner>(

flang/lib/Parser/unparse.cpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2677,14 +2677,7 @@ class UnparseVisitor {
26772677
Walk(std::get<Name>(spec.t));
26782678
Put(")");
26792679

2680-
const auto &list{
2681-
std::get<std::list<std::list<Fortran::parser::OmpMapClause>>>(
2682-
z.t)};
2683-
for (const auto &m : list) {
2684-
Put(" MAP(");
2685-
Walk(m);
2686-
Put(")");
2687-
}
2680+
Walk(std::get<OmpClauseList>(z.t));
26882681
Put("\n");
26892682
return false;
26902683
},

flang/lib/Semantics/check-omp-structure.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1434,6 +1434,26 @@ void OmpStructureChecker::Leave(const parser::OmpDeclareTargetWithClause &x) {
14341434
}
14351435
}
14361436

1437+
void OmpStructureChecker::Enter(const parser::OpenMPDeclareMapperConstruct &x) {
1438+
const auto &dir{std::get<parser::Verbatim>(x.t)};
1439+
PushContextAndClauseSets(
1440+
dir.source, llvm::omp::Directive::OMPD_declare_mapper);
1441+
const auto &spec{std::get<parser::OmpDeclareMapperSpecifier>(x.t)};
1442+
const auto &type = std::get<parser::TypeSpec>(spec.t);
1443+
if (const auto derivedTypeSpec{
1444+
std::get_if<parser::DerivedTypeSpec>(&type.u)}) {
1445+
if (derivedTypeSpec->derivedTypeSpec->typeSymbol().attrs().test(
1446+
Attr::ABSTRACT))
1447+
context_.Say(dir.source, "Type must not be abstract"_err_en_US);
1448+
} else {
1449+
context_.Say(dir.source, "Type is not a derived type"_err_en_US);
1450+
}
1451+
}
1452+
1453+
void OmpStructureChecker::Leave(const parser::OpenMPDeclareMapperConstruct &) {
1454+
dirContext_.pop_back();
1455+
}
1456+
14371457
void OmpStructureChecker::Enter(const parser::OpenMPDeclareTargetConstruct &x) {
14381458
const auto &dir{std::get<parser::Verbatim>(x.t)};
14391459
PushContext(dir.source, llvm::omp::Directive::OMPD_declare_target);

flang/lib/Semantics/check-omp-structure.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ class OmpStructureChecker
9090
void Leave(const parser::OpenMPDeclareSimdConstruct &);
9191
void Enter(const parser::OpenMPDeclarativeAllocate &);
9292
void Leave(const parser::OpenMPDeclarativeAllocate &);
93+
void Enter(const parser::OpenMPDeclareMapperConstruct &);
94+
void Leave(const parser::OpenMPDeclareMapperConstruct &);
9395
void Enter(const parser::OpenMPDeclareTargetConstruct &);
9496
void Leave(const parser::OpenMPDeclareTargetConstruct &);
9597
void Enter(const parser::OpenMPDepobjConstruct &);

flang/lib/Semantics/resolve-directives.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1949,7 +1949,6 @@ bool OmpAttributeVisitor::Pre(const parser::OpenMPDeclareTargetConstruct &x) {
19491949

19501950
bool OmpAttributeVisitor::Pre(const parser::OpenMPDeclareMapperConstruct &x) {
19511951
PushContext(x.source, llvm::omp::Directive::OMPD_declare_mapper);
1952-
19531952
return true;
19541953
}
19551954

flang/lib/Semantics/resolve-names.cpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1058,7 +1058,6 @@ class DeclarationVisitor : public ArraySpecVisitor,
10581058
const parser::Name *ResolveDesignator(const parser::Designator &);
10591059
int GetVectorElementKind(
10601060
TypeCategory category, const std::optional<parser::KindSelector> &kind);
1061-
std::optional<DerivedTypeSpec> ResolveDerivedType(const parser::Name &);
10621061

10631062
protected:
10641063
bool BeginDecl();
@@ -1206,6 +1205,7 @@ class DeclarationVisitor : public ArraySpecVisitor,
12061205
Symbol &DeclareProcEntity(
12071206
const parser::Name &, Attrs, const Symbol *interface);
12081207
void SetType(const parser::Name &, const DeclTypeSpec &);
1208+
std::optional<DerivedTypeSpec> ResolveDerivedType(const parser::Name &);
12091209
std::optional<DerivedTypeSpec> ResolveExtendsType(
12101210
const parser::Name &, const parser::Name *);
12111211
Symbol *MakeTypeSymbol(const SourceName &, Details &&);
@@ -1609,21 +1609,26 @@ void OmpVisitor::Post(const parser::OpenMPBlockConstruct &x) {
16091609
}
16101610
}
16111611

1612+
// This "manually" walks the tree of the cosntruct, because the order
1613+
// elements are resolved by the normal visitor will try to resolve
1614+
// the map clauses attached to the directive without having resolved
1615+
// the type, so the type is figured out using the implicit rules.
16121616
bool OmpVisitor::Pre(const parser::OpenMPDeclareMapperConstruct &x) {
16131617
AddOmpSourceRange(x.source);
16141618
BeginDeclTypeSpec();
16151619
PushScope(Scope::Kind::OtherConstruct, nullptr);
16161620
const auto &spec{std::get<parser::OmpDeclareMapperSpecifier>(x.t)};
1617-
if (const auto &mapperName{
1618-
std::get<std::optional<Fortran::parser::Name>>(spec.t)}) {
1621+
if (const auto &mapperName{std::get<std::optional<parser::Name>>(spec.t)}) {
16191622
Symbol *mapperSym{&MakeSymbol(*mapperName, Attrs{})};
16201623
mapperName->symbol = mapperSym;
1624+
} else if (0) {
1625+
Symbol *mapperSym{&MakeSymbol("default", Attrs{})};
16211626
}
1622-
Walk(std::get<Fortran::parser::TypeSpec>(spec.t));
1623-
const auto &varName{std::get<Fortran::parser::ObjectName>(spec.t)};
1627+
Walk(std::get<parser::TypeSpec>(spec.t));
1628+
const auto &varName{std::get<parser::ObjectName>(spec.t)};
16241629
DeclareObjectEntity(varName);
16251630

1626-
Walk(std::get<std::list<std::list<Fortran::parser::OmpMapClause>>>(x.t));
1631+
Walk(std::get<parser::OmpClauseList>(x.t));
16271632

16281633
EndDeclTypeSpec();
16291634
return false;

flang/test/Lower/OpenMP/Todo/omp-declare-mapper.f90

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
! This test checks lowering of OpenMP declare mapper Directive.
22

33
! RUN: split-file %s %t
4-
! RUN: not %flang_fc1 -emit-fir -fopenmp %t/omp-declare-mapper-1.f90 2>&1 | FileCheck %t/omp-declare-mapper-1.f90
5-
! RUN not %flang_fc1 -emit-fir -fopenmp %t/omp-declare-mapper-2.f90 2>&1 | FileCheck %t/omp-declare-mapper-2.f90
4+
! RUN: not %flang_fc1 -emit-fir -fopenmp -fopenmp-version=50 %t/omp-declare-mapper-1.f90 2>&1 | FileCheck %t/omp-declare-mapper-1.f90
5+
! RUN not %flang_fc1 -emit-fir -fopenmp -fopenmp-version=50 %t/omp-declare-mapper-2.f90 2>&1 | FileCheck %t/omp-declare-mapper-2.f90
66

77
!--- omp-declare-mapper-1.f90
88
subroutine declare_mapper_1

llvm/include/llvm/Frontend/OpenMP/OMP.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -612,8 +612,8 @@ def OMP_Critical : Directive<"critical"> {
612612
let category = CA_Executable;
613613
}
614614
def OMP_DeclareMapper : Directive<"declare mapper"> {
615-
let allowedClauses = [
616-
VersionedClause<OMPC_Map>,
615+
let requiredClauses = [
616+
VersionedClause<OMPC_Map, 50>,
617617
];
618618
let association = AS_None;
619619
let category = CA_Declarative;

0 commit comments

Comments
 (0)