http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46991
Summary: [OOP] polymorphic assumed-size actual arguments Product: gcc Version: 4.6.0 Status: UNCONFIRMED Keywords: rejects-valid Severity: normal Priority: P3 Component: fortran AssignedTo: unassig...@gcc.gnu.org ReportedBy: bur...@gcc.gnu.org CC: ja...@gcc.gnu.org Found at http://j3-fortran.org/pipermail/j3/2010-December/004084.html Currently, it is unclear whether the following program is valid, but Robert Corbett of Oracle (formerly Sun) thinks it is (but does not seem to like it.) [100% guessing, 90% wrongly]: The main issue he sees is seemingly that SUB2 does not need to have an explicit interface - which only works if the $data of a CLASS and a TYPE object start at the same offset of the passed pointer address. I think that part is OK in gfortran, but gfortran has other issues: Gfortran rejects the program with: CALL SUB2(A, N) 1 Warning: Type mismatch in argument 'a' at (1); passed CLASS(rec) to TYPE(rec) [That's PR 46990.] I also tried SELECT TYPE but with limited success. Using CLASS(REC) A(*) one gets: PRINT *, A(:N)%A 1 Error: Syntax error in argument list at (1) * * * MODULE TYPES PRIVATE PUBLIC REC, REC2 TYPE REC INTEGER A END TYPE TYPE, EXTENDS(REC) :: REC2 INTEGER B END TYPE END SUBROUTINE SUB1(A, N) USE TYPES CLASS(REC), INTENT(IN) :: A(*) CALL SUB2(A, N) END SUBROUTINE SUB2(A, N) USE TYPES TYPE(REC) A(*) PRINT *, A(:N)%A END PROGRAM MAIN USE TYPES CLASS(REC), ALLOCATABLE :: A(:) INTERFACE SUBROUTINE SUB1(A, N) USE TYPES CLASS(REC), INTENT(IN) :: A(*) END SUBROUTINE END INTERFACE A = [ (REC2(I, I+1), I = 1, 10) ] CALL SUB1(A, 10) END