From: Mark Eggleston Date: Wed, 10 Jun 2020 06:22:50 +0000 (+0100) Subject: Fortran : accepts pointer initialization of DT dummy args PR45337 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=bae66e0f04323ba9d5daf60fcb997de925100e3e;p=gcc.git Fortran : accepts pointer initialization of DT dummy args PR45337 Initialisation of a variable results in an implicit save attribute being added to the variable. The save attribute is not allowed for variables with the dummy attribute set. Initialisation should be rejected for dummy variables. 2020-07-13 Mark Eggleston gcc/fortran/ PR fortran/45337 * resolve.c (resolve_fl_variable): Remove type and intent checks from the check for dummy. 2020-07-13 Mark Eggleston gcc/testsuite/ PR fortran/45337 * gfortran.dg/pr45337_1.f90: New test. * gfortran.dg/pr45337_2.f90: New test. --- diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index b1238c8ab91..2751c0ccf62 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -12927,8 +12927,7 @@ resolve_fl_variable (gfc_symbol *sym, int mp_flag) else if (sym->attr.external) gfc_error ("External %qs at %L cannot have an initializer", sym->name, &sym->declared_at); - else if (sym->attr.dummy - && !(sym->ts.type == BT_DERIVED && sym->attr.intent == INTENT_OUT)) + else if (sym->attr.dummy) gfc_error ("Dummy %qs at %L cannot have an initializer", sym->name, &sym->declared_at); else if (sym->attr.intrinsic) diff --git a/gcc/testsuite/gfortran.dg/pr45337_1.f90 b/gcc/testsuite/gfortran.dg/pr45337_1.f90 new file mode 100644 index 00000000000..2bb8ff244cc --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr45337_1.f90 @@ -0,0 +1,14 @@ +! { dg-do compile } + +module ptrmod +contains +subroutine lengthX(x, i) ! { dg-error "Dummy 'x' at .1. cannot have an initializer" } + implicit none + real, pointer, intent(out) :: x(:)=>null() + integer :: i + x=>null() + allocate(x(i)) + x=i +end subroutine +end module + diff --git a/gcc/testsuite/gfortran.dg/pr45337_2.f90 b/gcc/testsuite/gfortran.dg/pr45337_2.f90 new file mode 100644 index 00000000000..ca7a6f53ad6 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr45337_2.f90 @@ -0,0 +1,18 @@ +! { dg-do compile } + +type t +end type t +type t2 + integer :: j = 7 +end type t2 +contains + subroutine x(a, b, c) + intent(out) :: a, b, c + type(t) :: a = t() + type(t2) :: b = t2() + type(t2) :: c + end subroutine x +end + +! { dg-error "Dummy .a. at .1. cannot have an initializer" " " { target *-*-* } 9 } +! { dg-error "Dummy .b. at .1. cannot have an initializer" " " { target *-*-* } 9 }