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 ada/30740] New: Improper semantics in gnat's compilation of certain expressions involving modular arithmetic


The problem appears in the evaluation of certain expressions with modular
variables.  Without the use of the -gnato option during compilation, the
executable produced by gnat 3.15p on Solaris for the source code shown below
produces incorrect results.  Here's a sample output line from this program:
______________________________________________________________________________
When J=2, Test_Pattern*2**J =124 or 2#1111100#   but Test_Pattern*2**2 = 60 or
2#111100#
______________________________________________________________________________

60 is correct, 124 is incorrect.

So the default behavior of the compiler does not appear to match the semantics
of the Ada language standard for modular values and the "workaround" requires
use of an option (-gnato) that should not be influencing the behavior of this
program. (Overflow is not possible for modular values; they must always wrap
around.) 

See
http://groups.google.com/group/comp.lang.ada/browse_thread/thread/4eca860272d4832b/3bca35e8bb0bdb52?hl=en#3bca35e8bb0bdb52
for a complete discussion of this problem.  

Here's the source code of a program that demonstrates this problem in my
environment and, according to others on comp.lang.ada, other environments as
well:

with Ada.Text_IO; use Ada.Text_IO;
procedure Strange_Typing is

   type Six_Bits is mod 2**6;

   package Six_Bit_IO is new Ada.Text_IO.Modular_IO(Six_Bits);
   use Six_Bit_IO;

   Test_Pattern : Six_Bits := 31;         -- 5 bits of ones

begin

   Put("The test pattern is a modulo 2**6 integer = ");
   Put(Test_Pattern, 0);
                                           Put(" or ");
   Put(Test_Pattern, 0, 2);
   New_Line(2);

   for J in 0 .. 5 loop

      Put("When J=");
      Put(Six_Bits(J), 0); Put(", ");
      Put("Test_Pattern*2**J =");
      Six_Bit_IO.Put( Test_Pattern*2**J);             Put(" or ");
      Six_Bit_IO.Put( Test_Pattern*2**J, 0, 2);

      Put(Ascii.Ht & " but ");

      case J is
         when 0 =>
            Put("Test_Pattern*2**0 = ");
            Put( Test_Pattern*2**0, 0);    Put(" or ");
            Put( Test_Pattern*2**0, 0, 2);
        when 1 =>
            Put("Test_Pattern*2**1 = ");
            Put( Test_Pattern*2**1, 0);    Put(" or ");
            Put( Test_Pattern*2**1, 0, 2);
         when 2 =>
            Put("Test_Pattern*2**2 = ");
            Put( Test_Pattern*2**2, 0);    Put(" or ");
            Put( Test_Pattern*2**2, 0, 2);
          when 3 =>
            Put("Test_Pattern*2**3 = ");
            Put( Test_Pattern*2**3, 0);    Put(" or ");
            Put( Test_Pattern*2**3, 0, 2);
         when 4 =>
            Put("Test_Pattern*2**4 = ");
            Put( Test_Pattern*2**4, 0);    Put(" or ");
            Put( Test_Pattern*2**4, 0, 2);
         when 5 =>
            Put("Test_Pattern*2**5 = ");
            Put( Test_Pattern*2**5, 0);    Put(" or ");
            Put( Test_Pattern*2**5, 0, 2);
      end case;

      New_Line;

   end loop;

   New_Line;

end Strange_Typing;


-- 
           Summary: Improper semantics in gnat's compilation of certain
                    expressions involving modular arithmetic
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: ada
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: jaffem at erau dot edu


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


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