aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2020-10-22 06:12:31 -0400
committerDavid Malcolm <dmalcolm@redhat.com>2020-10-22 06:12:31 -0400
commitb7f2cfbf0fc7bcd5c1e60fca354de8bf60f9acfa (patch)
tree13d40d31c63354cf23256981da8f5631408030c9 /gcc
parent56ddd5e23af0906573e7d50348beb42d3dae82a9 (diff)
downloadgcc-b7f2cfbf0fc7bcd5c1e60fca354de8bf60f9acfa.zip
gcc-b7f2cfbf0fc7bcd5c1e60fca354de8bf60f9acfa.tar.gz
gcc-b7f2cfbf0fc7bcd5c1e60fca354de8bf60f9acfa.tar.bz2
analyzer: fix ICE on dtor [PR97489]
gcc/analyzer/ChangeLog: PR analyzer/97489 * engine.cc (exploded_graph::add_function_entry): Assert that we have a function body. (exploded_graph::on_escaped_function): Reject fndecls that don't have a function body. gcc/testsuite/ChangeLog: PR analyzer/97489 * g++.dg/analyzer/pr97489.C: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/analyzer/engine.cc5
-rw-r--r--gcc/testsuite/g++.dg/analyzer/pr97489.C6
2 files changed, 11 insertions, 0 deletions
diff --git a/gcc/analyzer/engine.cc b/gcc/analyzer/engine.cc
index 65d7495..b1c877e 100644
--- a/gcc/analyzer/engine.cc
+++ b/gcc/analyzer/engine.cc
@@ -1937,6 +1937,8 @@ exploded_graph::~exploded_graph ()
exploded_node *
exploded_graph::add_function_entry (function *fun)
{
+ gcc_assert (gimple_has_body_p (fun->decl));
+
/* Be idempotent. */
if (m_functions_with_enodes.contains (fun))
{
@@ -3982,6 +3984,9 @@ exploded_graph::on_escaped_function (tree fndecl)
if (!fun)
return;
+ if (!gimple_has_body_p (fndecl))
+ return;
+
exploded_node *enode = add_function_entry (fun);
if (logger)
{
diff --git a/gcc/testsuite/g++.dg/analyzer/pr97489.C b/gcc/testsuite/g++.dg/analyzer/pr97489.C
new file mode 100644
index 0000000..9322e72
--- /dev/null
+++ b/gcc/testsuite/g++.dg/analyzer/pr97489.C
@@ -0,0 +1,6 @@
+struct X {
+ virtual ~X() {}
+ virtual void key_function();
+};
+
+void X::key_function() {}