diff options
author | Steve Kargl <kargl@gcc.gnu.org> | 2022-12-26 14:07:04 -0800 |
---|---|---|
committer | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2022-12-29 19:25:17 -0800 |
commit | cdc6bf44eec295805ae29a8aaddafd111de01c8e (patch) | |
tree | e3a00ce5b53e7370e25cd9ee0af8618c46ffd756 /gcc | |
parent | bbab9c83f27cf15b861b34f2900e570c065dfc07 (diff) | |
download | gcc-cdc6bf44eec295805ae29a8aaddafd111de01c8e.zip gcc-cdc6bf44eec295805ae29a8aaddafd111de01c8e.tar.gz gcc-cdc6bf44eec295805ae29a8aaddafd111de01c8e.tar.bz2 |
Modify checks to avoid referencing NULL pointer.
Update test cases with error messages that changed as a result.
gcc/fortran/ChangeLog:
PR fortran/102595
* decl.cc (attr_decl1): Guard against NULL pointer.
* parse.cc (match_deferred_characteristics): Include BT_CLASS in check for
derived being undefined.
gcc/testsuite/ChangeLog:
PR fortran/102595
* gfortran.dg/class_result_4.f90: Update error message check.
* gfortran.dg/pr85779_3.f90: Update error message check.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/decl.cc | 4 | ||||
-rw-r--r-- | gcc/fortran/parse.cc | 4 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/class_result_4.f90 | 2 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr85779_3.f90 | 2 |
4 files changed, 7 insertions, 5 deletions
diff --git a/gcc/fortran/decl.cc b/gcc/fortran/decl.cc index e593518..bac7b65 100644 --- a/gcc/fortran/decl.cc +++ b/gcc/fortran/decl.cc @@ -8743,7 +8743,9 @@ attr_decl1 (void) /* Update symbol table. DIMENSION attribute is set in gfc_set_array_spec(). For CLASS variables, this must be applied to the first component, or '_data' field. */ - if (sym->ts.type == BT_CLASS && sym->ts.u.derived->attr.is_class) + if (sym->ts.type == BT_CLASS + && sym->ts.u.derived + && sym->ts.u.derived->attr.is_class) { /* gfc_set_array_spec sets sym->attr not CLASS_DATA(sym)->attr. Check for duplicate attribute here. */ diff --git a/gcc/fortran/parse.cc b/gcc/fortran/parse.cc index bc2b218..6186c48 100644 --- a/gcc/fortran/parse.cc +++ b/gcc/fortran/parse.cc @@ -3934,7 +3934,7 @@ match_deferred_characteristics (gfc_typespec * ts) m = gfc_match_prefix (ts); gfc_buffer_error (false); - if (ts->type == BT_DERIVED) + if (ts->type == BT_DERIVED || ts->type == BT_CLASS) { ts->kind = 0; @@ -4215,7 +4215,7 @@ declSt: if (bad_characteristic) { ts = &gfc_current_block ()->result->ts; - if (ts->type != BT_DERIVED) + if (ts->type != BT_DERIVED && ts->type != BT_CLASS) gfc_error ("Bad kind expression for function %qs at %L", gfc_current_block ()->name, &gfc_current_block ()->declared_at); diff --git a/gcc/testsuite/gfortran.dg/class_result_4.f90 b/gcc/testsuite/gfortran.dg/class_result_4.f90 index 4b22a3c..5497ac6 100644 --- a/gcc/testsuite/gfortran.dg/class_result_4.f90 +++ b/gcc/testsuite/gfortran.dg/class_result_4.f90 @@ -1,6 +1,6 @@ ! { dg-do compile } ! PR fortran/78500 -class(t) function f() ! { dg-error "must be dummy, allocatable or pointer" } +class(t) function f() ! { dg-error "is not accessible" } f = 1 ! { dg-error "variable must not be polymorphic" } end diff --git a/gcc/testsuite/gfortran.dg/pr85779_3.f90 b/gcc/testsuite/gfortran.dg/pr85779_3.f90 index fba1133..a81a9fa 100644 --- a/gcc/testsuite/gfortran.dg/pr85779_3.f90 +++ b/gcc/testsuite/gfortran.dg/pr85779_3.f90 @@ -1,6 +1,6 @@ ! { dg-do compile } ! PR fortran/85779 -class(t) function f() ! { dg-error "must be dummy, allocatable or pointer" } +class(t) function f() ! { dg-error "is not accessible" } type f ! { dg-error "already has a basic type" } end type ! { dg-error "END FUNCTION statement" } end |