This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug fortran/55072] [4.6/4.7/4.8 Regression] Missing internal_pack leads to wrong code with derived type


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55072

--- Comment #17 from janus at gcc dot gnu.org 2012-12-15 21:26:32 UTC ---
(In reply to comment #16)
> > Question is: Is the packing needed here? I would guess that it isn't.
> 
> Of course I might be wrong here. After all, array_t3_ptr is a pointer, so it's
> not guaranteed to be contiguous, right?

To answer that myself, I think the packing is indeed needed here. At least it
is also done for similar cases in the same test case, such as this one:

character, pointer :: array_char_ptr(:,:)
call sub_array_assumed (array_char_ptr)


> If the packing is indeed required in this place, we just need to fix the test
> case (assumed_type_2.f90) ...

... like this:


Index: gcc/testsuite/gfortran.dg/assumed_type_2.f90
===================================================================
--- gcc/testsuite/gfortran.dg/assumed_type_2.f90    (revision 194517)
+++ gcc/testsuite/gfortran.dg/assumed_type_2.f90    (working copy)
@@ -157,7 +157,7 @@ end
 ! { dg-final { scan-tree-dump-times "sub_scalar .\\(struct t1 .\\)
array_class_t1_alloc._data.data" 1 "original" } }
 ! { dg-final { scan-tree-dump-times "sub_scalar .\\(struct t1 .\\)
array_class_t1_ptr._data.dat" 1 "original" } }a

-! { dg-final { scan-tree-dump-times "sub_array_assumed \\(D" 2 "original" } }
+! { dg-final { scan-tree-dump-times "sub_array_assumed \\(D" 3 "original" } }
 ! { dg-final { scan-tree-dump-times " = _gfortran_internal_pack \\(&parm" 1
"original" } }
 ! { dg-final { scan-tree-dump-times "sub_array_assumed \\(&array_int\\)" 1
"original" } }
 ! { dg-final { scan-tree-dump-times "sub_array_assumed
\\(\\(real\\(kind=4\\).0:. . restrict\\) array_real_alloc.data" 1 "original" }
}
@@ -165,7 +165,6 @@ end
 ! { dg-final { scan-tree-dump-times "\\.data = \\(void .\\) &array_t1.0.;" 1
"original" } }
 ! { dg-final { scan-tree-dump-times "sub_array_assumed \\(\\(struct t1.0:.
.\\) parm" 1 "original" } }
 ! { dg-final { scan-tree-dump-times "sub_array_assumed \\(\\(struct t2.0:. .
restrict\\) array_t2_alloc.data\\);" 1 "original" } }
-! { dg-final { scan-tree-dump-times "sub_array_assumed \\(\\(struct t3.0:.
.\\) array_t3_ptr.data\\);" 1 "original" } }
 ! { dg-final { scan-tree-dump-times "sub_array_assumed \\(\\(struct t1.0:. .
restrict\\) array_class_t1_alloc._data.data\\);" 1 "original" } }
 ! { dg-final { scan-tree-dump-times "sub_array_assumed \\(\\(struct t1.0:.
.\\) array_class_t1_ptr._data.data\\);" 1 "original" } }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]