I noticed whilst working on another issue that in diagnostic-show-locus within the quoted source lines and the annotation underlines that when we're showing highlight-{a,b} that we emit start-colorization-code, character, end-colorization-code per *character*, rather than just when the colorization changes.
This was due to me failing to implement consolidation of such changes in colorizer::set_named_color in r15-2015-g7d73c01ce6d1ab. Fixed thusly, simplifying the output. I manually inspected all of the changed testcases in a terminal with color enabled and verified that the output is visually identical to before. Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu. Pushed to trunk as r16-1002-g333628a1e29641. gcc/ChangeLog: * diagnostic-show-locus.cc (colorizer::m_current_named_color): New field. (colorizer::set_named_color): Use it to consolidate repeated calls to the same color. gcc/testsuite/ChangeLog: * g++.dg/diagnostic/bad-binary-ops-highlight-colors.C: Update expected multiline output for quoted source and underlines to reflect emitting color codes when changes happen, rather than per character. * g++.dg/diagnostic/long-short-colorization.C: Likewise. * g++.dg/plugin/show-template-tree-color-labels.C: Likewise. * gcc.dg/bad-binary-ops-highlight-colors.c: Likewise. * gcc.dg/format/colors.c: Likewise. Signed-off-by: David Malcolm <dmalc...@redhat.com> --- gcc/diagnostic-show-locus.cc | 5 +++++ .../g++.dg/diagnostic/bad-binary-ops-highlight-colors.C | 4 ++-- gcc/testsuite/g++.dg/diagnostic/long-short-colorization.C | 8 ++++---- .../g++.dg/plugin/show-template-tree-color-labels.C | 4 ++-- gcc/testsuite/gcc.dg/bad-binary-ops-highlight-colors.c | 4 ++-- gcc/testsuite/gcc.dg/format/colors.c | 4 ++-- 6 files changed, 17 insertions(+), 12 deletions(-) diff --git a/gcc/diagnostic-show-locus.cc b/gcc/diagnostic-show-locus.cc index 397fffbb79e8..c6a0cd80ce8c 100644 --- a/gcc/diagnostic-show-locus.cc +++ b/gcc/diagnostic-show-locus.cc @@ -148,6 +148,7 @@ class colorizer const char *m_fixit_insert; const char *m_fixit_delete; const char *m_stop_color; + std::string m_current_named_color; }; /* In order to handle multibyte sources properly, all of this logic needs to be @@ -932,9 +933,13 @@ colorizer::~colorizer () void colorizer::set_named_color (const char *color) { + if (m_current_state == STATE_NAMED_COLOR + && color == m_current_named_color) + return; finish_state (m_current_state); m_current_state = STATE_NAMED_COLOR; pp_string (&m_pp, colorize_start (pp_show_color (&m_pp), color)); + m_current_named_color = color; } /* Update state, printing color codes if necessary if there's a state diff --git a/gcc/testsuite/g++.dg/diagnostic/bad-binary-ops-highlight-colors.C b/gcc/testsuite/g++.dg/diagnostic/bad-binary-ops-highlight-colors.C index 12603456b484..687af3209809 100644 --- a/gcc/testsuite/g++.dg/diagnostic/bad-binary-ops-highlight-colors.C +++ b/gcc/testsuite/g++.dg/diagnostic/bad-binary-ops-highlight-colors.C @@ -23,8 +23,8 @@ int test_4 (void) { dg-end-multiline-output "" } */ /* { dg-begin-multiline-output "" } - return [01;32m[Kc[m[K[01;32m[Ka[m[K[01;32m[Kl[m[K[01;32m[Kl[m[K[01;32m[Ke[m[K[01;32m[Ke[m[K[01;32m[K_[m[K[01;32m[K4[m[K[01;32m[Ka[m[K[01;32m[K [m[K[01;32m[K([m[K[01;32m[K)[m[K [01;31m[K+[m[K [01;34m[Kc[m[K[01;34m[Ka[m[K[01;34m[Kl[m[K[01;34m[Kl[m[K[01;34m[Ke[m[K[01;34m[Ke[m[K[01;34m[K_[m[K[01;34m[K4[m[K[01;34m[Kb[m[K[01;34m[K [m[K[01;34m[K([m[K[01;34m[K)[m[K; - [01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K [01;31m[K^[m[K [01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K + return [01;32m[Kcallee_4a ()[m[K [01;31m[K+[m[K [01;34m[Kcallee_4b ()[m[K; + [01;32m[K~~~~~~~~~~~~[m[K [01;31m[K^[m[K [01;34m[K~~~~~~~~~~~~[m[K [01;32m[K|[m[K [01;34m[K|[m[K [01;32m[KS {aka s}[m[K [01;34m[KT {aka t}[m[K { dg-end-multiline-output "" } */ diff --git a/gcc/testsuite/g++.dg/diagnostic/long-short-colorization.C b/gcc/testsuite/g++.dg/diagnostic/long-short-colorization.C index d2111fee1d21..1c29ceae011d 100644 --- a/gcc/testsuite/g++.dg/diagnostic/long-short-colorization.C +++ b/gcc/testsuite/g++.dg/diagnostic/long-short-colorization.C @@ -6,14 +6,14 @@ long short int a; /* { dg-begin-multiline-output "" } [m[K'[01m[K[01;32m[Klong[m[K[m[K' and '[01m[K[01;34m[Kshort[m[K[m[K' specified together - [01;32m[Kl[m[K[01;32m[Ko[m[K[01;32m[Kn[m[K[01;32m[Kg[m[K [01;34m[Ks[m[K[01;34m[Kh[m[K[01;34m[Ko[m[K[01;34m[Kr[m[K[01;34m[Kt[m[K int a; - [01;32m[K^[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K [01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K + [01;32m[Klong[m[K [01;34m[Kshort[m[K int a; + [01;32m[K^~~~[m[K [01;34m[K~~~~~[m[K { dg-end-multiline-output "" } */ short long int b; /* { dg-begin-multiline-output "" } [m[K'[01m[K[01;32m[Klong[m[K[m[K' and '[01m[K[01;34m[Kshort[m[K[m[K' specified together - [01;34m[Ks[m[K[01;34m[Kh[m[K[01;34m[Ko[m[K[01;34m[Kr[m[K[01;34m[Kt[m[K [01;32m[Kl[m[K[01;32m[Ko[m[K[01;32m[Kn[m[K[01;32m[Kg[m[K int b; - [01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K [01;32m[K^[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K + [01;34m[Kshort[m[K [01;32m[Klong[m[K int b; + [01;34m[K~~~~~[m[K [01;32m[K^~~~[m[K { dg-end-multiline-output "" } */ // Discard the remaining colorized output that confuses dejagnu. diff --git a/gcc/testsuite/g++.dg/plugin/show-template-tree-color-labels.C b/gcc/testsuite/g++.dg/plugin/show-template-tree-color-labels.C index 75488cb6e0f1..3e9312665c79 100644 --- a/gcc/testsuite/g++.dg/plugin/show-template-tree-color-labels.C +++ b/gcc/testsuite/g++.dg/plugin/show-template-tree-color-labels.C @@ -16,8 +16,8 @@ void test_1 (vector<double> vec) fn_1 (vec); /* { dg-begin-multiline-output "" } could not convert '[01m[Kvec[m[K' from '[01m[Kvector<[01;32m[Kdouble[m[K>[m[K' to '[01m[Kvector<[01;34m[Kint[m[K>[m[K' - fn_1 ([01;32m[Kv[m[K[01;32m[Ke[m[K[01;32m[Kc[m[K); - [01;32m[K^[m[K[01;32m[K~[m[K[01;32m[K~[m[K + fn_1 ([01;32m[Kvec[m[K); + [01;32m[K^~~[m[K [01;32m[K|[m[K [01;32m[Kvector<double>[m[K { dg-end-multiline-output "" } */ diff --git a/gcc/testsuite/gcc.dg/bad-binary-ops-highlight-colors.c b/gcc/testsuite/gcc.dg/bad-binary-ops-highlight-colors.c index efbcdf39c502..da98f1a4140e 100644 --- a/gcc/testsuite/gcc.dg/bad-binary-ops-highlight-colors.c +++ b/gcc/testsuite/gcc.dg/bad-binary-ops-highlight-colors.c @@ -23,8 +23,8 @@ int test_4 (void) { dg-end-multiline-output "" } */ /* { dg-begin-multiline-output "" } - return [01;32m[Kc[m[K[01;32m[Ka[m[K[01;32m[Kl[m[K[01;32m[Kl[m[K[01;32m[Ke[m[K[01;32m[Ke[m[K[01;32m[K_[m[K[01;32m[K4[m[K[01;32m[Ka[m[K[01;32m[K [m[K[01;32m[K([m[K[01;32m[K)[m[K [01;31m[K+[m[K [01;34m[Kc[m[K[01;34m[Ka[m[K[01;34m[Kl[m[K[01;34m[Kl[m[K[01;34m[Ke[m[K[01;34m[Ke[m[K[01;34m[K_[m[K[01;34m[K4[m[K[01;34m[Kb[m[K[01;34m[K [m[K[01;34m[K([m[K[01;34m[K)[m[K; - [01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K [01;31m[K^[m[K [01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K + return [01;32m[Kcallee_4a ()[m[K [01;31m[K+[m[K [01;34m[Kcallee_4b ()[m[K; + [01;32m[K~~~~~~~~~~~~[m[K [01;31m[K^[m[K [01;34m[K~~~~~~~~~~~~[m[K [01;32m[K|[m[K [01;34m[K|[m[K [01;32m[K|[m[K [01;34m[KT {aka struct t}[m[K [01;32m[KS {aka struct s}[m[K diff --git a/gcc/testsuite/gcc.dg/format/colors.c b/gcc/testsuite/gcc.dg/format/colors.c index 43484b70a2a1..42cfd5043d42 100644 --- a/gcc/testsuite/gcc.dg/format/colors.c +++ b/gcc/testsuite/gcc.dg/format/colors.c @@ -15,8 +15,8 @@ void test_mismatching_types (const char *msg) warning: [m[Kformat '[01m[K[01;32m[K%i[m[K[m[K' expects argument of type '[01m[K[01;32m[Kint[m[K[m[K', but argument 2 has type '[01m[K[01;34m[Kconst char *[m[K[m[K' [[01;35m[K-Wformat=[m[K] { dg-end-multiline-output "" } */ /* { dg-begin-multiline-output "" } - printf("hello [01;32m[K%[m[K[01;32m[Ki[m[K", [01;34m[Km[m[K[01;34m[Ks[m[K[01;34m[Kg[m[K); - [01;32m[K~[m[K[01;32m[K^[m[K [01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K + printf("hello [01;32m[K%i[m[K", [01;34m[Kmsg[m[K); + [01;32m[K~^[m[K [01;34m[K~~~[m[K [01;32m[K|[m[K [01;34m[K|[m[K [01;32m[Kint[m[K [01;34m[Kconst char *[m[K [32m[K%s[m[K -- 2.26.3