C: fix logic within c_expr::get_location
authorDavid Malcolm <dmalcolm@redhat.com>
Thu, 24 Aug 2017 14:28:16 +0000 (14:28 +0000)
committerDavid Malcolm <dmalcolm@gcc.gnu.org>
Thu, 24 Aug 2017 14:28:16 +0000 (14:28 +0000)
In r251239 I added a c_expr::get_location method for use by
c_parser_expr_list for building the vec<location_t> for
an expression list, rather than using the location of the first token.

When determining whether to use the location within the tree node,
or fall back to the range in the c_expr, I used EXPR_CAN_HAVE_LOCATION,
rather than EXPR_HAS_LOCATION.  This meant that any tree nodes of kinds
that *can* have a location but which erroneously had
   EXPR_LOCATION (value) == UNKNOWN_LOCATION
had that value added to the vec<location_t>, leading to missing
location information when reporting on the issue
(seen with gcc.dg/Wtraditional-conversion-2.c for m68k).

This patch addresses this in two ways:

(a) it fixes the specific issue in this failing test case, by
    setting up the location properly on the EXCESS_PRECISION_EXPR.

(b) updating c_expr::get_location by only using the EXPR_LOCATION
    if it's sane.  Arguably this is papering over bugs, but they are
    pre-existing ones exposed by r251239, and I'd rather have this
    fix in place than play whack-a-mole on any other such "missing
    location" bugs that are lurking in the codebase.

gcc/c/ChangeLog:
* c-tree.h (c_expr::get_location) Use EXPR_HAS_LOCATION rather
than CAN_HAVE_LOCATION_P when determining whether to use the
location_t value within "value".

gcc/c-family/ChangeLog:
* c-lex.c (interpret_float): Use token location
when building an EXCESS_PRECISION_EXPR.

From-SVN: r251335

gcc/c-family/ChangeLog
gcc/c-family/c-lex.c
gcc/c/ChangeLog
gcc/c/c-tree.h

index 86a8f1c28c1ca924de0024316f278e899e848942..3dd50557907896680ea494f1630e38b0c9078fc1 100644 (file)
@@ -1,3 +1,8 @@
+2017-08-24  David Malcolm  <dmalcolm@redhat.com>
+
+       * c-lex.c (interpret_float): Use token location
+       when building an EXCESS_PRECISION_EXPR.
+
 2017-08-21  David Malcolm  <dmalcolm@redhat.com>
 
        * c-common.c (check_function_arguments): Add "arglogs" param; pass
index 3765a800a5799209bca5018dd36c9f3c53525b8f..a614b266baf165ece495342235a64a0b26398bcb 100644 (file)
@@ -988,7 +988,7 @@ interpret_float (const cpp_token *token, unsigned int flags,
     }
 
   if (type != const_type)
-    value = build1 (EXCESS_PRECISION_EXPR, type, value);
+    value = build1_loc (token->src_loc, EXCESS_PRECISION_EXPR, type, value);
 
   return value;
 }
index f58b4023cf49ac74699741eab574a51a9d48ac7e..0cf7bd26167eabece9aeda44a22f90cb84c7a2cb 100644 (file)
@@ -1,3 +1,9 @@
+2017-08-24  David Malcolm  <dmalcolm@redhat.com>
+
+       * c-tree.h (c_expr::get_location) Use EXPR_HAS_LOCATION rather
+       than CAN_HAVE_LOCATION_P when determining whether to use the
+       location_t value within "value".
+
 2017-08-21  David Malcolm  <dmalcolm@redhat.com>
 
        * c-parser.c (c_parser_expr_list): Use c_expr::get_location ()
index 5182cc539ecef1bd02744dcd9a8ed84af42f042d..96c7ae7613ff5049b2d39bb19266ea2706de8193 100644 (file)
@@ -149,7 +149,7 @@ struct c_expr
 
   location_t get_location () const
   {
-    if (CAN_HAVE_LOCATION_P (value))
+    if (EXPR_HAS_LOCATION (value))
       return EXPR_LOCATION (value);
     else
       return make_location (get_start (), get_start (), get_finish ());