Skip to content

Commit daecc8e

Browse files
TIFitisraghavendhra
authored andcommitted
[OpenMP][Flang] Fix semantic check and scoping for declare mappers (llvm#140560)
The current semantic check in place is incorrect, this patch fixes this. Up to 1 **'default'** named mapper should be allowed for each derived type. The current semantic check only allows up to 1 **'default'** named mapper across all derived types. This also makes sure that declare mappers follow proper scoping rules for both default and named mappers. Co-authored-by: Raghu Maddhipatla <Raghu.Maddhipatla@amd.com>
1 parent 25c513c commit daecc8e

File tree

12 files changed

+158
-57
lines changed

12 files changed

+158
-57
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3540,7 +3540,7 @@ WRAPPER_CLASS(OmpLocatorList, std::list<OmpLocator>);
35403540
struct OmpMapperSpecifier {
35413541
// Absent mapper-identifier is equivalent to DEFAULT.
35423542
TUPLE_CLASS_BOILERPLATE(OmpMapperSpecifier);
3543-
std::tuple<std::optional<Name>, TypeSpec, Name> t;
3543+
std::tuple<std::string, TypeSpec, Name> t;
35443544
};
35453545

35463546
// Ref: [4.5:222:1-5], [5.0:305:20-27], [5.1:337:11-19], [5.2:139:18-23],

flang/lib/Lower/OpenMP/ClauseProcessor.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1148,9 +1148,9 @@ void ClauseProcessor::processMapObjects(
11481148
typeSpec = &object.sym()->GetType()->derivedTypeSpec();
11491149

11501150
if (typeSpec) {
1151-
mapperIdName = typeSpec->name().ToString() + ".default";
1152-
mapperIdName =
1153-
converter.mangleName(mapperIdName, *typeSpec->GetScope());
1151+
mapperIdName = typeSpec->name().ToString() + ".omp.default.mapper";
1152+
if (auto *sym = converter.getCurrentScope().FindSymbol(mapperIdName))
1153+
mapperIdName = converter.mangleName(mapperIdName, sym->owner());
11541154
}
11551155
}
11561156
};

