octave-bug-tracker
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Octave-bug-tracker] [bug #54382] char to int conversion fails if OCTAVE


From: John W. Eaton
Subject: [Octave-bug-tracker] [bug #54382] char to int conversion fails if OCTAVE_HAVE_OVERLOAD_CHAR_INT8_TYPES is not defined
Date: Thu, 26 Jul 2018 08:55:06 -0400 (EDT)
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0

URL:
  <http://savannah.gnu.org/bugs/?54382>

                 Summary: char to int conversion fails if
OCTAVE_HAVE_OVERLOAD_CHAR_INT8_TYPES is not defined
                 Project: GNU Octave
            Submitted by: jwe
            Submitted on: Thu 26 Jul 2018 12:55:05 PM UTC
                Category: Libraries
                Severity: 3 - Normal
                Priority: 5 - Normal
              Item Group: Incorrect Result
                  Status: None
             Assigned to: None
         Originator Name: 
        Originator Email: 
             Open/Closed: Open
         Discussion Lock: Any
                 Release: dev
        Operating System: Solaris/SunOS

    _______________________________________________________

Details:

The following tests failed on a Solaris build:


>>>>> processing
/export/home/eaton/local/build/octave-4.4.1-rc1/liboctave/util/oct-inttypes.cc-tst
***** assert (uint8 (char (128)), uint8 (128))
!!!!! test failed
ASSERT errors for:  assert (uint8 (char (128)),uint8 (128))

  Location  |  Observed  |  Expected  |  Reason
     ()           0           128        Abs err 128 exceeds tol 0 by 1e+02
***** assert (uint8 (char (255)), uint8 (255))
!!!!! test failed
ASSERT errors for:  assert (uint8 (char (255)),uint8 (255))

  Location  |  Observed  |  Expected  |  Reason
     ()           0           255        Abs err 255 exceeds tol 0 by 3e+02
***** assert (int8 (char (128)), int8 (128))
!!!!! test failed
ASSERT errors for:  assert (int8 (char (128)),int8 (128))

  Location  |  Observed  |  Expected  |  Reason
     ()          -128         127        Abs err 255 exceeds tol 0 by 3e+02
***** assert (int8 (char (255)), int8 (255))
!!!!! test failed
ASSERT errors for:  assert (int8 (char (255)),int8 (255))

  Location  |  Observed  |  Expected  |  Reason
     ()           -1          127        Abs err 128 exceeds tol 0 by 1e+02
***** assert (uint16 (char (128)), uint16 (128))
!!!!! test failed
ASSERT errors for:  assert (uint16 (char (128)),uint16 (128))

  Location  |  Observed  |  Expected  |  Reason
     ()           0           128        Abs err 128 exceeds tol 0 by 1e+02
***** assert (uint16 (char (255)), uint16 (255))
!!!!! test failed
ASSERT errors for:  assert (uint16 (char (255)),uint16 (255))

  Location  |  Observed  |  Expected  |  Reason
     ()           0           255        Abs err 255 exceeds tol 0 by 3e+02
***** assert (int16 (char (128)), int16 (128))
!!!!! test failed
ASSERT errors for:  assert (int16 (char (128)),int16 (128))

  Location  |  Observed  |  Expected  |  Reason
     ()          -128         128        Abs err 256 exceeds tol 0 by 3e+02
***** assert (int16 (char (255)), int16 (255))
!!!!! test failed
ASSERT errors for:  assert (int16 (char (255)),int16 (255))

  Location  |  Observed  |  Expected  |  Reason
     ()           -1          255        Abs err 256 exceeds tol 0 by 3e+02
***** assert (uint32 (char (128)), uint32 (128))
!!!!! test failed
ASSERT errors for:  assert (uint32 (char (128)),uint32 (128))

  Location  |  Observed  |  Expected  |  Reason
     ()           0           128        Abs err 128 exceeds tol 0 by 1e+02
***** assert (uint32 (char (255)), uint32 (255))
!!!!! test failed
ASSERT errors for:  assert (uint32 (char (255)),uint32 (255))

  Location  |  Observed  |  Expected  |  Reason
     ()           0           255        Abs err 255 exceeds tol 0 by 3e+02
***** assert (int32 (char (128)), int32 (128))
!!!!! test failed
ASSERT errors for:  assert (int32 (char (128)),int32 (128))

  Location  |  Observed  |  Expected  |  Reason
     ()          -128         128        Abs err 256 exceeds tol 0 by 3e+02
***** assert (int32 (char (255)), int32 (255))
!!!!! test failed
ASSERT errors for:  assert (int32 (char (255)),int32 (255))

  Location  |  Observed  |  Expected  |  Reason
     ()           -1          255        Abs err 256 exceeds tol 0 by 3e+02
***** assert (uint64 (char (128)), uint64 (128))
!!!!! test failed
ASSERT errors for:  assert (uint64 (char (128)),uint64 (128))

  Location  |  Observed  |  Expected  |  Reason
     ()           0           128        Abs err 128 exceeds tol 0 by 1e+02
***** assert (uint64 (char (255)), uint64 (255))
!!!!! test failed
ASSERT errors for:  assert (uint64 (char (255)),uint64 (255))

  Location  |  Observed  |  Expected  |  Reason
     ()           0           255        Abs err 255 exceeds tol 0 by 3e+02
***** assert (int64 (char (128)), int64 (128))
!!!!! test failed
ASSERT errors for:  assert (int64 (char (128)),int64 (128))

  Location  |  Observed  |  Expected  |  Reason
     ()          -128         128        Abs err 256 exceeds tol 0 by 3e+02
***** assert (int64 (char (255)), int64 (255))
!!!!! test failed
ASSERT errors for:  assert (int64 (char (255)),int64 (255))

  Location  |  Observed  |  Expected  |  Reason
     ()           -1          255        Abs err 256 exceeds tol 0 by 3e+02


This is happening because the overload for constructing intNDArray<T> objects
from char is not defined because OCTAVE_HAVE_OVERLOAD_CHAR_INT8_TYPES is not
defined.  This configuration variable is set correctly, as these overloads are
not possible on this system.  So we need another solution for storing or
converting character types.

The constructor is in oct-inttypes.h:


#if defined (OCTAVE_HAVE_OVERLOAD_CHAR_INT8_TYPES)
  // Always treat characters as unsigned.
  octave_int (char c)
    : ival (octave_int_base<T>::truncate_int (static_cast<unsigned char>
(c)))
  { }
#endif


It would be good if we could do this at the level of intNDArray<T>, but if
not, we will have to do it by overloading the as_{u,}int{8,16,32,64} functions
in octave_value and fixing any other locations where this constructor is
called individually.

I set the OS field to Solaris/SunOS because that's where the bug was
discovered, but this probably applies to any system where
OCTAVE_HAVE_OVERLOAD_CHAR_INT8_TYPES is not defined.  If you force that value
on another system, you should see the same problem.

There is also one more place in oct-stream.cc where this configuration
variable is used, but in that case, it should not change behavior.




    _______________________________________________________

Reply to this item at:

  <http://savannah.gnu.org/bugs/?54382>

_______________________________________________
  Message sent via Savannah
  https://savannah.gnu.org/




reply via email to

[Prev in Thread] Current Thread [Next in Thread]