Fortran 2008 has:
C638 (R626) Each allocate-object shall be type compatible (18.104.22.168) with
source-expr. If SOURCE= appears, source-expr shall be a scalar or
have the same rank as each allocate-object.
gfortran properly diagnoses this for SOURCE, but it also diagnoses it for MOLD= which is valid:
allocate (a(2), mold=b) ! Valid
Error: Source-expr at (1) must be scalar or have the same rank as the allocate-object at (2)
end type t
class(T), allocatable :: a(:), b(:,:)
allocate (a(2), source=b) ! Invalid - and correctly rejected
allocate (a(2), mold=b) ! Valid - but not accepted
What is allocate supposed to do if the array and the mold are not
From the 2008 draft:
Data usage and computation:
A structure constructor can omit the value for an allocatable component.
SOURCE= in an ALLOCATE statement can give an array variable the bounds as
well as the value of an expression.
MOLD= in an ALLOCATE statement can give a polymorphic variable the shape,
type,and type parameters of an expression without copying the value.
The real and imaginary parts of a complex entity can be accessed
independently with a component-like syntax. Intrinsic assignment to an
allocatable polymorphic variable is allowed. A pointer function reference
can denote a variable in any variable definition context. Some restrictions
on the use of dummy arguments in elemental subprograms have been removed.