mirror of https://github.com/swig/swig
Fix regression parsing gcc preprocessor linemarkers
These are preprocessor statement in the form: # linenum filename flags Closes #1475
This commit is contained in:
parent
9038a9987d
commit
1f46d9b7b9
|
@ -7,6 +7,11 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/
|
|||
Version 4.0.0 (in progress)
|
||||
===========================
|
||||
|
||||
2019-02-19: wsfulton
|
||||
#1475 Fix regression parsing gcc preprocessor linemarkers in the form:
|
||||
|
||||
# linenum filename flags
|
||||
|
||||
2019-02-18: jakecobb
|
||||
[Python] #945 #1234 Elements in std::vector memory access fix.
|
||||
|
||||
|
|
|
@ -707,6 +707,7 @@ C_TEST_CASES += \
|
|||
preproc \
|
||||
preproc_constants_c \
|
||||
preproc_defined \
|
||||
preproc_gcc_output \
|
||||
preproc_include \
|
||||
preproc_line_file \
|
||||
register_par \
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
%module xxx
|
||||
|
||||
// Testing is_digits detecting gcc linemarkers
|
||||
|
||||
// These are valid
|
||||
# 1 "/usr/include/stdc-predef.h" 1 3 4
|
||||
# 123 "header1.h"
|
||||
|
||||
// These are invalid
|
||||
#a1 'a.h'
|
||||
#1b 'b.h'
|
||||
#1c1 'c.h'
|
||||
#d1d 'd.h'
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
pp_unknowndirective3.i:10: Error: Unknown SWIG preprocessor directive: a1 (if this is a block of target language code, delimit it with %{ and %})
|
||||
pp_unknowndirective3.i:11: Error: Unknown SWIG preprocessor directive: 1b (if this is a block of target language code, delimit it with %{ and %})
|
||||
pp_unknowndirective3.i:12: Error: Unknown SWIG preprocessor directive: 1c1 (if this is a block of target language code, delimit it with %{ and %})
|
||||
pp_unknowndirective3.i:13: Error: Unknown SWIG preprocessor directive: d1d (if this is a block of target language code, delimit it with %{ and %})
|
|
@ -0,0 +1,13 @@
|
|||
# 1 "header1.h"
|
||||
# 1 "<built-in>"
|
||||
# 1 "<command-line>"
|
||||
# 1 "/usr/include/stdc-predef.h" 1 3 4
|
||||
# 1 "<command-line>" 2
|
||||
# 1 "header1.h"
|
||||
# 18 "header1.h"
|
||||
void header1_function_a(int a);
|
||||
# 1 "header2.h" 1
|
||||
# 13 "header2.h"
|
||||
void header2_function(int x);
|
||||
# 20 "header1.h" 2
|
||||
void header1_function_b(int b);
|
|
@ -0,0 +1,12 @@
|
|||
%module preproc_gcc_output
|
||||
// Testcase for Github issue #1475 using the output of gcc -E
|
||||
|
||||
// The file below was generated using 'gcc -E header1.h'
|
||||
// where header1.h included header2.h
|
||||
%include "preproc_gcc_output.h"
|
||||
|
||||
%{
|
||||
void header1_function_a(int a) {}
|
||||
void header2_function(int x) {}
|
||||
void header1_function_b(int b) {}
|
||||
%}
|
|
@ -0,0 +1,5 @@
|
|||
import preproc_gcc_output
|
||||
|
||||
preproc_gcc_output.header1_function_a(99)
|
||||
preproc_gcc_output.header1_function_b(99)
|
||||
preproc_gcc_output.header2_function(99)
|
|
@ -109,6 +109,19 @@ static String *cpp_include(const_String_or_char_ptr fn, int sysfile) {
|
|||
return s;
|
||||
}
|
||||
|
||||
static int is_digits(const String *str) {
|
||||
const char *s = Char(str);
|
||||
int isdigits = (*s != 0);
|
||||
while (*s) {
|
||||
if (!isdigit(*s)) {
|
||||
isdigits = 0;
|
||||
break;
|
||||
}
|
||||
s++;
|
||||
}
|
||||
return isdigits;
|
||||
}
|
||||
|
||||
List *Preprocessor_depend(void) {
|
||||
return dependencies;
|
||||
}
|
||||
|
@ -1484,7 +1497,7 @@ String *Preprocessor_parse(String *s) {
|
|||
Putc(c, id);
|
||||
break;
|
||||
|
||||
case 42: /* Strip any leading space before preprocessor value */
|
||||
case 42: /* Strip any leading space after the preprocessor directive (before preprocessor value) */
|
||||
if (isspace(c)) {
|
||||
if (c == '\n') {
|
||||
Ungetc(c, s);
|
||||
|
@ -1804,6 +1817,8 @@ String *Preprocessor_parse(String *s) {
|
|||
Swig_error(Getfile(s), Getline(id), "cpp debug: level = %d, startlevel = %d\n", level, start_level);
|
||||
} else if (Equal(id, "")) {
|
||||
/* Null directive */
|
||||
} else if (is_digits(id)) {
|
||||
/* A gcc linemarker of the form '# linenum filename flags' (resulting from running gcc -E) */
|
||||
} else {
|
||||
/* Ignore unknown preprocessor directives which are inside an inactive
|
||||
* conditional (github issue #394). */
|
||||
|
|
Loading…
Reference in New Issue