Fix #2149523 - Incorrect line number reporting in errors after parsing macros. Remove extraneous extra line in preprocessed output which would sometimes lead to error/warning messages two lines after the end of the file

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@12211 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
William S Fulton 2010-09-10 06:08:45 +00:00
commit 122bc852f9
6 changed files with 73 additions and 9 deletions

View file

@ -5,6 +5,15 @@ See the RELEASENOTES file for a summary of changes in each release.
Version 2.0.1 (in progress) Version 2.0.1 (in progress)
=========================== ===========================
2010-09-10: wsfulton
Remove extraneous extra line in preprocessed output after including files
which would sometimes lead to error/warning messages two lines after the
end of the file.
2010-09-10: wsfulton
Fix #2149523 - Incorrect line number reporting in errors after parsing macros
containing C++ comments.
2010-09-08: olly 2010-09-08: olly
[PHP] Fix handling of OUTPUT typemaps (Patch from Ryan in SF#3058394). [PHP] Fix handling of OUTPUT typemaps (Patch from Ryan in SF#3058394).

View file

@ -26,13 +26,15 @@ c_varargs
c_varargs_neg c_varargs_neg
nomodule nomodule
pp_badeval pp_badeval
pp_deprecated pp_constant
pp_defined pp_defined
pp_macro_defined_unterminated pp_deprecated
pp_illegal_argument pp_illegal_argument
pp_macro_args pp_macro_args
pp_macro_badchar pp_macro_badchar
pp_macro_defined_unterminated
pp_macro_expansion pp_macro_expansion
pp_macro_inline_unterminated
pp_macro_nargs pp_macro_nargs
pp_macro_redef pp_macro_redef
pp_macro_rparen pp_macro_rparen

View file

@ -0,0 +1,43 @@
%module xxx
/* Test preprocessor comments and their effect on line number reporting on later errors */
#define A1 1234
#define A2 1234 /*C comment*/
#define A3 1234
%constant int aaa=;
#define B1 1234
#define B2 1234 //C++ comment
#define B3 1234
%constant int bbb=;
#define C1 1234
#define C2 1234 /*multiline
C
comment */
#define C3 1234
%constant int ccc=;
#define D1 1234
#define /*C Comment*/ D2 1234
#define D3 1234
%constant int ddd=;
#define E1 1234
#/*C comment*/define E2 1234
#define E3 1234
%constant int eee=;
#define F1 1234
#define F2 1234 \
// C comment
#define F3 1234
%constant int fff=;

View file

@ -0,0 +1,11 @@
%module xxx
%define foo(a,x)
int ii;
%enddef
%inline %{
struct Struct {
foo(2,
};
%}

View file

@ -1445,15 +1445,14 @@ String *Preprocessor_parse(String *s) {
state = 43; state = 43;
} }
break; break;
case 46: case 46: /* in C++ comment */
if (c == '\n') { if (c == '\n') {
Ungetc(c, s); Ungetc(c, s);
cpp_lines++;
state = 50; state = 50;
} else } else
Putc(c, comment); Putc(c, comment);
break; break;
case 47: case 47: /* in C comment */
if (c == '*') if (c == '*')
state = 48; state = 48;
else else
@ -1638,7 +1637,7 @@ String *Preprocessor_parse(String *s) {
} }
s2 = Preprocessor_parse(s1); s2 = Preprocessor_parse(s1);
addline(ns, s2, allow); addline(ns, s2, allow);
Append(ns, "\n]"); Append(ns, "]");
if (dirname) { if (dirname) {
Swig_pop_directory(); Swig_pop_directory();
} }
@ -1784,7 +1783,7 @@ String *Preprocessor_parse(String *s) {
pop_imported(); pop_imported();
} }
addline(ns, s2, allow); addline(ns, s2, allow);
Append(ns, "\n]"); Append(ns, "]");
Delete(s2); Delete(s2);
Delete(s1); Delete(s1);
} }
@ -1845,7 +1844,6 @@ String *Preprocessor_parse(String *s) {
Seek(value, 0, SEEK_SET); Seek(value, 0, SEEK_SET);
Preprocessor_define(value, 1); Preprocessor_define(value, 1);
} }
/* Putc('\n',ns); */
addline(ns, value, 0); addline(ns, value, 0);
state = 0; state = 0;
} }
@ -1884,6 +1882,5 @@ String *Preprocessor_parse(String *s) {
Delete(comment); Delete(comment);
Delete(chunk); Delete(chunk);
/* fprintf(stderr,"cpp: %d\n", Len(Getattr(cpp,"symbols"))); */
return ns; return ns;
} }

View file

@ -221,6 +221,8 @@ String *Swig_read_file(FILE *f) {
Append(str, buffer); Append(str, buffer);
} }
len = Len(str); len = Len(str);
/* Add a newline if not present on last line -- the preprocessor seems to
* rely on \n and not EOF terminating lines */
if (len) { if (len) {
char *cstr = Char(str); char *cstr = Char(str);
if (cstr[len - 1] != '\n') { if (cstr[len - 1] != '\n') {