Skip to content

Commit ff295d2

Browse files
authored
[OpenMP][clang] declare mapper: fix handling of nested types (#143504)
Fix a crash that happened during parsing of a "declare mapper" construct for a struct that contains an element for which we also declared a custom default mapper.
1 parent 42595d3 commit ff295d2

File tree

4 files changed

+61
-4
lines changed

4 files changed

+61
-4
lines changed

clang/include/clang/Sema/SemaOpenMP.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ class SemaOpenMP : public SemaBase {
283283
/// mapper' construct.
284284
QualType ActOnOpenMPDeclareMapperType(SourceLocation TyLoc,
285285
TypeResult ParsedType);
286-
/// Called on start of '#pragma omp declare mapper'.
286+
/// Called for '#pragma omp declare mapper'.
287287
DeclGroupPtrTy ActOnOpenMPDeclareMapperDirective(
288288
Scope *S, DeclContext *DC, DeclarationName Name, QualType MapperType,
289289
SourceLocation StartLoc, DeclarationName VN, AccessSpecifier AS,

clang/lib/Parse/ParseOpenMP.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,7 @@ Parser::ParseOpenMPDeclareMapperDirective(AccessSpecifier AS) {
576576
return DeclGroupPtrTy();
577577
}
578578

579+
Scope *OuterScope = getCurScope();
579580
// Enter scope.
580581
DeclarationNameInfo DirName;
581582
SourceLocation Loc = Tok.getLocation();
@@ -614,12 +615,17 @@ Parser::ParseOpenMPDeclareMapperDirective(AccessSpecifier AS) {
614615
IsCorrect = false;
615616
}
616617

618+
// This needs to be called within the scope because
619+
// processImplicitMapsWithDefaultMappers may add clauses when analyzing nested
620+
// types. The scope used for calling ActOnOpenMPDeclareMapperDirective,
621+
// however, needs to be the outer one, otherwise declared mappers don't become
622+
// visible.
623+
DeclGroupPtrTy DG = Actions.OpenMP().ActOnOpenMPDeclareMapperDirective(
624+
OuterScope, Actions.getCurLexicalContext(), MapperId, MapperType,
625+
Range.getBegin(), VName, AS, MapperVarRef.get(), Clauses);
617626
// Exit scope.
618627
Actions.OpenMP().EndOpenMPDSABlock(nullptr);
619628
OMPDirectiveScope.Exit();
620-
DeclGroupPtrTy DG = Actions.OpenMP().ActOnOpenMPDeclareMapperDirective(
621-
getCurScope(), Actions.getCurLexicalContext(), MapperId, MapperType,
622-
Range.getBegin(), VName, AS, MapperVarRef.get(), Clauses);
623629
if (!IsCorrect)
624630
return DeclGroupPtrTy();
625631

clang/test/OpenMP/declare_mapper_ast_print.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,23 @@ struct dat {
4949
#pragma omp declare mapper(struct dat d) map(to: d.d)
5050
// CHECK: #pragma omp declare mapper (default : struct dat d) map(to: d.d){{$}}
5151

52+
// Verify that nested default mappers do not lead to a crash during parsing / sema.
53+
// CHECK: struct inner {
54+
struct inner {
55+
int size;
56+
int *data;
57+
};
58+
#pragma omp declare mapper(struct inner i) map(i, i.data[0 : i.size])
59+
// CHECK: #pragma omp declare mapper (default : struct inner i) map(tofrom: default::i,i.data[0:i.size]){{$}}
60+
61+
// CHECK: struct outer {
62+
struct outer {
63+
int a;
64+
struct inner i;
65+
};
66+
#pragma omp declare mapper(struct outer o) map(o)
67+
// CHECK: #pragma omp declare mapper (default : struct outer o) map(tofrom: default::o) map(tofrom: o.i){{$}}
68+
5269
// CHECK: int main(void) {
5370
int main(void) {
5471
#pragma omp declare mapper(id: struct vec v) map(v.len)
@@ -77,6 +94,14 @@ int main(void) {
7794
#pragma omp declare mapper(id1: struct vec vvec) map(iterator(it=0:vvec.len:2), tofrom:vvec.data[it])
7895
// OMP52: #pragma omp declare mapper (id1 : struct vec vvec) map(iterator(int it = 0:vvec.len:2),tofrom: vvec.data[it]);
7996
#endif
97+
98+
{
99+
struct outer outer;
100+
#pragma omp target map(outer)
101+
// CHECK: #pragma omp target map(tofrom: outer)
102+
{ }
103+
}
104+
80105
return 0;
81106
}
82107
// CHECK: }

clang/test/OpenMP/declare_mapper_ast_print.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,28 @@ class vecchild : public vec {
3434
// CHECK: }
3535
// CHECK: ;
3636

37+
// Verify that nested default mappers do not lead to a crash during parsing / sema.
38+
// CHECK: namespace N2 {
39+
namespace N2
40+
{
41+
// CHECK: struct inner {
42+
struct inner {
43+
int size;
44+
int *data;
45+
};
46+
#pragma omp declare mapper(struct inner i) map(i, i.data[0 : i.size])
47+
// CHECK: #pragma omp declare mapper (default : struct inner i) map(tofrom: N2::default::i,i.data[0:i.size]){{$}}
48+
49+
// CHECK: struct outer {
50+
struct outer {
51+
int a;
52+
struct inner i;
53+
};
54+
#pragma omp declare mapper(struct outer o) map(o)
55+
// CHECK: #pragma omp declare mapper (default : struct outer o) map(tofrom: N2::default::o) map(tofrom: o.i){{$}}
56+
} // namespace N2
57+
// CHECK: }
58+
3759
template <class T>
3860
class dat {
3961
public:
@@ -122,6 +144,7 @@ T foo(T a) {
122144
int main() {
123145
N1::vec vv, vvv;
124146
N1::vecchild vc;
147+
N2::outer outer;
125148
dat<double> dd;
126149
#pragma omp target map(mapper(N1::id) tofrom: vv) map(mapper(dat<double>::id) alloc: vvv)
127150
// CHECK: #pragma omp target map(mapper(N1::id),tofrom: vv) map(mapper(dat<double>::id),alloc: vvv)
@@ -132,6 +155,9 @@ int main() {
132155
#pragma omp target map(mapper(default) tofrom: dd)
133156
// CHECK: #pragma omp target map(mapper(default),tofrom: dd)
134157
{ dd.d++; }
158+
#pragma omp target map(outer)
159+
// CHECK: #pragma omp target map(tofrom: outer)
160+
{ }
135161

136162
#pragma omp target update to(mapper(N1::id) : vc)
137163
// CHECK: #pragma omp target update to(mapper(N1::id): vc)

0 commit comments

Comments
 (0)