]> git.ipfire.org Git - people/ms/gcc.git/commitdiff
Fortran: error handling of global entity appearing in COMMON block [PR103259]
authorSteve Kargl <kargl@gcc.gnu.org>
Tue, 7 Feb 2023 19:18:42 +0000 (20:18 +0100)
committerHarald Anlauf <anlauf@gmx.de>
Fri, 10 Feb 2023 19:09:56 +0000 (20:09 +0100)
gcc/fortran/ChangeLog:

PR fortran/103259
* resolve.c (resolve_common_vars): Avoid NULL pointer dereference
when a symbol's location is not set.

gcc/testsuite/ChangeLog:

PR fortran/103259
* gfortran.dg/pr103259.f90: New test.

(cherry picked from commit 7e9f20f5517429cfaadec14d6b04705e59078565)

gcc/fortran/resolve.c
gcc/testsuite/gfortran.dg/pr103259.f90 [new file with mode: 0644]

index ab15f6359357606af5ad31411c4a701b07eaf5a8..3005619c4639f4456195770a9391bac7d3aa95bf 100644 (file)
@@ -953,9 +953,15 @@ resolve_common_vars (gfc_common_head *common_block, bool named_common)
     {
       gsym = gfc_find_gsymbol (gfc_gsym_root, csym->name);
       if (gsym && (gsym->type == GSYM_MODULE || gsym->type == GSYM_PROGRAM))
-       gfc_error_now ("Global entity %qs at %L cannot appear in a "
-                       "COMMON block at %L", gsym->name,
-                       &gsym->where, &csym->common_block->where);
+       {
+         if (csym->common_block)
+           gfc_error_now ("Global entity %qs at %L cannot appear in a "
+                          "COMMON block at %L", gsym->name,
+                          &gsym->where, &csym->common_block->where);
+         else
+           gfc_error_now ("Global entity %qs at %L cannot appear in a "
+                          "COMMON block", gsym->name, &gsym->where);
+       }
 
       /* gfc_add_in_common may have been called before, but the reported errors
         have been ignored to continue parsing.
diff --git a/gcc/testsuite/gfortran.dg/pr103259.f90 b/gcc/testsuite/gfortran.dg/pr103259.f90
new file mode 100644 (file)
index 0000000..f78ff26
--- /dev/null
@@ -0,0 +1,11 @@
+! { dg-do compile }
+! PR fortran/103259 - ICE in resolve_common_vars
+! Contributed by G.Steinmetz
+
+module m
+  integer :: p
+  common /c/ p
+end
+program p ! { dg-error "cannot appear in a COMMON block" }
+  use m   ! { dg-error "is also the name of the current program unit" }
+end