* gcc-interface/trans.c (build_binary_op_trapv): Convert arguments
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 7 Nov 2008 09:56:33 +0000 (09:56 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 7 Nov 2008 09:56:33 +0000 (09:56 +0000)
and result for call to __gnat_mulv64.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@141668 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ada/ChangeLog
gcc/ada/gcc-interface/trans.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/test_8bitlong_overflow.adb [new file with mode: 0644]

index fe36602..3cb89a6 100644 (file)
@@ -1,3 +1,8 @@
+2008-11-07  Geert Bosch  <bosch@adacore.com>
+
+       * gcc-interface/trans.c (build_binary_op_trapv): Convert arguments
+       and result for call to __gnat_mulv64.
+
 2008-11-07  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/trans.c: Fix formatting nits.
index d1d449e..005d517 100644 (file)
@@ -6032,7 +6032,13 @@ build_binary_op_trapv (enum tree_code code, tree gnu_type, tree left,
       int needed_precision = precision * 2;
 
       if (code == MULT_EXPR && precision == 64)
-       return build_call_2_expr (mulv64_decl, lhs, rhs);
+       { 
+         tree int_64 = gnat_type_for_size (64, 0);
+
+         return convert (gnu_type, build_call_2_expr (mulv64_decl,
+                                                      convert (int_64, lhs),
+                                                      convert (int_64, rhs)));
+       }
 
       else if (needed_precision <= BITS_PER_WORD
               || (code == MULT_EXPR 
index 2b25e17..ae35d29 100644 (file)
@@ -1,3 +1,7 @@
+2008-11-07  Geert Bosch  <bosch@adacore.com>
+
+       * gnat.dg/test_8bitlong_overflow.adb: New test.
+
 2008-11-07  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * g++.dg/ipa/iinline-1.C: Remove -c flag, add -fpie for PIC
diff --git a/gcc/testsuite/gnat.dg/test_8bitlong_overflow.adb b/gcc/testsuite/gnat.dg/test_8bitlong_overflow.adb
new file mode 100644 (file)
index 0000000..b22c871
--- /dev/null
@@ -0,0 +1,28 @@
+-- { dg-do run }
+-- { dg-options "-gnato" }
+
+procedure Test_8bitlong_Overflow is
+
+   pragma Unsuppress (Overflow_Check);
+   generic
+       type T is range <>;
+   package G is
+      LO   : T := T'first;
+      ONE  : T := T(1);
+
+      type A2 is array(T range <>) of T;
+      subtype SA2 is A2(LO..4*ONE);
+
+      ARRAY_AGGR : SA2 := SA2'(others=>LO + 1);
+
+      POS_1   : T := T'pos(LO*ONE);
+   end;
+
+   type T is new LONG_INTEGER range -1..10;
+   for T'size use 8;
+
+   package P is new G (T);
+
+begin
+   null;
+end;