diff mbox

Fix PR65550, ICE on invalid PCH use

Message ID alpine.LSU.2.11.1504091502270.6786@zhemvz.fhfr.qr
State New
Headers show

Commit Message

Richard Biener April 9, 2015, 1:03 p.m. UTC
The following makes the checks whether the context allows a PCH file
(only the first include may be one, and not nested) more robust
thereby fixing PR65550.

Bootstrapped and tested on x86_64-unknown-linux-gnu - ok?

Thanks,
Richard.

2015-04-09  Richard Biener  <rguenther@suse.de>

	PR pch/65550
	* files.c (pch_open_file): Allow main and pre-included files
	when trying to open a PCH.

Comments

Jakub Jelinek April 9, 2015, 1:19 p.m. UTC | #1
On Thu, Apr 09, 2015 at 03:03:38PM +0200, Richard Biener wrote:
> The following makes the checks whether the context allows a PCH file
> (only the first include may be one, and not nested) more robust
> thereby fixing PR65550.
> 
> Bootstrapped and tested on x86_64-unknown-linux-gnu - ok?
> 
> Thanks,
> Richard.
> 
> 2015-04-09  Richard Biener  <rguenther@suse.de>
> 
> 	PR pch/65550
> 	* files.c (pch_open_file): Allow main and pre-included files
> 	when trying to open a PCH.

Ok.  If it wouldn't be too hard to add a testcase, it would be appreciated,
but if it isn't that easy, just commit it as is (or add testcase
later).

	Jakub
diff mbox

Patch

Index: libcpp/files.c
===================================================================
--- libcpp/files.c	(revision 221942)
+++ libcpp/files.c	(working copy)
@@ -291,11 +291,13 @@  pch_open_file (cpp_reader *pfile, _cpp_f
 
   /* If the file is not included as first include from either the toplevel
      file or the command-line it is not a valid use of PCH.  */
-  if (pfile->all_files
-      && pfile->all_files->next_file
-      && !(pfile->all_files->implicit_preinclude
-	   || pfile->all_files->next_file->implicit_preinclude))
-    return false;
+  for (_cpp_file *f = pfile->all_files; f; f = f->next_file)
+    if (f->implicit_preinclude)
+      continue;
+    else if (f->main_file)
+      break;
+    else
+      return false;
 
   flen = strlen (path);
   len = flen + sizeof (extension);