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 <markeggleston@gcc.gnu.org>
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 <markeggleston@gcc.gnu.org>
gcc/testsuite/
PR fortran/45337
* gfortran.dg/pr45337_1.f90: New test.
* gfortran.dg/pr45337_2.f90: New test.
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)
--- /dev/null
+! { 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
+
--- /dev/null
+! { 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 }