flang/lib/Lower/OpenMP/OpenMP.cpp

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2422,8 +2422,10 @@ genTargetOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
24222422
mlir::FlatSymbolRefAttr mapperId;
24232423
if (sym.GetType()->category() == semantics::DeclTypeSpec::TypeDerived) {
24242424
auto &typeSpec = sym.GetType()->derivedTypeSpec();
2425-
std::string mapperIdName = typeSpec.name().ToString() + ".default";
2426-
mapperIdName = converter.mangleName(mapperIdName, *typeSpec.GetScope());
2425+
std::string mapperIdName =
2426+
typeSpec.name().ToString() + ".omp.default.mapper";
2427+
if (auto *sym = converter.getCurrentScope().FindSymbol(mapperIdName))
2428+
mapperIdName = converter.mangleName(mapperIdName, sym->owner());
24272429
if (converter.getModuleOp().lookupSymbol(mapperIdName))
24282430
mapperId = mlir::FlatSymbolRefAttr::get(&converter.getMLIRContext(),
24292431
mapperIdName);
@@ -4006,24 +4008,16 @@ genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
40064008
lower::StatementContext stmtCtx;
40074009
const auto &spec =
40084010
std::get<parser::OmpMapperSpecifier>(declareMapperConstruct.t);
4009-
const auto &mapperName{std::get<std::optional<parser::Name>>(spec.t)};
4011+
const auto &mapperName{std::get<std::string>(spec.t)};
40104012
const auto &varType{std::get<parser::TypeSpec>(spec.t)};
40114013
const auto &varName{std::get<parser::Name>(spec.t)};
40124014
assert(varType.declTypeSpec->category() ==
40134015
semantics::DeclTypeSpec::Category::TypeDerived &&
40144016
"Expected derived type");
40154017

4016-
std::string mapperNameStr;
4017-
if (mapperName.has_value()) {
4018-
mapperNameStr = mapperName->ToString();
4019-
mapperNameStr =
4020-
converter.mangleName(mapperNameStr, mapperName->symbol->owner());
4021-
} else {
4022-
mapperNameStr =
4023-
varType.declTypeSpec->derivedTypeSpec().name().ToString() + ".default";
4024-
mapperNameStr = converter.mangleName(
4025-
mapperNameStr, *varType.declTypeSpec->derivedTypeSpec().GetScope());
4026-
}
4018+
std::string mapperNameStr = mapperName;
4019+
if (auto *sym = converter.getCurrentScope().FindSymbol(mapperNameStr))
4020+
mapperNameStr = converter.mangleName(mapperNameStr, sym->owner());
40274021

40284022
// Save current insertion point before moving to the module scope to create
40294023
// the DeclareMapperOp

flang/lib/Parser/openmp-parsers.cpp

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1389,8 +1389,28 @@ TYPE_PARSER(
13891389
TYPE_PARSER(sourced(construct<OpenMPDeclareTargetConstruct>(
13901390
verbatim("DECLARE TARGET"_tok), Parser<OmpDeclareTargetSpecifier>{})))
13911391

1392+
static OmpMapperSpecifier ConstructOmpMapperSpecifier(
1393+
std::optional<Name> &&mapperName, TypeSpec &&typeSpec, Name &&varName) {
1394+
// If a name is present, parse: name ":" typeSpec "::" name
1395+
// This matches the syntax: <mapper-name> : <type-spec> :: <variable-name>
1396+
if (mapperName.has_value() && mapperName->ToString() != "default") {
1397+
return OmpMapperSpecifier{
1398+
mapperName->ToString(), std::move(typeSpec), std::move(varName)};
1399+
}
1400+
// If the name is missing, use the DerivedTypeSpec name to construct the
1401+
// default mapper name.
1402+
// This matches the syntax: <type-spec> :: <variable-name>
1403+
if (DerivedTypeSpec * derived{std::get_if<DerivedTypeSpec>(&typeSpec.u)}) {
1404+
return OmpMapperSpecifier{
1405+
std::get<Name>(derived->t).ToString() + ".omp.default.mapper",
1406+
std::move(typeSpec), std::move(varName)};
1407+
}
1408+
return OmpMapperSpecifier{std::string("omp.default.mapper"),
1409+
std::move(typeSpec), std::move(varName)};
1410+
}
1411+
13921412
// mapper-specifier
1393-
TYPE_PARSER(construct<OmpMapperSpecifier>(
1413+
TYPE_PARSER(applyFunction<OmpMapperSpecifier>(ConstructOmpMapperSpecifier,
13941414
maybe(name / ":" / !":"_tok), typeSpec / "::", name))
13951415

13961416
// OpenMP 5.2: 5.8.8 Declare Mapper Construct

flang/lib/Parser/unparse.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2093,7 +2093,11 @@ class UnparseVisitor {
20932093
Walk(x.v, ",");
20942094
}
20952095
void Unparse(const OmpMapperSpecifier &x) {
2096-
Walk(std::get<std::optional<Name>>(x.t), ":");
2096+
const auto &mapperName{std::get<std::string>(x.t)};
2097+
if (mapperName.find("omp.default.mapper") == std::string::npos) {
2098+
Walk(mapperName);
2099+
Put(":");
2100+
}
20972101
Walk(std::get<TypeSpec>(x.t));
20982102
Put("::");
20992103
Walk(std::get<Name>(x.t));
@@ -2796,8 +2800,9 @@ class UnparseVisitor {
27962800
BeginOpenMP();
27972801
Word("!$OMP DECLARE MAPPER (");
27982802
const auto &spec{std::get<OmpMapperSpecifier>(z.t)};
2799-
if (auto mapname{std::get<std::optional<Name>>(spec.t)}) {
2800-
Walk(mapname);
2803+
const auto &mapperName{std::get<std::string>(spec.t)};
2804+
if (mapperName.find("omp.default.mapper") == std::string::npos) {
2805+
Walk(mapperName);
28012806
Put(":");
28022807
}
28032808
Walk(std::get<TypeSpec>(spec.t));

flang/lib/Semantics/resolve-names.cpp

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1766,15 +1766,9 @@ void OmpVisitor::ProcessMapperSpecifier(const parser::OmpMapperSpecifier &spec,
17661766
// just following the natural flow, the map clauses gets processed before
17671767
// the type has been fully processed.
17681768
BeginDeclTypeSpec();
1769-
if (auto &mapperName{std::get<std::optional<parser::Name>>(spec.t)}) {
1770-
mapperName->symbol =
1771-
&MakeSymbol(*mapperName, MiscDetails{MiscDetails::Kind::ConstructName});
1772-
} else {
1773-
const parser::CharBlock defaultName{"default", 7};
1774-
MakeSymbol(
1775-
defaultName, Attrs{}, MiscDetails{MiscDetails::Kind::ConstructName});
1776-
}
1777-
1769+
auto &mapperName{std::get<std::string>(spec.t)};
1770+
MakeSymbol(parser::CharBlock(mapperName), Attrs{},
1771+
MiscDetails{MiscDetails::Kind::ConstructName});
17781772
PushScope(Scope::Kind::OtherConstruct, nullptr);
17791773
Walk(std::get<parser::TypeSpec>(spec.t));
17801774
auto &varName{std::get<parser::Name>(spec.t)};

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

Lines changed: 93 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 %t/omp-declare-mapper-2.f90 -o - | FileCheck %t/omp-declare-mapper-2.f90
66
! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 %t/omp-declare-mapper-3.f90 -o - | FileCheck %t/omp-declare-mapper-3.f90
77
! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 %t/omp-declare-mapper-4.f90 -o - | FileCheck %t/omp-declare-mapper-4.f90
8+
! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 %t/omp-declare-mapper-5.f90 -o - | FileCheck %t/omp-declare-mapper-5.f90
89

910
!--- omp-declare-mapper-1.f90
1011
subroutine declare_mapper_1
@@ -22,7 +23,7 @@ subroutine declare_mapper_1
2223
end type
2324
type(my_type2) :: t
2425
real :: x, y(nvals)
25-
!CHECK:omp.declare_mapper @[[MY_TYPE_MAPPER:_QQFdeclare_mapper_1my_type\.default]] : [[MY_TYPE:!fir\.type<_QFdeclare_mapper_1Tmy_type\{num_vals:i32,values:!fir\.box<!fir\.heap<!fir\.array<\?xi32>>>\}>]] {
26+
!CHECK:omp.declare_mapper @[[MY_TYPE_MAPPER:_QQFdeclare_mapper_1my_type\.omp\.default\.mapper]] : [[MY_TYPE:!fir\.type<_QFdeclare_mapper_1Tmy_type\{num_vals:i32,values:!fir\.box<!fir\.heap<!fir\.array<\?xi32>>>\}>]] {
2627
!CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<[[MY_TYPE]]>):
2728
!CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0]] {uniq_name = "_QFdeclare_mapper_1Evar"} : (!fir.ref<[[MY_TYPE]]>) -> (!fir.ref<[[MY_TYPE]]>, !fir.ref<[[MY_TYPE]]>)
2829
!CHECK: %[[VAL_2:.*]] = hlfir.designate %[[VAL_1]]#0{"values"} {fortran_attrs = #fir.var_attrs<allocatable>} : (!fir.ref<[[MY_TYPE]]>) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
@@ -149,7 +150,7 @@ subroutine declare_mapper_4
149150
integer :: num
150151
end type
151152

152-
!CHECK: omp.declare_mapper @[[MY_TYPE_MAPPER:_QQFdeclare_mapper_4my_type.default]] : [[MY_TYPE:!fir\.type<_QFdeclare_mapper_4Tmy_type\{num:i32\}>]]
153+
!CHECK: omp.declare_mapper @[[MY_TYPE_MAPPER:_QQFdeclare_mapper_4my_type.omp.default.mapper]] : [[MY_TYPE:!fir\.type<_QFdeclare_mapper_4Tmy_type\{num:i32\}>]]
153154
!$omp declare mapper (my_type :: var) map (var%num)
154155

155156
type(my_type) :: a
@@ -171,3 +172,93 @@ subroutine declare_mapper_4
171172
a%num = 40
172173
!$omp end target
173174
end subroutine declare_mapper_4
175+
176+
!--- omp-declare-mapper-5.f90
177+
program declare_mapper_5
178+
implicit none
179+
180+
type :: mytype
181+
integer :: x, y
182+
end type
183+
184+
!CHECK: omp.declare_mapper @[[INNER_MAPPER_NAMED:_QQFFuse_innermy_mapper]] : [[MY_TYPE:!fir\.type<_QFTmytype\{x:i32,y:i32\}>]]
185+
!CHECK: omp.declare_mapper @[[INNER_MAPPER_DEFAULT:_QQFFuse_innermytype.omp.default.mapper]] : [[MY_TYPE]]
186+
!CHECK: omp.declare_mapper @[[OUTER_MAPPER_NAMED:_QQFmy_mapper]] : [[MY_TYPE]]
187+
!CHECK: omp.declare_mapper @[[OUTER_MAPPER_DEFAULT:_QQFmytype.omp.default.mapper]] : [[MY_TYPE]]
188+
!$omp declare mapper(mytype :: var) map(tofrom: var%x)
189+
!$omp declare mapper(my_mapper : mytype :: var) map(tofrom: var%y)
190+
191+
type(mytype) :: a
192+
193+
!CHECK: %{{.*}} = omp.map.info var_ptr(%{{.*}}#1 : !fir.ref<[[MY_TYPE]]>, [[MY_TYPE]]) map_clauses(implicit, tofrom) capture(ByRef) mapper(@[[OUTER_MAPPER_DEFAULT]]) -> !fir.ref<[[MY_TYPE]]> {name = "a"}
194+
!$omp target
195+
a%x = 10
196+
!$omp end target
197+
198+
!CHECK: %{{.*}} = omp.map.info var_ptr(%{{.*}}#1 : !fir.ref<[[MY_TYPE]]>, [[MY_TYPE]]) map_clauses(tofrom) capture(ByRef) mapper(@[[OUTER_MAPPER_DEFAULT]]) -> !fir.ref<[[MY_TYPE]]> {name = "a"}
199+
!$omp target map(a)
200+
a%x = 10
201+
!$omp end target
202+
203+
!CHECK: %{{.*}} = omp.map.info var_ptr(%{{.*}}#1 : !fir.ref<[[MY_TYPE]]>, [[MY_TYPE]]) map_clauses(tofrom) capture(ByRef) mapper(@[[OUTER_MAPPER_DEFAULT]]) -> !fir.ref<[[MY_TYPE]]> {name = "a"}
204+
!$omp target map(mapper(default) : a)
205+
a%x = 10
206+
!$omp end target
207+
208+
!CHECK: %{{.*}} = omp.map.info var_ptr(%{{.*}}#1 : !fir.ref<[[MY_TYPE]]>, [[MY_TYPE]]) map_clauses(tofrom) capture(ByRef) mapper(@[[OUTER_MAPPER_NAMED]]) -> !fir.ref<[[MY_TYPE]]> {name = "a"}
209+
!$omp target map(mapper(my_mapper) : a)
210+
a%y = 10
211+
!$omp end target
212+
213+
contains
214+
subroutine use_outer()
215+
type(mytype) :: a
216+
217+
!CHECK: %{{.*}} = omp.map.info var_ptr(%{{.*}}#1 : !fir.ref<[[MY_TYPE]]>, [[MY_TYPE]]) map_clauses(implicit, tofrom) capture(ByRef) mapper(@[[OUTER_MAPPER_DEFAULT]]) -> !fir.ref<[[MY_TYPE]]> {name = "a"}
218+
!$omp target
219+
a%x = 10
220+
!$omp end target
221+
222+
!CHECK: %{{.*}} = omp.map.info var_ptr(%{{.*}}#1 : !fir.ref<[[MY_TYPE]]>, [[MY_TYPE]]) map_clauses(tofrom) capture(ByRef) mapper(@[[OUTER_MAPPER_DEFAULT]]) -> !fir.ref<[[MY_TYPE]]> {name = "a"}
223+
!$omp target map(a)
224+
a%x = 10
225+
!$omp end target
226+
227+
!CHECK: %{{.*}} = omp.map.info var_ptr(%{{.*}}#1 : !fir.ref<[[MY_TYPE]]>, [[MY_TYPE]]) map_clauses(tofrom) capture(ByRef) mapper(@[[OUTER_MAPPER_DEFAULT]]) -> !fir.ref<[[MY_TYPE]]> {name = "a"}
228+
!$omp target map(mapper(default) : a)
229+
a%x = 10
230+
!$omp end target
231+
232+
!CHECK: %{{.*}} = omp.map.info var_ptr(%{{.*}}#1 : !fir.ref<[[MY_TYPE]]>, [[MY_TYPE]]) map_clauses(tofrom) capture(ByRef) mapper(@[[OUTER_MAPPER_NAMED]]) -> !fir.ref<[[MY_TYPE]]> {name = "a"}
233+
!$omp target map(mapper(my_mapper) : a)
234+
a%y = 10
235+
!$omp end target
236+
end subroutine
237+
238+
subroutine use_inner()
239+
!$omp declare mapper(mytype :: var) map(tofrom: var%x)
240+
!$omp declare mapper(my_mapper : mytype :: var) map(tofrom: var%y)
241+
242+
type(mytype) :: a
243+
244+
!CHECK: %{{.*}} = omp.map.info var_ptr(%{{.*}}#1 : !fir.ref<[[MY_TYPE]]>, [[MY_TYPE]]) map_clauses(implicit, tofrom) capture(ByRef) mapper(@[[INNER_MAPPER_DEFAULT]]) -> !fir.ref<[[MY_TYPE]]> {name = "a"}
245+
!$omp target
246+
a%x = 10
247+
!$omp end target
248+
249+
!CHECK: %{{.*}} = omp.map.info var_ptr(%{{.*}}#1 : !fir.ref<[[MY_TYPE]]>, [[MY_TYPE]]) map_clauses(tofrom) capture(ByRef) mapper(@[[INNER_MAPPER_DEFAULT]]) -> !fir.ref<[[MY_TYPE]]> {name = "a"}
250+
!$omp target map(a)
251+
a%x = 10
252+
!$omp end target
253+
254+
!CHECK: %{{.*}} = omp.map.info var_ptr(%{{.*}}#1 : !fir.ref<[[MY_TYPE]]>, [[MY_TYPE]]) map_clauses(tofrom) capture(ByRef) mapper(@[[INNER_MAPPER_DEFAULT]]) -> !fir.ref<[[MY_TYPE]]> {name = "a"}
255+
!$omp target map(mapper(default) : a)
256+
a%x = 10
257+
!$omp end target
258+
259+
!CHECK: %{{.*}} = omp.map.info var_ptr(%{{.*}}#1 : !fir.ref<[[MY_TYPE]]>, [[MY_TYPE]]) map_clauses(tofrom) capture(ByRef) mapper(@[[INNER_MAPPER_NAMED]]) -> !fir.ref<[[MY_TYPE]]> {name = "a"}
260+
!$omp target map(mapper(my_mapper) : a)
261+
a%y = 10
262+
!$omp end target
263+
end subroutine
264+
end program declare_mapper_5

flang/test/Lower/OpenMP/map-mapper.f90

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ program p
88
!$omp declare mapper(xx : t1 :: nn) map(to: nn, nn%x)
99
!$omp declare mapper(t1 :: nn) map(from: nn)
1010

11-
!CHECK-LABEL: omp.declare_mapper @_QQFt1.default : !fir.type<_QFTt1{x:!fir.array<256xi32>}>
11+
!CHECK-LABEL: omp.declare_mapper @_QQFt1.omp.default.mapper : !fir.type<_QFTt1{x:!fir.array<256xi32>}>
1212
!CHECK-LABEL: omp.declare_mapper @_QQFxx : !fir.type<_QFTt1{x:!fir.array<256xi32>}>
1313

1414
type(t1) :: a, b
@@ -20,7 +20,7 @@ program p
2020
end do
2121
!$omp end target
2222

23-
!CHECK: %[[MAP_B:.*]] = omp.map.info var_ptr(%{{.*}} : {{.*}}, {{.*}}) map_clauses(tofrom) capture(ByRef) mapper(@_QQFt1.default) -> {{.*}} {name = "b"}
23+
!CHECK: %[[MAP_B:.*]] = omp.map.info var_ptr(%{{.*}} : {{.*}}, {{.*}}) map_clauses(tofrom) capture(ByRef) mapper(@_QQFt1.omp.default.mapper) -> {{.*}} {name = "b"}
2424
!CHECK: omp.target map_entries(%[[MAP_B]] -> %{{.*}}, %{{.*}} -> %{{.*}} : {{.*}}, {{.*}}) {
2525
!$omp target map(mapper(default) : b)
2626
do i = 1, n

flang/test/Parser/OpenMP/declare-mapper-unparse.f90

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,36 +7,37 @@ program main
77
type ty
88
integer :: x
99
end type ty
10-
10+
1111

1212
!CHECK: !$OMP DECLARE MAPPER (mymapper:ty::mapped) MAP(mapped,mapped%x)
1313
!$omp declare mapper(mymapper : ty :: mapped) map(mapped, mapped%x)
1414

1515
!PARSE-TREE: OpenMPDeclareMapperConstruct
1616
!PARSE-TREE: OmpMapperSpecifier
17-
!PARSE-TREE: Name = 'mymapper'
17+
!PARSE-TREE: string = 'mymapper'
1818
!PARSE-TREE: TypeSpec -> DerivedTypeSpec
1919
!PARSE-TREE: Name = 'ty'
20-
!PARSE-TREE: Name = 'mapped'
20+
!PARSE-TREE: Name = 'mapped'
2121
!PARSE-TREE: OmpMapClause
2222
!PARSE-TREE: OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'mapped'
2323
!PARSE-TREE: OmpObject -> Designator -> DataRef -> StructureComponent
2424
!PARSE-TREE: DataRef -> Name = 'mapped'
25-
!PARSE-TREE: Name = 'x'
25+
!PARSE-TREE: Name = 'x'
2626

2727
!CHECK: !$OMP DECLARE MAPPER (ty::mapped) MAP(mapped,mapped%x)
2828
!$omp declare mapper(ty :: mapped) map(mapped, mapped%x)
29-
29+
3030
!PARSE-TREE: OpenMPDeclareMapperConstruct
3131
!PARSE-TREE: OmpMapperSpecifier
32+
!PARSE-TREE: string = 'ty.omp.default.mapper'
3233
!PARSE-TREE: TypeSpec -> DerivedTypeSpec
3334
!PARSE-TREE: Name = 'ty'
34-
!PARSE-TREE: Name = 'mapped'
35+
!PARSE-TREE: Name = 'mapped'
3536
!PARSE-TREE: OmpMapClause
3637
!PARSE-TREE: OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'mapped'
3738
!PARSE-TREE: OmpObject -> Designator -> DataRef -> StructureComponent
3839
!PARSE-TREE: DataRef -> Name = 'mapped'
3940
!PARSE-TREE: Name = 'x'
40-
41+
4142
end program main
4243
!CHECK-LABEL: end program main

flang/test/Parser/OpenMP/metadirective-dirspec.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ subroutine f02
7878
!PARSE-TREE: | | OmpDirectiveSpecification
7979
!PARSE-TREE: | | | OmpDirectiveName -> llvm::omp::Directive = declare mapper
8080
!PARSE-TREE: | | | OmpArgumentList -> OmpArgument -> OmpMapperSpecifier
81-
!PARSE-TREE: | | | | Name = 'mymapper'
81+
!PARSE-TREE: | | | | string = 'mymapper'
8282
!PARSE-TREE: | | | | TypeSpec -> IntrinsicTypeSpec -> IntegerTypeSpec ->
8383
!PARSE-TREE: | | | | Name = 'v'
8484
!PARSE-TREE: | | | OmpClauseList -> OmpClause -> Map -> OmpMapClause

flang/test/Semantics/OpenMP/declare-mapper-symbols.f90

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,23 @@
22

33
program main
44
!CHECK-LABEL: MainProgram scope: main
5-
implicit none
5+
implicit none
66

7-
type ty
8-
integer :: x
9-
end type ty
10-
!$omp declare mapper(mymapper : ty :: mapped) map(mapped, mapped%x)
11-
!$omp declare mapper(ty :: maptwo) map(maptwo, maptwo%x)
7+
type ty
8+
integer :: x
9+
end type ty
10+
!$omp declare mapper(mymapper : ty :: mapped) map(mapped, mapped%x)
11+
!$omp declare mapper(ty :: maptwo) map(maptwo, maptwo%x)
1212

1313
!! Note, symbols come out in their respective scope, but not in declaration order.
14-
!CHECK: default: Misc ConstructName
1514
!CHECK: mymapper: Misc ConstructName
1615
!CHECK: ty: DerivedType components: x
16+
!CHECK: ty.omp.default.mapper: Misc ConstructName
1717
!CHECK: DerivedType scope: ty
1818
!CHECK: OtherConstruct scope:
1919
!CHECK: mapped (OmpMapToFrom) {{.*}} ObjectEntity type: TYPE(ty)
20-
!CHECK: OtherConstruct scope:
20+
!CHECK: OtherConstruct scope:
2121
!CHECK: maptwo (OmpMapToFrom) {{.*}} ObjectEntity type: TYPE(ty)
22-
22+
2323
end program main
2424

flang/test/Semantics/OpenMP/declare-mapper03.f90

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,8 @@
55
integer :: y
66
end type t1
77

8-
type :: t2
9-
real :: y, z
10-
end type t2
11-
128
!error: 'default' is already declared in this scoping unit
139

1410
!$omp declare mapper(t1::x) map(x, x%y)
15-
!$omp declare mapper(t2::w) map(w, w%y, w%z)
11+
!$omp declare mapper(t1::x) map(x)
1612
end

0 commit comments

Comments
 (0)