diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d43d00e164b..fa764e86425 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2016-08-30 David Malcolm + + * 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. + 2016-08-30 Segher Boessenkool * config/rs6000/rs6000.c (rs6000_emit_epilogue): Do not emit diff --git a/gcc/selftest.c b/gcc/selftest.c index 629db98b9f6..e6c95105522 100644 --- a/gcc/selftest.c +++ b/gcc/selftest.c @@ -120,6 +120,23 @@ selftest::assert_str_contains (const location &loc, desc_haystack, desc_needle, val_haystack, val_needle); } +/* Constructor. Generate a name for the file. */ + +selftest::named_temp_file::named_temp_file (const char *suffix) +{ + m_filename = make_temp_file (suffix); + ASSERT_NE (m_filename, NULL); +} + +/* Destructor. Delete the tempfile. */ + +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. */ @@ -127,27 +144,16 @@ selftest::assert_str_contains (const location &loc, selftest::temp_source_file::temp_source_file (const location &loc, const char *suffix, const char *content) +: named_temp_file (suffix) { - m_filename = make_temp_file (suffix); - ASSERT_NE (m_filename, NULL); - - FILE *out = fopen (m_filename, "w"); + FILE *out = fopen (get_filename (), "w"); if (!out) ::selftest::fail_formatted (loc, "unable to open tempfile: %s", - m_filename); + get_filename ()); fprintf (out, "%s", content); fclose (out); } -/* Destructor. Delete the tempfile. */ - -selftest::temp_source_file::~temp_source_file () -{ - unlink (m_filename); - diagnostics_file_cache_forcibly_evict_file (m_filename); - free (m_filename); -} - /* 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 e2d73565628..47d73503370 100644 --- a/gcc/selftest.h +++ b/gcc/selftest.h @@ -78,22 +78,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.