Message ID | 20181101155607.11388-2-mgulick@mathworks.com |
---|---|
State | New |
Headers | show |
Series | PR preprocessor/83173: C preprocessor generates incorrect linemarkers | expand |
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
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
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 --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++;