diff mbox series

[v3,1/3] PR preprocessor/83173: Additional check before decrementing highest_location

Message ID 20181101155607.11388-2-mgulick@mathworks.com
State New
Headers show
Series PR preprocessor/83173: C preprocessor generates incorrect linemarkers | expand

Commit Message

Mike Gulick Nov. 1, 2018, 3:56 p.m. UTC
2018-10-31  Mike Gulick  <mgulick@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(-)

Comments

David Malcolm Nov. 2, 2018, 9:13 p.m. UTC | #1
On Thu, 2018-11-01 at 11:56 -0400, Mike Gulick wrote:
> 2018-10-31  Mike Gulick  <mgulick@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
Mike Gulick Nov. 2, 2018, 9:34 p.m. UTC | #2
On 11/2/18 5:13 PM, David Malcolm wrote:
> On Thu, 2018-11-01 at 11:56 -0400, Mike Gulick wrote:
>> 2018-10-31  Mike Gulick  <mgulick@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
> 
Thanks Dave.  I don't have contributor paperwork in place for gcc.  I was under the impressed the request needed to be initiated by a maintainer, but if I can make the request myself let me know and I will do so.  I do have an employer copyright disclaimer already approved which includes gcc, so the process should be quick.

Thanks,
Mike
Jeff Law Nov. 2, 2018, 10:50 p.m. UTC | #3
On 11/2/18 3:34 PM, Mike Gulick wrote:
> On 11/2/18 5:13 PM, David Malcolm wrote:
>> On Thu, 2018-11-01 at 11:56 -0400, Mike Gulick wrote:
>>> 2018-10-31  Mike Gulick  <mgulick@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
>>
> Thanks Dave.  I don't have contributor paperwork in place for gcc.  I was under the impressed the request needed to be initiated by a maintainer, but if I can make the request myself let me know and I will do so.  I do have an employer copyright disclaimer already approved which includes gcc, so the process should be quick.
Contact assign@gnu.org and indicate to them you need a past and future
copyright assignment for GCC.

jeff
diff mbox series

Patch

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++;