diff options
| author | seyko <seyko2@gmail.com> | 2016-04-13 06:17:02 +0300 |
|---|---|---|
| committer | seyko <seyko2@gmail.com> | 2016-04-13 06:17:02 +0300 |
| commit | b5b3e89f9e6735eb33eedd2b3071acd38222ee04 (patch) | |
| tree | 4d9d3b63aea4bfddc5d980b12aeb05b0d344fe9d /tccpp.c | |
| parent | b0296139a8ca3c15cd601ca1449e6547c8a352a0 (diff) | |
| download | tinycc-b5b3e89f9e6735eb33eedd2b3071acd38222ee04.tar.gz tinycc-b5b3e89f9e6735eb33eedd2b3071acd38222ee04.tar.bz2 | |
Fix pragma once guard
From: Vlad Vissoultchev
Date: Mon, 11 Apr 2016 01:26:32 +0300
Subject: Fix pragma once guard when compiling multiple source files
When compiling multiple source files directly to executable cached
include files guard was incorrectly checked for TOK_once in ifndef_macro
member.
If two source files included the same header guarded by pragma once, then
the second one erroneously skipped it as `cached_includes` is not cleared
on second `tcc_compile`
Diffstat (limited to 'tccpp.c')
| -rw-r--r-- | tccpp.c | 7 |
1 files changed, 5 insertions, 2 deletions
@@ -1471,8 +1471,11 @@ static void pragma_parse(TCCState *s1) tcc_warning("unbalanced #pragma pop_macro"); } else if (tok == TOK_once) { - add_cached_include(s1, file->filename, TOK_once); + char buf1[sizeof file->filename]; + pstrcpy(buf1, sizeof(buf1), "#once#"); + pstrcat(buf1, sizeof(buf1), file->filename); + add_cached_include(s1, file->filename, tok_alloc(buf1, strlen(buf1))->tok); } else if (s1->ppfp) { /* tcc -E: keep pragmas below unchanged */ unget_tok(' '); @@ -1670,7 +1673,7 @@ ST_FUNC void preprocess(int is_bof) pstrcat(buf1, sizeof(buf1), buf); e = search_cached_include(s1, buf1); - if (e && (define_find(e->ifndef_macro) || e->ifndef_macro == TOK_once)) { + if (e && define_find(e->ifndef_macro)) { /* no need to parse the include because the 'ifndef macro' is defined */ #ifdef INC_DEBUG |
