Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.
Pushed to trunk as r16-6930-g26a69f98a06d53.
gcc/analyzer/ChangeLog:
* checker-event.cc (cfg_edge_event::maybe_get_edge_sense): New.
* checker-event.h (cfg_edge_event::maybe_get_edge_sense): New decl.
* diagnostic-manager.cc
(diagnostic_manager::consolidate_conditions): Use the above to
ensure that edge_sense is initialized if used, and to simplify
the check for a run of conditions.
Signed-off-by: David Malcolm <[email protected]>
---
gcc/analyzer/checker-event.cc | 23 +++++++++++++++++++++++
gcc/analyzer/checker-event.h | 2 ++
gcc/analyzer/diagnostic-manager.cc | 27 ++++++---------------------
3 files changed, 31 insertions(+), 21 deletions(-)
diff --git a/gcc/analyzer/checker-event.cc b/gcc/analyzer/checker-event.cc
index 97ba59ca918..d1e9b4429f9 100644
--- a/gcc/analyzer/checker-event.cc
+++ b/gcc/analyzer/checker-event.cc
@@ -632,6 +632,29 @@ cfg_edge_event::get_cfg_edge () const
return m_sedge->get_any_cfg_edge ();
}
+/* If this event is for a conditional, write the sense of the
+ conditional to *OUT and return true.
+ Otherwise return false. */
+
+bool
+cfg_edge_event::maybe_get_edge_sense (bool *out) const
+{
+ if (::edge e = get_cfg_edge ())
+ {
+ if (e->flags & EDGE_TRUE_VALUE)
+ {
+ *out = true;
+ return true;
+ }
+ else if (e->flags & EDGE_FALSE_VALUE)
+ {
+ *out = false;
+ return true;
+ }
+ }
+ return false;
+}
+
/* class start_cfg_edge_event : public cfg_edge_event. */
/* Implementation of diagnostics::paths::event::print_desc vfunc for
diff --git a/gcc/analyzer/checker-event.h b/gcc/analyzer/checker-event.h
index 8094ef607c1..be39a89a7b1 100644
--- a/gcc/analyzer/checker-event.h
+++ b/gcc/analyzer/checker-event.h
@@ -456,6 +456,8 @@ public:
::edge get_cfg_edge () const;
+ bool maybe_get_edge_sense (bool *out) const;
+
protected:
cfg_edge_event (enum event_kind kind,
const exploded_edge &eedge,
diff --git a/gcc/analyzer/diagnostic-manager.cc
b/gcc/analyzer/diagnostic-manager.cc
index 813f764eb32..8e3aed06420 100644
--- a/gcc/analyzer/diagnostic-manager.cc
+++ b/gcc/analyzer/diagnostic-manager.cc
@@ -2708,15 +2708,8 @@ diagnostic_manager::consolidate_conditions (checker_path
*path) const
const start_cfg_edge_event *old_start_cfg_ev
= (const start_cfg_edge_event *)old_start_ev;
bool edge_sense;
- if (::edge e = old_start_cfg_ev->get_cfg_edge ())
- {
- if (e->flags & EDGE_TRUE_VALUE)
- edge_sense = true;
- else if (e->flags & EDGE_FALSE_VALUE)
- edge_sense = false;
- else
- continue;
- }
+ if (!old_start_cfg_ev->maybe_get_edge_sense (&edge_sense))
+ continue;
/* Find a run of CFG start/end event pairs from
[start_idx, next_idx)
@@ -2731,19 +2724,11 @@ diagnostic_manager::consolidate_conditions
(checker_path *path) const
gcc_assert (iter_ev->get_kind () == event_kind::start_cfg_edge);
const start_cfg_edge_event *iter_cfg_ev
= (const start_cfg_edge_event *)iter_ev;
- ::edge e = iter_cfg_ev->get_cfg_edge ();
- if (!e)
+ bool iter_edge_sense;
+ if (!iter_cfg_ev->maybe_get_edge_sense (&iter_edge_sense))
+ break;
+ if (iter_edge_sense != edge_sense)
break;
- if (edge_sense)
- {
- if (!(e->flags & EDGE_TRUE_VALUE))
- break;
- }
- else
- {
- if (!(e->flags & EDGE_FALSE_VALUE))
- break;
- }
next_idx += 2;
}
--
2.26.3