trans.c (gnat_to_gnu): Rework special code dealing with boolean rvalues and set the...
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 6 Jun 2016 09:31:13 +0000 (09:31 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Mon, 6 Jun 2016 09:31:13 +0000 (09:31 +0000)
* gcc-interface/trans.c (gnat_to_gnu): Rework special code dealing
with boolean rvalues and set the location directly.  Do not set the
location in the other cases for a simple name.
(gnat_to_gnu_external): Clear the location on the expression.

From-SVN: r237123

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

index 0370cd112ee8af9863065ddf9ffad9e9ec4eb8cb..a958655efe38c67bd078dcd2ae4b07dffd704e7c 100644 (file)
@@ -1,3 +1,10 @@
+2016-06-06  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/trans.c (gnat_to_gnu): Rework special code dealing
+       with boolean rvalues and set the location directly.  Do not set the
+       location in the other cases for a simple name.
+       (gnat_to_gnu_external): Clear the location on the expression.
+
 2016-06-06  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Component>: Remove
index c8f125b554724004e0f9c71ddeb2c94bc9c5727b..d0071d39e55c5aa5c8d18561b5a1b7052618c8c1 100644 (file)
@@ -7686,10 +7686,11 @@ gnat_to_gnu (Node_Id gnat_node)
     current_function_decl = NULL_TREE;
 
   /* When not optimizing, turn boolean rvalues B into B != false tests
-     so that the code just below can put the location information of the
-     reference to B on the inequality operator for better debug info.  */
+     so that we can put the location information of the reference to B on
+     the inequality operator for better debug info.  */
   if (!optimize
       && TREE_CODE (gnu_result) != INTEGER_CST
+      && TREE_CODE (gnu_result) != TYPE_DECL
       && (kind == N_Identifier
          || kind == N_Expanded_Name
          || kind == N_Explicit_Dereference
@@ -7698,15 +7699,19 @@ gnat_to_gnu (Node_Id gnat_node)
          || kind == N_Selected_Component)
       && TREE_CODE (get_base_type (gnu_result_type)) == BOOLEAN_TYPE
       && !lvalue_required_p (gnat_node, gnu_result_type, false, false, false))
-    gnu_result = build_binary_op (NE_EXPR, gnu_result_type,
-                                 convert (gnu_result_type, gnu_result),
-                                 convert (gnu_result_type,
-                                          boolean_false_node));
-
-  /* Set the location information on the result.  Note that we may have
-     no result if we tried to build a CALL_EXPR node to a procedure with
-     no side-effects and optimization is enabled.  */
-  if (gnu_result && EXPR_P (gnu_result))
+    {
+      gnu_result
+       = build_binary_op (NE_EXPR, gnu_result_type,
+                          convert (gnu_result_type, gnu_result),
+                          convert (gnu_result_type, boolean_false_node));
+      if (TREE_CODE (gnu_result) != INTEGER_CST)
+       set_gnu_expr_location_from_node (gnu_result, gnat_node);
+    }
+
+  /* Set the location information on the result if it's not a simple name.
+     Note that we may have no result if we tried to build a CALL_EXPR node
+     to a procedure with no side-effects and optimization is enabled.  */
+  else if (kind != N_Identifier && gnu_result && EXPR_P (gnu_result))
     set_gnu_expr_location_from_node (gnu_result, gnat_node);
 
   /* If we're supposed to return something of void_type, it means we have
@@ -7858,6 +7863,10 @@ gnat_to_gnu_external (Node_Id gnat_node)
   if (went_into_elab_proc)
     current_function_decl = NULL_TREE;
 
+  /* Do not import locations from external units.  */
+  if (gnu_result && EXPR_P (gnu_result))
+    SET_EXPR_LOCATION (gnu_result, UNKNOWN_LOCATION);
+
   return gnu_result;
 }
 \f