aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMikael Morin <mikael@gcc.gnu.org>2013-03-03 19:58:49 +0000
committerMikael Morin <mikael@gcc.gnu.org>2013-03-03 19:58:49 +0000
commit1216b4d21d04278222774cd255c4699b656f4fef (patch)
treee1121e93e0e7798fa2332cf5a99c3f4226427c14 /gcc
parentd6a5de161587f701089fdafada742cf275ccd7f8 (diff)
downloadgcc-1216b4d21d04278222774cd255c4699b656f4fef.zip
gcc-1216b4d21d04278222774cd255c4699b656f4fef.tar.gz
gcc-1216b4d21d04278222774cd255c4699b656f4fef.tar.bz2
re PR fortran/56477 (ICE on invalid with pointer assignment to function result)
fortran/ PR fortran/56477 * expr.c (gfc_check_pointer_assign): Avoid NULL pointer dereference. testsuite/ PR fortran/56477 * gfortran.dg/pointer_check_13.f90: New test. From-SVN: r196417
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog5
-rw-r--r--gcc/fortran/expr.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/pointer_check_13.f9019
4 files changed, 30 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index c12dd98..4431327 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,10 @@
2013-03-03 Mikael Morin <mikael@gcc.gnu.org>
+ PR fortran/56477
+ * expr.c (gfc_check_pointer_assign): Avoid NULL pointer dereference.
+
+2013-03-03 Mikael Morin <mikael@gcc.gnu.org>
+
PR fortran/54730
* array.c (gfc_match_array_constructor): Set a checkpoint before
matching a typespec. Drop it on success, restore it otherwise.
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c
index 3843c2e..fd17a05 100644
--- a/gcc/fortran/expr.c
+++ b/gcc/fortran/expr.c
@@ -3732,7 +3732,7 @@ gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
&& rvalue->symtree->n.sym->ns->proc_name->attr.flavor != FL_PROCEDURE
&& rvalue->symtree->n.sym->ns->proc_name->attr.flavor != FL_PROGRAM)
for (ns = rvalue->symtree->n.sym->ns;
- ns->proc_name && ns->proc_name->attr.flavor != FL_PROCEDURE;
+ ns && ns->proc_name && ns->proc_name->attr.flavor != FL_PROCEDURE;
ns = ns->parent)
if (ns->parent == lvalue->symtree->n.sym->ns)
warn = true;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c34cd0f..e2ceeeb 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2013-03-03 Mikael Morin <mikael@gcc.gnu.org>
+ PR fortran/56477
+ * gfortran.dg/pointer_check_13.f90: New test.
+
+2013-03-03 Mikael Morin <mikael@gcc.gnu.org>
+
PR fortran/54730
* gfortran.dg/array_constructor_42.f90: New test.
diff --git a/gcc/testsuite/gfortran.dg/pointer_check_13.f90 b/gcc/testsuite/gfortran.dg/pointer_check_13.f90
new file mode 100644
index 0000000..f936f2d
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pointer_check_13.f90
@@ -0,0 +1,19 @@
+! { dg-do compile }
+! { dg-options "-Wall -Wno-uninitialized" }
+!
+! PR fortran/56477
+! The pointer target live range checking code used to trigger a NULL pointer
+! dereference with the following case.
+!
+! Contributed by Andrew Benson <abensonca@gmail.com>
+!
+module s
+contains
+ function so()
+ implicit none
+ integer, target :: so
+ integer, pointer :: sp
+ sp => so
+ return
+ end function So
+end module s