Skip to content

Commit 0698c9f

Browse files
committed
OpenMP: Handle 'all' as category in defaultmap
Both, specifying no category and specifying 'all', implies that the implicit-behavior applies to all categories. gcc/c/ChangeLog: * c-parser.cc (c_parser_omp_clause_defaultmap): Parse 'all' as category. gcc/cp/ChangeLog: * parser.cc (cp_parser_omp_clause_defaultmap): Parse 'all' as category. gcc/fortran/ChangeLog: * gfortran.h (enum gfc_omp_defaultmap_category): Add OMP_DEFAULTMAP_CAT_ALL. * openmp.cc (gfc_match_omp_clauses): Parse 'all' as category. * trans-openmp.cc (gfc_trans_omp_clauses): Handle it. gcc/ChangeLog: * tree-core.h (enum omp_clause_defaultmap_kind): Add OMP_CLAUSE_DEFAULTMAP_CATEGORY_ALL. * gimplify.cc (gimplify_scan_omp_clauses): Handle it. * tree-pretty-print.cc (dump_omp_clause): Likewise. libgomp/ChangeLog: * libgomp.texi (OpenMP 5.2 status): Add depobj with destroy-var argument as 'N'. Mark defaultmap with 'all' category as 'Y'. gcc/testsuite/ChangeLog: * gfortran.dg/gomp/defaultmap-1.f90: Update dg-error. * c-c++-common/gomp/defaultmap-5.c: New test. * c-c++-common/gomp/defaultmap-6.c: New test. * gfortran.dg/gomp/defaultmap-10.f90: New test. * gfortran.dg/gomp/defaultmap-9.f90: New test.
1 parent 145da6a commit 0698c9f

File tree

14 files changed

+334
-13
lines changed

14 files changed

+334
-13
lines changed

