On Thu, 2018-11-01 at 11:56 -0400, Mike Gulick wrote:
> 2018-10-31  Mike Gulick  <mgul...@mathworks.com>
> 
>       PR preprocessor/83173
>       * libcpp/files.c (_cpp_stack_include): Check if
>       line_table->highest_location is past current line before
>       decrementing.
> ---
>  libcpp/files.c | 32 +++++++++++++++++++++++---------
>  1 file changed, 23 insertions(+), 9 deletions(-)
> 
> diff --git a/libcpp/files.c b/libcpp/files.c
> index 08b7c647c91..c0165fe64e4 100644
> --- a/libcpp/files.c
> +++ b/libcpp/files.c
> @@ -1012,6 +1012,7 @@ _cpp_stack_include (cpp_reader *pfile, const
> char *fname, int angle_brackets,
>    struct cpp_dir *dir;
>    _cpp_file *file;
>    bool stacked;
> +  bool decremented = false;
>  
>    /* For -include command-line flags we have type == IT_CMDLINE.
>       When the first -include file is processed we have the case,
> where
> @@ -1035,20 +1036,33 @@ _cpp_stack_include (cpp_reader *pfile, const
> char *fname, int angle_brackets,
>      return false;
>  
>    /* Compensate for the increment in linemap_add that occurs if
> -      _cpp_stack_file actually stacks the file.  In the case of a
> -     normal #include, we're currently at the start of the line
> -     *following* the #include.  A separate source_location for this
> -     location makes no sense (until we do the LC_LEAVE), and
> -     complicates LAST_SOURCE_LINE_LOCATION.  This does not apply if
> we
> -     found a PCH file (in which case linemap_add is not called) or
> we
> -     were included from the command-line.  */
> +     _cpp_stack_file actually stacks the file.  In the case of a
> normal
> +     #include, we're currently at the start of the line *following*
> the
> +     #include.  A separate source_location for this location makes
> no
> +     sense (until we do the LC_LEAVE), and complicates
> +     LAST_SOURCE_LINE_LOCATION.  This does not apply if we found a
> PCH
> +     file (in which case linemap_add is not called) or we were
> included
> +     from the command-line.  In the case that the #include is the
> last
> +     line in the file, highest_location still points to the current
> +     line, not the start of the next line, so we do not decrement in
> +     this case.  See plugin/location-overflow-test-pr83173.h for an
> +     example.  */
>    if (file->pchname == NULL && file->err_no == 0
>        && type != IT_CMDLINE && type != IT_DEFAULT)
> -    pfile->line_table->highest_location--;
> +    {
> +      int highest_line = linemap_get_expansion_line (pfile-
> >line_table,
> +                                                  pfile-
> >line_table->highest_location);
> +      int source_line = linemap_get_expansion_line (pfile-
> >line_table, loc);
> +      if (highest_line > source_line)
> +     {
> +       pfile->line_table->highest_location--;
> +       decremented = true;
> +     }
> +    }
>  
>    stacked = _cpp_stack_file (pfile, file, type == IT_IMPORT, loc);
>  
> -  if (!stacked)
> +  if (decremented && !stacked)
>      /* _cpp_stack_file didn't stack the file, so let's rollback the
>         compensation dance we performed above.  */
>      pfile->line_table->highest_location++;

Sorry for the belated response.

This is OK for trunk (assuming your contributor paperwork is in place).

Thanks
Dave

Reply via email to