diff options
author | Harald Anlauf <anlauf@gmx.de> | 2024-08-13 19:17:36 +0200 |
---|---|---|
committer | Harald Anlauf <anlauf@gmx.de> | 2024-08-13 19:17:36 +0200 |
commit | 9988d7e004796ab531df7bcda45788a7aa9276d7 (patch) | |
tree | 8fdfde289113485bce93ca5744f072b91ecdb6a9 /gcc | |
parent | ccd7068d462b271d5bd9bbfac968204ee96500f1 (diff) | |
download | gcc-9988d7e004796ab531df7bcda45788a7aa9276d7.zip gcc-9988d7e004796ab531df7bcda45788a7aa9276d7.tar.gz gcc-9988d7e004796ab531df7bcda45788a7aa9276d7.tar.bz2 |
Fortran: reject array constructor value of abstract type [PR114308]
gcc/fortran/ChangeLog:
PR fortran/114308
* array.cc (resolve_array_list): Reject array constructor value if
its declared type is abstract (F2018:C7114).
gcc/testsuite/ChangeLog:
PR fortran/114308
* gfortran.dg/abstract_type_10.f90: New test.
Co-Authored-By: Steven G. Kargl <kargl@gcc.gnu.org>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/array.cc | 13 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/abstract_type_10.f90 | 30 |
2 files changed, 43 insertions, 0 deletions
diff --git a/gcc/fortran/array.cc b/gcc/fortran/array.cc index 79c774d..a5e94f1 100644 --- a/gcc/fortran/array.cc +++ b/gcc/fortran/array.cc @@ -2127,6 +2127,19 @@ resolve_array_list (gfc_constructor_base base) "polymorphic [F2008: C4106]", &c->expr->where); t = false; } + + /* F2018:C7114 The declared type of an ac-value shall not be abstract. */ + if (c->expr->ts.type == BT_CLASS + && c->expr->ts.u.derived + && c->expr->ts.u.derived->attr.abstract + && CLASS_DATA (c->expr)) + { + gfc_error ("Array constructor value %qs at %L is of the ABSTRACT " + "type %qs", c->expr->symtree->name, &c->expr->where, + CLASS_DATA (c->expr)->ts.u.derived->name); + t = false; + } + } return t; diff --git a/gcc/testsuite/gfortran.dg/abstract_type_10.f90 b/gcc/testsuite/gfortran.dg/abstract_type_10.f90 new file mode 100644 index 0000000..a4bf65d --- /dev/null +++ b/gcc/testsuite/gfortran.dg/abstract_type_10.f90 @@ -0,0 +1,30 @@ +! { dg-do compile } +! +! PR fortran/114308 - reject array constructor value of abstract type + +module my_module + implicit none + private + + type, abstract, public :: a + end type + + type, extends(a), public :: b + end type +end + +program main + use my_module + implicit none + type(b) :: b_instance + class(a), allocatable :: a_array(:) + class(b), allocatable :: b_array(:) + + a_array = [b_instance] + b_array = [b_instance] + a_array = [a_array] ! { dg-error "is of the ABSTRACT type" } + a_array = [a_array(1)] ! { dg-error "is of the ABSTRACT type" } + a_array = [a_array, b_instance] ! { dg-error "is of the ABSTRACT type" } + a_array = [b_instance, a_array] ! { dg-error "is of the ABSTRACT type" } + b_array = [b_array, a_array] ! { dg-error "is of the ABSTRACT type" } +end program |