gcc/c/c-parser.cc

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15067,8 +15067,8 @@ c_parser_omp_clause_defaultmap (c_parser *parser, tree list)
1506715067
if (!c_parser_next_token_is (parser, CPP_NAME))
1506815068
{
1506915069
invalid_category:
15070-
c_parser_error (parser, "expected %<scalar%>, %<aggregate%> or "
15071-
"%<pointer%>");
15070+
c_parser_error (parser, "expected %<scalar%>, %<aggregate%>, "
15071+
"%<pointer%> or %<all%>");
1507215072
goto out_err;
1507315073
}
1507415074
p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
@@ -15077,6 +15077,8 @@ c_parser_omp_clause_defaultmap (c_parser *parser, tree list)
1507715077
case 'a':
1507815078
if (strcmp ("aggregate", p) == 0)
1507915079
category = OMP_CLAUSE_DEFAULTMAP_CATEGORY_AGGREGATE;
15080+
else if (strcmp ("all", p) == 0)
15081+
category = OMP_CLAUSE_DEFAULTMAP_CATEGORY_ALL;
1508015082
else
1508115083
goto invalid_category;
1508215084
break;
@@ -15106,20 +15108,29 @@ c_parser_omp_clause_defaultmap (c_parser *parser, tree list)
1510615108
for (c = list; c ; c = OMP_CLAUSE_CHAIN (c))
1510715109
if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_DEFAULTMAP
1510815110
&& (category == OMP_CLAUSE_DEFAULTMAP_CATEGORY_UNSPECIFIED
15111+
|| category == OMP_CLAUSE_DEFAULTMAP_CATEGORY_ALL
1510915112
|| OMP_CLAUSE_DEFAULTMAP_CATEGORY (c) == category
1511015113
|| (OMP_CLAUSE_DEFAULTMAP_CATEGORY (c)
15111-
== OMP_CLAUSE_DEFAULTMAP_CATEGORY_UNSPECIFIED)))
15114+
== OMP_CLAUSE_DEFAULTMAP_CATEGORY_UNSPECIFIED)
15115+
|| (OMP_CLAUSE_DEFAULTMAP_CATEGORY (c)
15116+
== OMP_CLAUSE_DEFAULTMAP_CATEGORY_ALL)))
1511215117
{
1511315118
enum omp_clause_defaultmap_kind cat = category;
1511415119
location_t loc = OMP_CLAUSE_LOCATION (c);
15115-
if (cat == OMP_CLAUSE_DEFAULTMAP_CATEGORY_UNSPECIFIED)
15120+
if (cat == OMP_CLAUSE_DEFAULTMAP_CATEGORY_UNSPECIFIED
15121+
|| (cat == OMP_CLAUSE_DEFAULTMAP_CATEGORY_ALL
15122+
&& (OMP_CLAUSE_DEFAULTMAP_CATEGORY (c)
15123+
!= OMP_CLAUSE_DEFAULTMAP_CATEGORY_UNSPECIFIED)))
1511615124
cat = OMP_CLAUSE_DEFAULTMAP_CATEGORY (c);
1511715125
p = NULL;
1511815126
switch (cat)
1511915127
{
1512015128
case OMP_CLAUSE_DEFAULTMAP_CATEGORY_UNSPECIFIED:
1512115129
p = NULL;
1512215130
break;
15131+
case OMP_CLAUSE_DEFAULTMAP_CATEGORY_ALL:
15132+
p = "all";
15133+
break;
1512315134
case OMP_CLAUSE_DEFAULTMAP_CATEGORY_AGGREGATE:
1512415135
p = "aggregate";
1512515136
break;

gcc/cp/parser.cc

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38810,8 +38810,8 @@ cp_parser_omp_clause_defaultmap (cp_parser *parser, tree list,
3881038810
if (!cp_lexer_next_token_is (parser->lexer, CPP_NAME))
3881138811
{
3881238812
invalid_category:
38813-
cp_parser_error (parser, "expected %<scalar%>, %<aggregate%> or "
38814-
"%<pointer%>");
38813+
cp_parser_error (parser, "expected %<scalar%>, %<aggregate%>, "
38814+
"%<all%>");
3881538815
goto out_err;
3881638816
}
3881738817
id = cp_lexer_peek_token (parser->lexer)->u.value;
@@ -38822,6 +38822,8 @@ cp_parser_omp_clause_defaultmap (cp_parser *parser, tree list,
3882238822
case 'a':
3882338823
if (strcmp ("aggregate", p) == 0)
3882438824
category = OMP_CLAUSE_DEFAULTMAP_CATEGORY_AGGREGATE;
38825+
else if (strcmp ("all", p) == 0)
38826+
category = OMP_CLAUSE_DEFAULTMAP_CATEGORY_ALL;
3882538827
else
3882638828
goto invalid_category;
3882738829
break;
@@ -38852,20 +38854,29 @@ cp_parser_omp_clause_defaultmap (cp_parser *parser, tree list,
3885238854
for (c = list; c ; c = OMP_CLAUSE_CHAIN (c))
3885338855
if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_DEFAULTMAP
3885438856
&& (category == OMP_CLAUSE_DEFAULTMAP_CATEGORY_UNSPECIFIED
38857+
|| category == OMP_CLAUSE_DEFAULTMAP_CATEGORY_ALL
3885538858
|| OMP_CLAUSE_DEFAULTMAP_CATEGORY (c) == category
3885638859
|| (OMP_CLAUSE_DEFAULTMAP_CATEGORY (c)
38857-
== OMP_CLAUSE_DEFAULTMAP_CATEGORY_UNSPECIFIED)))
38860+
== OMP_CLAUSE_DEFAULTMAP_CATEGORY_UNSPECIFIED)
38861+
|| (OMP_CLAUSE_DEFAULTMAP_CATEGORY (c)
38862+
== OMP_CLAUSE_DEFAULTMAP_CATEGORY_ALL)))
3885838863
{
3885938864
enum omp_clause_defaultmap_kind cat = category;
3886038865
location_t loc = OMP_CLAUSE_LOCATION (c);
38861-
if (cat == OMP_CLAUSE_DEFAULTMAP_CATEGORY_UNSPECIFIED)
38866+
if (cat == OMP_CLAUSE_DEFAULTMAP_CATEGORY_UNSPECIFIED
38867+
|| (cat == OMP_CLAUSE_DEFAULTMAP_CATEGORY_ALL
38868+
&& (OMP_CLAUSE_DEFAULTMAP_CATEGORY (c)
38869+
!= OMP_CLAUSE_DEFAULTMAP_CATEGORY_UNSPECIFIED)))
3886238870
cat = OMP_CLAUSE_DEFAULTMAP_CATEGORY (c);
3886338871
p = NULL;
3886438872
switch (cat)
3886538873
{
3886638874
case OMP_CLAUSE_DEFAULTMAP_CATEGORY_UNSPECIFIED:
3886738875
p = NULL;
3886838876
break;
38877+
case OMP_CLAUSE_DEFAULTMAP_CATEGORY_ALL:
38878+
p = "all";
38879+
break;
3886938880
case OMP_CLAUSE_DEFAULTMAP_CATEGORY_AGGREGATE:
3887038881
p = "aggregate";
3887138882
break;

gcc/fortran/gfortran.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1334,6 +1334,7 @@ enum gfc_omp_defaultmap
13341334
enum gfc_omp_defaultmap_category
13351335
{
13361336
OMP_DEFAULTMAP_CAT_UNCATEGORIZED,
1337+
OMP_DEFAULTMAP_CAT_ALL,
13371338
OMP_DEFAULTMAP_CAT_SCALAR,
13381339
OMP_DEFAULTMAP_CAT_AGGREGATE,
13391340
OMP_DEFAULTMAP_CAT_ALLOCATABLE,

gcc/fortran/openmp.cc

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2250,24 +2250,30 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask,
22502250
category = OMP_DEFAULTMAP_CAT_ALLOCATABLE;
22512251
else if (gfc_match ("pointer ") == MATCH_YES)
22522252
category = OMP_DEFAULTMAP_CAT_POINTER;
2253+
else if (gfc_match ("all ") == MATCH_YES)
2254+
category = OMP_DEFAULTMAP_CAT_ALL;
22532255
else
22542256
{
2255-
gfc_error ("Expected SCALAR, AGGREGATE, ALLOCATABLE or "
2256-
"POINTER at %C");
2257+
gfc_error ("Expected SCALAR, AGGREGATE, ALLOCATABLE, "
2258+
"POINTER or ALL at %C");
22572259
break;
22582260
}
22592261
}
22602262
for (int i = 0; i < OMP_DEFAULTMAP_CAT_NUM; ++i)
22612263
{
22622264
if (i != category
2263-
&& category != OMP_DEFAULTMAP_CAT_UNCATEGORIZED)
2265+
&& category != OMP_DEFAULTMAP_CAT_UNCATEGORIZED
2266+
&& category != OMP_DEFAULTMAP_CAT_ALL
2267+
&& i != OMP_DEFAULTMAP_CAT_UNCATEGORIZED
2268+
&& i != OMP_DEFAULTMAP_CAT_ALL)
22642269
continue;
22652270
if (c->defaultmap[i] != OMP_DEFAULTMAP_UNSET)
22662271
{
22672272
const char *pcategory = NULL;
22682273
switch (i)
22692274
{
22702275
case OMP_DEFAULTMAP_CAT_UNCATEGORIZED: break;
2276+
case OMP_DEFAULTMAP_CAT_ALL: pcategory = "ALL"; break;
22712277
case OMP_DEFAULTMAP_CAT_SCALAR: pcategory = "SCALAR"; break;
22722278
case OMP_DEFAULTMAP_CAT_AGGREGATE:
22732279
pcategory = "AGGREGATE";

gcc/fortran/trans-openmp.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4443,6 +4443,9 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses,
44434443
case OMP_DEFAULTMAP_CAT_UNCATEGORIZED:
44444444
category = OMP_CLAUSE_DEFAULTMAP_CATEGORY_UNSPECIFIED;
44454445
break;
4446+
case OMP_DEFAULTMAP_CAT_ALL:
4447+
category = OMP_CLAUSE_DEFAULTMAP_CATEGORY_ALL;
4448+
break;
44464449
case OMP_DEFAULTMAP_CAT_SCALAR:
44474450
category = OMP_CLAUSE_DEFAULTMAP_CATEGORY_SCALAR;
44484451
break;

gcc/gimplify.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12037,6 +12037,7 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p,
1203712037
switch (OMP_CLAUSE_DEFAULTMAP_CATEGORY (c))
1203812038
{
1203912039
case OMP_CLAUSE_DEFAULTMAP_CATEGORY_UNSPECIFIED:
12040+
case OMP_CLAUSE_DEFAULTMAP_CATEGORY_ALL:
1204012041
gdmkmin = GDMK_SCALAR;
1204112042
gdmkmax = GDMK_POINTER;
1204212043
break;
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/* { dg-additional-options "-fdump-tree-original -fdump-tree-gimple" } */
2+
3+
void f()
4+
{
5+
struct s {
6+
int i;
7+
};
8+
int scalar1 = 5;
9+
int array1[5] = {1,2,3,4,5};
10+
int *ptr1 = &scalar1;
11+
struct s mystruct1 = {.i = 5};
12+
13+
/* firstprivate + unspecified modifer. */
14+
#pragma omp target defaultmap(firstprivate)
15+
{
16+
scalar1 = 1;
17+
array1[0] = 2;
18+
if (ptr1 == 0L)
19+
mystruct1.i = 3;
20+
}
21+
22+
/* equivalent: firstprivate + ALL modifer. */
23+
#pragma omp target defaultmap(firstprivate : all)
24+
{
25+
scalar1 = 1;
26+
array1[0] = 2;
27+
if (ptr1 == 0L)
28+
mystruct1.i = 3;
29+
}
30+
31+
/* tofrom + ALL modifer. */
32+
#pragma omp target defaultmap(tofrom : all)
33+
{
34+
scalar1 = 1;
35+
array1[0] = 2;
36+
if (ptr1 == 0L)
37+
mystruct1.i = 3;
38+
}
39+
}
40+
41+
/* { dg-final { scan-tree-dump-times "#pragma omp target defaultmap\\(firstprivate\\)" 1 "original" } } */
42+
/* { dg-final { scan-tree-dump-times "#pragma omp target defaultmap\\(firstprivate:all\\)" 1 "original" } } */
43+
/* { dg-final { scan-tree-dump-times "#pragma omp target defaultmap\\(tofrom:all\\)" 1 "original" } } */
44+
45+
/* { dg-final { scan-tree-dump-times "#pragma omp target.* defaultmap\\(firstprivate\\) firstprivate\\(mystruct1\\) firstprivate\\(ptr1\\) firstprivate\\(array1\\) firstprivate\\(scalar1\\)" 1 "gimple" } } */
46+
/* { dg-final { scan-tree-dump-times "#pragma omp target.* defaultmap\\(firstprivate:all\\) firstprivate\\(mystruct1\\) firstprivate\\(ptr1\\) firstprivate\\(array1\\) firstprivate\\(scalar1\\)" 1 "gimple" } } */
47+
/* { dg-final { scan-tree-dump-times "#pragma omp target.* defaultmap\\(tofrom:all\\) map\\(tofrom:mystruct1 \\\[len: .\\\]\\\[implicit\\\]\\) map\\(tofrom:ptr1 \\\[len: .\\\]\\\[implicit\\\]\\) map\\(tofrom:array1 \\\[len: ..\\\]\\\[implicit\\\]\\) map\\(tofrom:scalar1 \\\[len: .\\\]\\\[implicit\\\]\\)" 1 "gimple" } } */
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
void f()
2+
{
3+
struct s {
4+
int i;
5+
};
6+
int scalar1 = 5;
7+
int array1[5] = {1,2,3,4,5};
8+
int *ptr1 = &scalar1;
9+
struct s mystruct1 = {.i = 5};
10+
11+
#pragma omp target defaultmap(firstprivate ) defaultmap(firstprivate : aggregate) /* { dg-error "too many 'defaultmap' clauses with 'aggregate' category" } */
12+
{
13+
scalar1 = 1; array1[0] = 2; if (ptr1 == 0L) mystruct1.i = 3;
14+
}
15+
16+
#pragma omp target defaultmap(firstprivate : all ) defaultmap(alloc : pointer) /* { dg-error "too many 'defaultmap' clauses with 'pointer' category" } */
17+
{
18+
scalar1 = 1; array1[0] = 2; if (ptr1 == 0L) mystruct1.i = 3;
19+
}
20+
21+
22+
#pragma omp target defaultmap(firstprivate : aggregate) defaultmap(firstprivate ) /* { dg-error "too many 'defaultmap' clauses with 'aggregate' category" } */
23+
{
24+
scalar1 = 1; array1[0] = 2; if (ptr1 == 0L) mystruct1.i = 3;
25+
}
26+
27+
#pragma omp target defaultmap(alloc : pointer) defaultmap(firstprivate : all ) /* { dg-error "too many 'defaultmap' clauses with 'pointer' category" } */
28+
{
29+
scalar1 = 1; array1[0] = 2; if (ptr1 == 0L) mystruct1.i = 3;
30+
}
31+
32+
#pragma omp target defaultmap(firstprivate :all ) defaultmap(firstprivate : all) /* { dg-error "too many 'defaultmap' clauses with 'all' category" } */
33+
{
34+
scalar1 = 1; array1[0] = 2; if (ptr1 == 0L) mystruct1.i = 3;
35+
}
36+
#pragma omp target defaultmap(firstprivate ) defaultmap(firstprivate) /* { dg-error "too many 'defaultmap' clauses with unspecified category" } */
37+
{
38+
scalar1 = 1; array1[0] = 2; if (ptr1 == 0L) mystruct1.i = 3;
39+
}
40+
#pragma omp target defaultmap(firstprivate ) defaultmap(firstprivate : all) /* { dg-error "too many 'defaultmap' clauses with 'all' category" } */
41+
{
42+
scalar1 = 1; array1[0] = 2; if (ptr1 == 0L) mystruct1.i = 3;
43+
}
44+
#pragma omp target defaultmap(firstprivate : all) defaultmap(firstprivate) /* { dg-error "too many 'defaultmap' clauses with 'all' category" } */
45+
{
46+
scalar1 = 1; array1[0] = 2; if (ptr1 == 0L) mystruct1.i = 3;
47+
}
48+
}

gcc/testsuite/gfortran.dg/gomp/defaultmap-1.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
!$omp target defaultmap(bar) ! { dg-error "25: Expected ALLOC, TO, FROM, TOFROM, FIRSTPRIVATE, PRESENT, NONE or DEFAULT" }
66

7-
!$omp target defaultmap ( alloc: foo) ! { dg-error "34: Expected SCALAR, AGGREGATE, ALLOCATABLE or POINTER" }
7+
!$omp target defaultmap ( alloc: foo) ! { dg-error "34: Expected SCALAR, AGGREGATE, ALLOCATABLE, POINTER or ALL" }
88

99
!$omp target defaultmap(alloc:scalar) defaultmap(none:Scalar) ! { dg-error "DEFAULTMAP at .1. but prior DEFAULTMAP for category SCALAR" }
1010

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
subroutine f
2+
implicit none
3+
type t
4+
integer :: i
5+
end type t
6+
integer, target :: scalar
7+
integer, target :: array(5)
8+
integer, pointer :: ptr1, ptr2(:)
9+
integer, allocatable :: alloc1, alloc2(:)
10+
type(t) :: agg1, agg2(2)
11+
12+
scalar = 1
13+
array = [1,2,3,4,5]
14+
ptr1 => scalar
15+
ptr2 => array
16+
alloc1 = 5
17+
alloc2 = [1,2]
18+
agg1%i = 1
19+
agg2(:)%i = [1,2]
20+
21+
!$omp target defaultmap(firstprivate ) defaultmap(firstprivate : aggregate) ! { dg-error "DEFAULTMAP at .1. but prior DEFAULTMAP with unspecified category" }
22+
block
23+
scalar = 1;
24+
array(1) = 2;
25+
if (associated(ptr1)) &
26+
agg1%i = 3;
27+
if (associated(ptr2)) &
28+
agg2(1)%i = 3;
29+
if (allocated(alloc1)) &
30+
alloc2(1) = 0
31+
end block
32+
33+
!$omp target defaultmap(firstprivate : all ) defaultmap(alloc : pointer) ! { dg-error "DEFAULTMAP at .1. but prior DEFAULTMAP for category ALL" }
34+
block
35+
scalar = 1;
36+
array(1) = 2;
37+
if (associated(ptr1)) &
38+
agg1%i = 3;
39+
if (associated(ptr2)) &
40+
agg2(1)%i = 3;
41+
if (allocated(alloc1)) &
42+
alloc2(1) = 0
43+
end block
44+
45+
!$omp target defaultmap(firstprivate : aggregate) defaultmap(firstprivate ) ! { dg-error "DEFAULTMAP at .1. but prior DEFAULTMAP for category AGGREGATE" }
46+
block
47+
scalar = 1;
48+
array(1) = 2;
49+
if (associated(ptr1)) &
50+
agg1%i = 3;
51+
if (associated(ptr2)) &
52+
agg2(1)%i = 3;
53+
if (allocated(alloc1)) &
54+
alloc2(1) = 0
55+
end block
56+
57+
!$omp target defaultmap(alloc : pointer) defaultmap(firstprivate : all ) ! { dg-error "DEFAULTMAP at .1. but prior DEFAULTMAP for category POINTER" }
58+
block
59+
scalar = 1;
60+
array(1) = 2;
61+
if (associated(ptr1)) &
62+
agg1%i = 3;
63+
if (associated(ptr2)) &
64+
agg2(1)%i = 3;
65+
if (allocated(alloc1)) &
66+
alloc2(1) = 0
67+
end block
68+
69+
!$omp target defaultmap(firstprivate :all ) defaultmap(firstprivate : all) ! { dg-error "DEFAULTMAP at .1. but prior DEFAULTMAP for category ALL" }
70+
block
71+
scalar = 1;
72+
array(1) = 2;
73+
if (associated(ptr1)) &
74+
agg1%i = 3;
75+
if (associated(ptr2)) &
76+
agg2(1)%i = 3;
77+
if (allocated(alloc1)) &
78+
alloc2(1) = 0
79+
end block
80+
81+
!$omp target defaultmap(firstprivate ) defaultmap(firstprivate) ! { dg-error "DEFAULTMAP at .1. but prior DEFAULTMAP with unspecified category" }
82+
block
83+
scalar = 1;
84+
array(1) = 2;
85+
if (associated(ptr1)) &
86+
agg1%i = 3;
87+
if (associated(ptr2)) &
88+
agg2(1)%i = 3;
89+
if (allocated(alloc1)) &
90+
alloc2(1) = 0
91+
end block
92+
93+
!$omp target defaultmap(firstprivate ) defaultmap(firstprivate : all) ! { dg-error "DEFAULTMAP at .1. but prior DEFAULTMAP with unspecified category" }
94+
block
95+
scalar = 1;
96+
array(1) = 2;
97+
if (associated(ptr1)) &
98+
agg1%i = 3;
99+
if (associated(ptr2)) &
100+
agg2(1)%i = 3;
101+
if (allocated(alloc1)) &
102+
alloc2(1) = 0
103+
end block
104+
105+
!$omp target defaultmap(firstprivate : all) defaultmap(firstprivate) ! { dg-error "DEFAULTMAP at .1. but prior DEFAULTMAP for category ALL" }
106+
block
107+
scalar = 1;
108+
array(1) = 2;
109+
if (associated(ptr1)) &
110+
agg1%i = 3;
111+
if (associated(ptr2)) &
112+
agg2(1)%i = 3;
113+
if (allocated(alloc1)) &
114+
alloc2(1) = 0
115+
end block
116+
end

0 commit comments

Comments
 (0)