That's a Fortran 2008 feature. Build and regtested on x86-64-linux. OK for the trunk?
Tobias
2012-01-27 Tobias Burnus <bur...@net-b.de> PR fortran/51953 * match.c (gfc_match_allocate): Allow more than allocate object with SOURCE=. 2012-01-27 Tobias Burnus <bur...@net-b.de> PR fortran/51953 * gfortran.dg/allocate_alloc_opt_13.f90: New. * gfortran.dg/allocate_alloc_opt_4.f90: Add -std=f2003 and change dg-error string. Index: gcc/fortran/match.c =================================================================== --- gcc/fortran/match.c (revision 183575) +++ gcc/fortran/match.c (working copy) @@ -3660,12 +3660,11 @@ alloc_opt_list: goto cleanup; } - if (head->next) - { - gfc_error ("SOURCE tag at %L requires only a single entity in " - "the allocation-list", &tmp->where); - goto cleanup; - } + if (head->next + && gfc_notify_std (GFC_STD_F2008, "Fortran 2008: SOURCE tag at %L" + " with more than a single allocate objects", + &tmp->where) == FAILURE) + goto cleanup; source = tmp; tmp = NULL; Index: gcc/testsuite/gfortran.dg/allocate_alloc_opt_13.f90 =================================================================== --- gcc/testsuite/gfortran.dg/allocate_alloc_opt_13.f90 (revision 0) +++ gcc/testsuite/gfortran.dg/allocate_alloc_opt_13.f90 (working copy) @@ -0,0 +1,25 @@ +! { dg-do compile } +! +! PR fortran/51953 +! +! +type t +end type t + +class(t), allocatable :: a, c(:), e(:) +class(t), pointer :: b, d(:) + +allocate (a, b, source=c(1)) +allocate (c(4), d(6), source=e) + +allocate (a, b, source=f()) +allocate (c(1), d(6), source=g()) + +contains +function f() + class(t), allocatable :: f +end function +function g() + class(t), allocatable :: g(:) +end function +end Index: gcc/testsuite/gfortran.dg/allocate_alloc_opt_4.f90 =================================================================== --- gcc/testsuite/gfortran.dg/allocate_alloc_opt_4.f90 (revision 183575) +++ gcc/testsuite/gfortran.dg/allocate_alloc_opt_4.f90 (working copy) @@ -1,4 +1,5 @@ ! { dg-do compile } +! { dg-options "-std=f2003" } program a implicit none @@ -16,7 +17,7 @@ program a allocate(integer(4) :: i(4), source=n) ! { dg-error "conflicts with the typespec" } - allocate(i(4), j(n), source=n) ! { dg-error "requires only a single entity" } + allocate(i(4), j(n), source=n) ! { dg-error "Fortran 2008: SOURCE tag at .1. with more than a single allocate objects" } allocate(x(4), source=n) ! { dg-error "type incompatible with" }