From cc811a8ae6c760955ac2dca51d8359d003c8e4f2 Mon Sep 17 00:00:00 2001 From: Bernd Edlinger Date: Tue, 30 Sep 2014 16:08:53 +0000 Subject: re PR preprocessor/58893 (:0:0: internal compiler error: Segmentation fault) 2014-09-30 Bernd Edlinger PR preprocessor/58893 * errors.c (cpp_diagnostic): Fix possible out of bounds access. * files.c (_cpp_stack_include): Initialize src_loc for IT_CMDLINE. testsuite: 2014-09-30 Bernd Edlinger PR preprocessor/58893 * gcc.dg/pr58893.c: New test case. * gcc.dg/pr58893-0.h: New include. From-SVN: r215730 --- libcpp/files.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'libcpp/files.c') diff --git a/libcpp/files.c b/libcpp/files.c index a442783..00302fd 100644 --- a/libcpp/files.c +++ b/libcpp/files.c @@ -991,6 +991,18 @@ _cpp_stack_include (cpp_reader *pfile, const char *fname, int angle_brackets, _cpp_file *file; bool stacked; + /* For -include command-line flags we have type == IT_CMDLINE. + When the first -include file is processed we have the case, where + pfile->cur_token == pfile->cur_run->base, we are directly called up + by the front end. However in the case of the second -include file, + we are called from _cpp_lex_token -> _cpp_get_fresh_line -> + cpp_push_include, with pfile->cur_token != pfile->cur_run->base, + and pfile->cur_token[-1].src_loc not (yet) initialized. + However, when the include file cannot be found, we need src_loc to + be initialized to some safe value: 0 means UNKNOWN_LOCATION. */ + if (type == IT_CMDLINE && pfile->cur_token != pfile->cur_run->base) + pfile->cur_token[-1].src_loc = 0; + dir = search_path_head (pfile, fname, angle_brackets, type); if (!dir) return false; -- cgit v1.1