aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorseyko <seyko2@gmail.com>2015-10-17 15:48:10 +0300
committerseyko <seyko2@gmail.com>2015-10-17 15:48:10 +0300
commit6b9490b6ff5e47e88a39ce9523f54fc56ff0dd25 (patch)
treedf7847beedc07bf391f9f377afb6b9e1991f12b0
parentad524bb6c7de7134e1111343468949f74a19c0d8 (diff)
downloadtinycc-6b9490b6ff5e47e88a39ce9523f54fc56ff0dd25.tar.gz
tinycc-6b9490b6ff5e47e88a39ce9523f54fc56ff0dd25.tar.bz2
fix for the #include_next, v2
A more correct fix. This one don't break old logic. But if include file is not found, we try to search again with the new compare rule. A description of the problem: http://permalink.gmane.org/gmane.comp.compilers.tinycc.devel/2769
-rw-r--r--tccpp.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/tccpp.c b/tccpp.c
index 7ec0d44..849ba8e 100644
--- a/tccpp.c
+++ b/tccpp.c
@@ -1528,6 +1528,7 @@ ST_FUNC void preprocess(int is_bof)
int i, c, n, saved_parse_flags;
char buf[1024], *q;
Sym *s;
+ int include_next_first_try = 1;
saved_parse_flags = parse_flags;
parse_flags = PARSE_FLAG_PREPROCESS
@@ -1617,6 +1618,7 @@ ST_FUNC void preprocess(int is_bof)
/* store current file in stack, but increment stack later below */
*s1->include_stack_ptr = file;
+ search_again:
n = s1->nb_include_paths + s1->nb_sysinclude_paths;
for (i = -2; i < n; ++i) {
char buf1[sizeof file->filename];
@@ -1650,14 +1652,22 @@ ST_FUNC void preprocess(int is_bof)
pstrcat(buf1, sizeof(buf1), buf);
- if (tok == TOK_INCLUDE_NEXT)
+ if (tok == TOK_INCLUDE_NEXT) {
for (f = s1->include_stack_ptr; f >= s1->include_stack; --f)
+ if (include_next_first_try) {
if (0 == PATHCMP((*f)->filename, buf1)) {
#ifdef INC_DEBUG
printf("%s: #include_next skipping %s\n", file->filename, buf1);
#endif
+ include_next_first_try++;
goto include_trynext;
}
+ } else {
+ if (0 == PATHCMP(file->filename, buf1)) {
+ goto include_trynext;
+ }
+ }
+ }
e = search_cached_include(s1, buf1);
if (e && (define_find(e->ifndef_macro) || e->ifndef_macro == TOK_once)) {
@@ -1688,6 +1698,10 @@ include_trynext:
ch = file->buf_ptr[0];
goto the_end;
}
+ if (include_next_first_try > 1) {
+ include_next_first_try = 0;
+ goto search_again;
+ }
tcc_error("include file '%s' not found", buf);
include_done:
break;