Split out a new base class for temp_source_file, named_temp_file, moving the deletion to the base class dtor, so that we can write out temporary files in other ways in selftests.
gcc/ChangeLog: * selftest.c (selftest::named_temp_file::named_temp_file): New ctor. (selftest::temp_source_file::~temp_source_file): Move to... (selftest::named_temp_file::~named_temp_file): ...here. (selftest::test_named_temp_file): New function. (selftest::selftest_c_tests): Call test_named_temp_file. * selftest.h (class named_temp_file): New class. (class temp_source_file): Convert to a subclass of named_temp_file. --- gcc/selftest.c | 49 +++++++++++++++++++++++++++++++++++-------------- gcc/selftest.h | 24 +++++++++++++++++------- 2 files changed, 52 insertions(+), 21 deletions(-) diff --git a/gcc/selftest.c b/gcc/selftest.c index 629db98..e6c9510 100644 --- a/gcc/selftest.c +++ b/gcc/selftest.c @@ -120,34 +120,40 @@ selftest::assert_str_contains (const location &loc, desc_haystack, desc_needle, val_haystack, val_needle); } -/* Constructor. Create a tempfile using SUFFIX, and write CONTENT to - it. Abort if anything goes wrong, using LOC as the effective - location in the problem report. */ +/* Constructor. Generate a name for the file. */ -selftest::temp_source_file::temp_source_file (const location &loc, - const char *suffix, - const char *content) +selftest::named_temp_file::named_temp_file (const char *suffix) { m_filename = make_temp_file (suffix); ASSERT_NE (m_filename, NULL); - - FILE *out = fopen (m_filename, "w"); - if (!out) - ::selftest::fail_formatted (loc, "unable to open tempfile: %s", - m_filename); - fprintf (out, "%s", content); - fclose (out); } /* Destructor. Delete the tempfile. */ -selftest::temp_source_file::~temp_source_file () +selftest::named_temp_file::~named_temp_file () { unlink (m_filename); diagnostics_file_cache_forcibly_evict_file (m_filename); free (m_filename); } +/* Constructor. Create a tempfile using SUFFIX, and write CONTENT to + it. Abort if anything goes wrong, using LOC as the effective + location in the problem report. */ + +selftest::temp_source_file::temp_source_file (const location &loc, + const char *suffix, + const char *content) +: named_temp_file (suffix) +{ + FILE *out = fopen (get_filename (), "w"); + if (!out) + ::selftest::fail_formatted (loc, "unable to open tempfile: %s", + get_filename ()); + fprintf (out, "%s", content); + fclose (out); +} + /* Selftests for the selftest system itself. */ namespace selftest { @@ -167,12 +173,27 @@ test_assertions () ASSERT_STR_CONTAINS ("foo bar baz", "bar"); } +/* Verify named_temp_file. */ + +static void +test_named_temp_file () +{ + named_temp_file t (".txt"); + FILE *f = fopen (t.get_filename (), "w"); + if (!f) + selftest::fail_formatted (SELFTEST_LOCATION, + "unable to open %s for writing", + t.get_filename ()); + fclose (f); +} + /* Run all of the selftests within this file. */ void selftest_c_tests () { test_assertions (); + test_named_temp_file (); } } // namespace selftest diff --git a/gcc/selftest.h b/gcc/selftest.h index b073ed6..fd3c6b0 100644 --- a/gcc/selftest.h +++ b/gcc/selftest.h @@ -77,22 +77,32 @@ extern void assert_str_contains (const location &loc, const char *val_haystack, const char *val_needle); -/* A class for writing out a temporary sourcefile for use in selftests - of input handling. */ +/* A named temporary file for use in selftests. + Usable for writing out files, and as the base class for + temp_source_file. + The file is unlinked in the destructor. */ -class temp_source_file +class named_temp_file { public: - temp_source_file (const location &loc, const char *suffix, - const char *content); - ~temp_source_file (); - + named_temp_file (const char *suffix); + ~named_temp_file (); const char *get_filename () const { return m_filename; } private: char *m_filename; }; +/* A class for writing out a temporary sourcefile for use in selftests + of input handling. */ + +class temp_source_file : public named_temp_file +{ + public: + temp_source_file (const location &loc, const char *suffix, + const char *content); +}; + /* Various selftests involving location-handling require constructing a line table and one or more line maps within it. -- 1.8.5.3