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

             Bug #: 51842
           Summary: fortran fails if ssize_t is 32-bit on 64-bit host
    Classification: Unclassified
           Product: gcc
           Version: 4.6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: m...@gcc.gnu.org


fortran fails if ssize_t is 32-bits on a 64-bit (LP64) host.  The runtime and
codegen disagree over the size of fields.  Either, the codegen should match the
runtime, or the runtime should match the codegen.

>From libgfortran.h:

/* The following two definitions must be consistent with the types used         
   by the compiler.  */
/* The type used of array indices, amongst other things.  */
typedef ssize_t index_type;

typedef struct descriptor_dimension
{
  index_type _stride;
  index_type _lbound;
  index_type _ubound;
}

descriptor_dimension;

#define GFC_ARRAY_DESCRIPTOR(r, type) \
struct {\
  type *data;\
  size_t offset;\
  index_type dtype;\
  descriptor_dimension dim[r];\
}

is but one example of a mismatch.  Better to use size_t, or ptrdiff_t
uniformly, if you want a 64-bit type on a 64-bit pointer host.

Tracking this problem down, was, very annoying.  I fixed my port to use a
64-bit type for ssize_t (bad port), so, I'm fine now.  For the next person, you
might want to assert that sizeof (size_t) == sizeof (ssize_t), so they can at
least find the problem faster if you don't `fix it'.

Thanks.

Reply via email to