decl.c (annotate_value): Deal specially with negative constants.
authorEric Botcazou <ebotcazou@adacore.com>
Sun, 13 Nov 2016 18:20:25 +0000 (18:20 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Sun, 13 Nov 2016 18:20:25 +0000 (18:20 +0000)
* gcc-interface/decl.c (annotate_value) <INTEGER_CST>: Deal specially
with negative constants.

From-SVN: r242360

gcc/ada/ChangeLog
gcc/ada/gcc-interface/decl.c

index f896d14820f3667774c6837b61219bb0a4ce1610..b3ac97c67c880096b81ea4afb9318b360d4ba269 100644 (file)
@@ -1,3 +1,8 @@
+2016-11-13  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/decl.c (annotate_value) <INTEGER_CST>: Deal specially
+       with negative constants.
+
 2016-11-13  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/utils2.c (gnat_protect_expr): Also protect only the
index 3aaaaca73eda5109d8f9e3e6fba366b0d5f36857..b6fce3ecf351c5ce29c37fe9994bf6f905e23fb2 100644 (file)
@@ -8022,6 +8022,14 @@ annotate_value (tree gnu_size)
   switch (TREE_CODE (gnu_size))
     {
     case INTEGER_CST:
+      /* For negative values, build NEGATE_EXPR of the opposite.  Such values
+        can appear for discriminants in expressions for variants.  */
+      if (tree_int_cst_sgn (gnu_size) < 0)
+       {
+         tree t = wide_int_to_tree (sizetype, wi::neg (gnu_size));
+         return annotate_value (build1 (NEGATE_EXPR, sizetype, t));
+       }
+
       return TREE_OVERFLOW (gnu_size) ? No_Uint : UI_From_gnu (gnu_size);
 
     case COMPONENT_REF: