From 1bd83e0b0ba5f2a32f7c453b6fd1c856036dfba2 Mon Sep 17 00:00:00 2001 From: Thomas Koenig Date: Thu, 31 Jan 2019 22:21:28 +0000 Subject: [PATCH] re PR fortran/88669 (Contiguous attribute wrongly rejected) 2019-01-31 Thomas Koenig PR fortran/88669 * resolve.c (resolve_component): If the reference is a BT_CLASS, copy the contiguous attribute from the reference and use the correct attributes. 2019-01-31 Thomas Koenig PR fortran/88669 * gfortran.dg/contiguous_9.f90: New test. From-SVN: r268432 --- gcc/fortran/ChangeLog | 7 +++++++ gcc/fortran/resolve.c | 19 ++++++++++++++++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/contiguous_9.f90 | 12 ++++++++++++ 4 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/contiguous_9.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index c78e32af173..7f2a7afbbb9 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2019-01-31 Thomas Koenig + + PR fortran/88669 + * resolve.c (resolve_component): If the reference is a BT_CLASS, + copy the contiguous attribute from the reference and use the + correct attributes. + 2019-01-30 Jerry DeLisle PR fortran/52564 diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 2c49aeab5f9..5e95777af55 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -13761,6 +13761,7 @@ static bool resolve_component (gfc_component *c, gfc_symbol *sym) { gfc_symbol *super_type; + symbol_attribute *attr; if (c->attr.artificial) return true; @@ -13803,7 +13804,23 @@ resolve_component (gfc_component *c, gfc_symbol *sym) } /* F2008, C448. */ - if (c->attr.contiguous && (!c->attr.dimension || !c->attr.pointer)) + if (c->ts.type == BT_CLASS) + { + if (CLASS_DATA (c)) + { + attr = &(CLASS_DATA (c)->attr); + + /* Fix up contiguous attribute. */ + if (c->attr.contiguous) + attr->contiguous = 1; + } + else + attr = NULL; + } + else + attr = &c->attr; + + if (attr && attr->contiguous && (!attr->dimension || !attr->pointer)) { gfc_error ("Component %qs at %L has the CONTIGUOUS attribute but " "is not an array pointer", c->name, &c->loc); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ce63dad84d0..ec3b597339f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-01-31 Thomas Koenig + + PR fortran/88669 + * gfortran.dg/contiguous_9.f90: New test. + 2019-01-31 Marek Polacek PR c++/89083, c++/80864 - ICE with list initialization in template. diff --git a/gcc/testsuite/gfortran.dg/contiguous_9.f90 b/gcc/testsuite/gfortran.dg/contiguous_9.f90 new file mode 100644 index 00000000000..dec63710d4a --- /dev/null +++ b/gcc/testsuite/gfortran.dg/contiguous_9.f90 @@ -0,0 +1,12 @@ +program contiguous_pointer + +type t +end type t + +type s + class(t), dimension(:), contiguous, pointer :: x ! OK + class(t), contiguous, allocatable :: y ! { dg-error "has the CONTIGUOUS attribute but is not an array pointer" } + class(t), contiguous, pointer :: z ! { dg-error "has the CONTIGUOUS attribute but is not an array pointer" } +end type s + +end program contiguous_pointer -- 2.30.2