diff options
author | Harald Anlauf <anlauf@gmx.de> | 2023-01-18 22:13:29 +0100 |
---|---|---|
committer | Harald Anlauf <anlauf@gmx.de> | 2023-01-19 19:12:55 +0100 |
commit | 117848f425a3c0eda85517b4bdaf2ebe3bc705c2 (patch) | |
tree | e9c69bfe8216f21010efea4bcd88ffce2eb3f59b | |
parent | f8cb07a7a445c61a704476746b971ddd967627aa (diff) | |
download | gcc-117848f425a3c0eda85517b4bdaf2ebe3bc705c2.zip gcc-117848f425a3c0eda85517b4bdaf2ebe3bc705c2.tar.gz gcc-117848f425a3c0eda85517b4bdaf2ebe3bc705c2.tar.bz2 |
Fortran: error recovery for invalid CLASS component [PR108434]
gcc/fortran/ChangeLog:
PR fortran/108434
* expr.cc (class_allocatable): Prevent NULL pointer dereference
or invalid read.
(class_pointer): Likewise.
gcc/testsuite/ChangeLog:
PR fortran/108434
* gfortran.dg/pr108434.f90: New test.
-rw-r--r-- | gcc/fortran/expr.cc | 4 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr108434.f90 | 11 |
2 files changed, 13 insertions, 2 deletions
diff --git a/gcc/fortran/expr.cc b/gcc/fortran/expr.cc index 5ec369c..3036b1b 100644 --- a/gcc/fortran/expr.cc +++ b/gcc/fortran/expr.cc @@ -4996,14 +4996,14 @@ get_union_initializer (gfc_symbol *union_type, gfc_component **map_p) static bool class_allocatable (gfc_component *comp) { - return comp->ts.type == BT_CLASS && CLASS_DATA (comp) + return comp->ts.type == BT_CLASS && comp->attr.class_ok && CLASS_DATA (comp) && CLASS_DATA (comp)->attr.allocatable; } static bool class_pointer (gfc_component *comp) { - return comp->ts.type == BT_CLASS && CLASS_DATA (comp) + return comp->ts.type == BT_CLASS && comp->attr.class_ok && CLASS_DATA (comp) && CLASS_DATA (comp)->attr.pointer; } diff --git a/gcc/testsuite/gfortran.dg/pr108434.f90 b/gcc/testsuite/gfortran.dg/pr108434.f90 new file mode 100644 index 0000000..e1768a5 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr108434.f90 @@ -0,0 +1,11 @@ +! { dg-do compile } +! PR fortran/108434 - ICE in class_allocatable +! Contributed by G.Steinmetz + +program p + type t + class(c), pointer :: a(2) ! { dg-error "must have a deferred shape" } + end type t + class(t), allocatable :: x + class(t), pointer :: y +end |