diff options
author | Harald Anlauf <anlauf@gmx.de> | 2025-03-10 22:24:27 +0100 |
---|---|---|
committer | Harald Anlauf <anlauf@gmx.de> | 2025-03-11 18:07:52 +0100 |
commit | 5e9f71254a5276cfca1769a5d490f6416a823b8d (patch) | |
tree | e497688d3542decebab2edc0da8a6dc1632212d1 /gcc | |
parent | 09205680054ca6dd7cf3bb96ef08f15006d89cff (diff) | |
download | gcc-5e9f71254a5276cfca1769a5d490f6416a823b8d.zip gcc-5e9f71254a5276cfca1769a5d490f6416a823b8d.tar.gz gcc-5e9f71254a5276cfca1769a5d490f6416a823b8d.tar.bz2 |
Fortran: reject SAVE of a COMMON in a BLOCK construct [PR119199]
PR fortran/119199
gcc/fortran/ChangeLog:
* decl.cc (gfc_match_save): Reject SAVE statement of a COMMON block
when in a BLOCK construct.
* trans-common.cc (translate_common): Avoid NULL pointer dereference.
gcc/testsuite/ChangeLog:
* gfortran.dg/common_30.f90: New test.
* gfortran.dg/common_31.f90: New test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/decl.cc | 9 | ||||
-rw-r--r-- | gcc/fortran/trans-common.cc | 2 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/common_30.f90 | 10 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/common_31.f90 | 15 |
4 files changed, 35 insertions, 1 deletions
diff --git a/gcc/fortran/decl.cc b/gcc/fortran/decl.cc index 5a46658..feb454e 100644 --- a/gcc/fortran/decl.cc +++ b/gcc/fortran/decl.cc @@ -9795,6 +9795,15 @@ gfc_match_save (void) if (m == MATCH_NO) goto syntax; + /* F2023:C1108: A SAVE statement in a BLOCK construct shall contain a + saved-entity-list that does not specify a common-block-name. */ + if (gfc_current_state () == COMP_BLOCK) + { + gfc_error ("SAVE of COMMON block %qs at %C is not allowed " + "in a BLOCK construct", n); + return MATCH_ERROR; + } + c = gfc_get_common (n, 0); c->saved = 1; diff --git a/gcc/fortran/trans-common.cc b/gcc/fortran/trans-common.cc index 70b4517..2db50da 100644 --- a/gcc/fortran/trans-common.cc +++ b/gcc/fortran/trans-common.cc @@ -1218,7 +1218,7 @@ translate_common (gfc_common_head *common, gfc_symbol *var_list) align = 1; saw_equiv = false; - if (var_list->attr.omp_allocate) + if (var_list && var_list->attr.omp_allocate) gfc_error ("Sorry, !$OMP allocate for COMMON block variable %qs at %L " "not supported", common->name, &common->where); diff --git a/gcc/testsuite/gfortran.dg/common_30.f90 b/gcc/testsuite/gfortran.dg/common_30.f90 new file mode 100644 index 0000000..77a8634 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/common_30.f90 @@ -0,0 +1,10 @@ +! { dg-do compile } +! PR fortran/119199 +! +! One cannot SAVE an undefined COMMON block +! +! Contributed by David Binderman + +program main + save /argmnt1/ ! { dg-error "does not exist" } +end diff --git a/gcc/testsuite/gfortran.dg/common_31.f90 b/gcc/testsuite/gfortran.dg/common_31.f90 new file mode 100644 index 0000000..b60f46d --- /dev/null +++ b/gcc/testsuite/gfortran.dg/common_31.f90 @@ -0,0 +1,15 @@ +! { dg-do compile } +! PR fortran/119199 - reject SAVE of a COMMON in a BLOCK construct +! +! F2023:C1108: A SAVE statement in a BLOCK construct shall contain a +! saved-entity-list that does not specify a common-block-name. +! +! Contributed by David Binderman + +program main + real r + common /argmnt2/ r + block + save /argmnt2/ ! { dg-error "not allowed in a BLOCK construct" } + end block +end |