From dbf96d49454d608b5cb9e39e341e13b60ec7965e Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Mon, 2 Jul 2018 20:05:21 +0000 Subject: [PATCH] selftest: introduce class auto_fix_quotes This patch moves a workaround for locale differences from a selftest in pretty-print.c to selftest.h/c to make it reusable; I need this for a selftest in a followup patch. gcc/ChangeLog: * pretty-print.c (selftest::test_pp_format): Move save and restore of quotes to class auto_fix_quotes, and add an instance. * selftest.c: Include "intl.h". (selftest::auto_fix_quotes::auto_fix_quotes): New ctor. (selftest::auto_fix_quotes::~auto_fix_quotes): New dtor. * selftest.h (selftest::auto_fix_quotes): New class. From-SVN: r262317 --- gcc/ChangeLog | 9 +++++++++ gcc/pretty-print.c | 9 +-------- gcc/selftest.c | 20 ++++++++++++++++++++ gcc/selftest.h | 20 ++++++++++++++++++++ 4 files changed, 50 insertions(+), 8 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0a8395949cf..e0b5c65062a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2018-07-02 David Malcolm + + * pretty-print.c (selftest::test_pp_format): Move save and restore + of quotes to class auto_fix_quotes, and add an instance. + * selftest.c: Include "intl.h". + (selftest::auto_fix_quotes::auto_fix_quotes): New ctor. + (selftest::auto_fix_quotes::~auto_fix_quotes): New dtor. + * selftest.h (selftest::auto_fix_quotes): New class. + 2018-07-02 Richard Henderson * config/aarch64/aarch64-protos.h, config/aarch64/aarch64.c diff --git a/gcc/pretty-print.c b/gcc/pretty-print.c index 8babbffda71..df3ee811fd5 100644 --- a/gcc/pretty-print.c +++ b/gcc/pretty-print.c @@ -2102,10 +2102,7 @@ test_pp_format () { /* Avoid introducing locale-specific differences in the results by hardcoding open_quote and close_quote. */ - const char *old_open_quote = open_quote; - const char *old_close_quote = close_quote; - open_quote = "`"; - close_quote = "'"; + auto_fix_quotes fix_quotes; /* Verify that plain text is passed through unchanged. */ assert_pp_format (SELFTEST_LOCATION, "unformatted", "unformatted"); @@ -2187,10 +2184,6 @@ test_pp_format () assert_pp_format (SELFTEST_LOCATION, "item 3 of 7", "item %i of %i", 3, 7); assert_pp_format (SELFTEST_LOCATION, "problem with `bar' at line 10", "problem with %qs at line %i", "bar", 10); - - /* Restore old values of open_quote and close_quote. */ - open_quote = old_open_quote; - close_quote = old_close_quote; } /* Run all of the selftests within this file. */ diff --git a/gcc/selftest.c b/gcc/selftest.c index 27de9a41b79..dc90557d79d 100644 --- a/gcc/selftest.c +++ b/gcc/selftest.c @@ -21,6 +21,7 @@ along with GCC; see the file COPYING3. If not see #include "system.h" #include "coretypes.h" #include "selftest.h" +#include "intl.h" #if CHECKING_P @@ -192,6 +193,25 @@ temp_source_file::temp_source_file (const location &loc, fclose (out); } +/* Avoid introducing locale-specific differences in the results + by hardcoding open_quote and close_quote. */ + +auto_fix_quotes::auto_fix_quotes () +{ + m_saved_open_quote = open_quote; + m_saved_close_quote = close_quote; + open_quote = "`"; + close_quote = "'"; +} + +/* Restore old values of open_quote and close_quote. */ + +auto_fix_quotes::~auto_fix_quotes () +{ + open_quote = m_saved_open_quote; + close_quote = m_saved_close_quote; +} + /* Read the contents of PATH into memory, returning a 0-terminated buffer that must be freed by the caller. Fail (and abort) if there are any problems, with LOC as the reported diff --git a/gcc/selftest.h b/gcc/selftest.h index d66fb93d1a5..54fc488d845 100644 --- a/gcc/selftest.h +++ b/gcc/selftest.h @@ -113,6 +113,26 @@ class temp_source_file : public named_temp_file const char *content); }; +/* RAII-style class for avoiding introducing locale-specific differences + in strings containing localized quote marks, by temporarily overriding + the "open_quote" and "close_quote" globals to something hardcoded. + + Specifically, the C locale's values are used: + - open_quote becomes "`" + - close_quote becomes "'" + for the lifetime of the object. */ + +class auto_fix_quotes +{ + public: + auto_fix_quotes (); + ~auto_fix_quotes (); + + private: + const char *m_saved_open_quote; + const char *m_saved_close_quote; +}; + /* Various selftests involving location-handling require constructing a line table and one or more line maps within it. -- 2.30.2