@@ -965,6 +965,12 @@ diagnostic_manager::prune_for_sm_diagnostic (checker_path *path,
tree var,
state_machine::state_t state) const
{
+ /* If we have a constant (such as NULL), assume its state is also
+ constant, so as not to attempt to get its lvalue whilst tracking the
+ origin of the state. */
+ if (var && CONSTANT_CLASS_P (var))
+ var = NULL_TREE;
+
int idx = path->num_events () - 1;
while (idx >= 0 && idx < (signed)path->num_events ())
{
@@ -4641,6 +4641,8 @@ region_model::get_lvalue_1 (path_var pv, region_model_context *ctxt)
switch (TREE_CODE (expr))
{
default:
+ internal_error ("unhandled tree code in region_model::get_lvalue_1: %qs",
+ get_tree_code_name (TREE_CODE (expr)));
gcc_unreachable ();
case ARRAY_REF:
new file mode 100644
@@ -0,0 +1,14 @@
+/* { dg-skip-if "" { *-*-* } { "-fno-fat-lto-objects" } { "" } } */
+
+int *tz;
+
+void
+ky (int);
+
+void
+wd (void)
+{
+ tz = 0;
+ ky (*tz); /* { dg-warning "dereference of NULL" } */
+}
+