aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven G. Kargl <kargl@gcc.gnu.org>2018-12-08 18:09:05 +0000
committerSteven G. Kargl <kargl@gcc.gnu.org>2018-12-08 18:09:05 +0000
commit51a9dea95c2bac972f7e9fd3770a52671bb6cb1b (patch)
tree814a62bcd329a87fae9e3dad0f0e310a5bbba28b
parent08d5bb84aa5abf60c6bdcf2c4a684d62aa8f5522 (diff)
2018-12-08 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/88357 * class.c (insert_component_ref): Check for NULL pointer and previous error message issued. * parse.c (parse_associate): Check for NULL pointer. * resolve.c (resolve_assoc_var): Check for NULL pointer. 2018-12-08 Steven G. Kargl <kargl@gcc.gnu.org> * gfortran.dg/pr88357_1.f90: New test. * gfortran.dg/pr88357_2.f90: New test. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@266908 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/fortran/ChangeLog8
-rw-r--r--gcc/fortran/class.c10
-rw-r--r--gcc/fortran/parse.c2
-rw-r--r--gcc/fortran/resolve.c3
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/pr88357_1.f909
-rw-r--r--gcc/testsuite/gfortran.dg/pr88357_2.f908
7 files changed, 40 insertions, 5 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 9e17decbe18..8603e431f73 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,11 @@
+2018-12-08 Steven G. Kargl <kargl@gcc.gnu.org>
+
+ PR fortran/88357
+ * class.c (insert_component_ref): Check for NULL pointer and
+ previous error message issued.
+ * parse.c (parse_associate): Check for NULL pointer.
+ * resolve.c (resolve_assoc_var): Check for NULL pointer.
+
2018-12-07 Jakub Jelinek <jakub@redhat.com>
PR fortran/88377
diff --git a/gcc/fortran/class.c b/gcc/fortran/class.c
index 2eae7f0f351..105511d03cc 100644
--- a/gcc/fortran/class.c
+++ b/gcc/fortran/class.c
@@ -72,14 +72,18 @@ along with GCC; see the file COPYING3. If not see
static void
insert_component_ref (gfc_typespec *ts, gfc_ref **ref, const char * const name)
{
- gfc_symbol *type_sym;
gfc_ref *new_ref;
+ int wcnt, ecnt;
gcc_assert (ts->type == BT_DERIVED || ts->type == BT_CLASS);
- type_sym = ts->u.derived;
- gfc_find_component (type_sym, name, true, true, &new_ref);
+ gfc_find_component (ts->u.derived, name, true, true, &new_ref);
+
+ gfc_get_errors (&wcnt, &ecnt);
+ if (ecnt > 0 && !new_ref)
+ return;
gcc_assert (new_ref->u.c.component);
+
while (new_ref->next)
new_ref = new_ref->next;
new_ref->next = *ref;
diff --git a/gcc/fortran/parse.c b/gcc/fortran/parse.c
index 56d0d050bc3..7acd8cfa4fb 100644
--- a/gcc/fortran/parse.c
+++ b/gcc/fortran/parse.c
@@ -4563,7 +4563,7 @@ parse_associate (void)
else
rank = a->target->rank;
/* When the rank is greater than zero then sym will be an array. */
- if (sym->ts.type == BT_CLASS)
+ if (sym->ts.type == BT_CLASS && CLASS_DATA (sym))
{
if ((!CLASS_DATA (sym)->as && rank != 0)
|| (CLASS_DATA (sym)->as
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index b2090218d48..35352c6757f 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -8715,7 +8715,8 @@ resolve_assoc_var (gfc_symbol* sym, bool resolve_target)
{
/* target's rank is 0, but the type of the sym is still array valued,
which has to be corrected. */
- if (sym->ts.type == BT_CLASS && CLASS_DATA (sym)->as)
+ if (sym->ts.type == BT_CLASS
+ && CLASS_DATA (sym) && CLASS_DATA (sym)->as)
{
gfc_array_spec *as;
symbol_attribute attr;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index dc7c2041619..f4a7885e0af 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-12-08 Steven G. Kargl <kargl@gcc.gnu.org>
+
+ * gfortran.dg/pr88357_1.f90: New test.
+ * gfortran.dg/pr88357_2.f90: New test.
+
2018-12-08 Jakub Jelinek <jakub@redhat.com>
PR fortran/88304
diff --git a/gcc/testsuite/gfortran.dg/pr88357_1.f90 b/gcc/testsuite/gfortran.dg/pr88357_1.f90
new file mode 100644
index 00000000000..5cda86ece17
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr88357_1.f90
@@ -0,0 +1,9 @@
+! { dg-do compile }
+! { dg-options "-fcoarray=single" }
+program p
+ type t
+ end type
+ class(t) :: x[*] ! { dg-error "must be dummy, allocatable or pointer" }
+ associate (y => x)
+ end associate
+end
diff --git a/gcc/testsuite/gfortran.dg/pr88357_2.f90 b/gcc/testsuite/gfortran.dg/pr88357_2.f90
new file mode 100644
index 00000000000..d89511b103a
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr88357_2.f90
@@ -0,0 +1,8 @@
+! { dg-do compile }
+program p
+ type t
+ end type
+ class(t) :: x ! { dg-error "must be dummy, allocatable or pointer" }
+ associate (y => x)
+ end associate
+end