Skip to content
Snippets Groups Projects
  • Lewis Hyatt's avatar
    601dbf2a
    libcpp: Fix ICE on #include after a line marker directive [PR61474] · 601dbf2a
    Lewis Hyatt authored
    As noted in the PR, GCC will segfault if a file name is first seen in a
    linemarker directive, and then later seen in a normal #include.  This is
    because the fake include process adds the file to the cache with a null PATH
    member. The normal #include finds this file in the cache and then attempts
    to use the null PATH.  Resolve by adding the file to the cache with a unique
    starting directory, so that the fake entry will only be found by a
    subsequent fake include, not by a real one.
    
    libcpp/ChangeLog:
    
    	PR preprocessor/61474
    	* files.cc (_cpp_find_file): Set DONT_READ to TRUE for fake
    	include files.
    	(_cpp_fake_include): Pass a unique cpp_dir* address so
    	the fake file will not be found when looked up for real.
    
    gcc/testsuite/ChangeLog:
    
    	PR preprocessor/61474
    	* c-c++-common/cpp/pr61474-2.h: New test.
    	* c-c++-common/cpp/pr61474.c: New test.
    	* c-c++-common/cpp/pr61474.h: New test.
    601dbf2a
    History
    libcpp: Fix ICE on #include after a line marker directive [PR61474]
    Lewis Hyatt authored
    As noted in the PR, GCC will segfault if a file name is first seen in a
    linemarker directive, and then later seen in a normal #include.  This is
    because the fake include process adds the file to the cache with a null PATH
    member. The normal #include finds this file in the cache and then attempts
    to use the null PATH.  Resolve by adding the file to the cache with a unique
    starting directory, so that the fake entry will only be found by a
    subsequent fake include, not by a real one.
    
    libcpp/ChangeLog:
    
    	PR preprocessor/61474
    	* files.cc (_cpp_find_file): Set DONT_READ to TRUE for fake
    	include files.
    	(_cpp_fake_include): Pass a unique cpp_dir* address so
    	the fake file will not be found when looked up for real.
    
    gcc/testsuite/ChangeLog:
    
    	PR preprocessor/61474
    	* c-c++-common/cpp/pr61474-2.h: New test.
    	* c-c++-common/cpp/pr61474.c: New test.
    	* c-c++-common/cpp/pr61474.h: New test.