From 5dd208b5138134189ce4c88146129db4fb5d4519 Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Fri, 15 May 2020 06:07:26 -0400 Subject: [PATCH 133/179] FIXME: fix type mismatch in MEM_REF-handling --- gcc/analyzer/region-model2.cc | 2 +- gcc/testsuite/gcc.dg/analyzer/casts-1.c | 31 +++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/analyzer/casts-1.c diff --git a/gcc/analyzer/region-model2.cc b/gcc/analyzer/region-model2.cc index c679ec54947..9b725e626d4 100644 --- a/gcc/analyzer/region-model2.cc +++ b/gcc/analyzer/region-model2.cc @@ -4838,7 +4838,7 @@ region_model2::get_lvalue_1 (path_var pv, const svalue2 *offset_sval = get_rvalue (offset, ctxt); const region2 *star_ptr = deref_rvalue (ptr_sval, ctxt); return m_mgr->get_offset_region (star_ptr, - TREE_TYPE (TREE_TYPE (ptr)), + TREE_TYPE (expr), offset_sval, ctxt); /* TODO: a selftest of casting a buffer to both an (int *) and a (coord *), and doing array accesses with both arrays. */ diff --git a/gcc/testsuite/gcc.dg/analyzer/casts-1.c b/gcc/testsuite/gcc.dg/analyzer/casts-1.c new file mode 100644 index 00000000000..7c9fb56451c --- /dev/null +++ b/gcc/testsuite/gcc.dg/analyzer/casts-1.c @@ -0,0 +1,31 @@ +#include "analyzer-decls.h" + +struct s1 +{ + char a; + char b; + char c; + char d; +}; + +struct s2 +{ + char arr[4]; +}; + +void test_1 () +{ + struct s1 x = {'A', 'B', 'C', 'D'}; + __analyzer_eval (x.a == 'A'); /* { dg-warning "TRUE" } */ + __analyzer_eval (x.b == 'B'); /* { dg-warning "TRUE" } */ + __analyzer_eval (x.c == 'C'); /* { dg-warning "TRUE" } */ + __analyzer_eval (x.d == 'D'); /* { dg-warning "TRUE" } */ + __analyzer_eval (((struct s2 *)&x)->arr[0] == 'A'); /* { dg-warning "TRUE" } */ + __analyzer_eval (((struct s2 *)&x)->arr[1] == 'B'); /* { dg-warning "TRUE" } */ + __analyzer_eval (((struct s2 *)&x)->arr[2] == 'C'); /* { dg-warning "TRUE" } */ + __analyzer_eval (((struct s2 *)&x)->arr[3] == 'D'); /* { dg-warning "TRUE" } */ + + ((struct s2 *)&x)->arr[1] = '#'; + __analyzer_eval (((struct s2 *)&x)->arr[1] == '#'); /* { dg-warning "TRUE" } */ + __analyzer_eval (x.b == '#'); /* { dg-warning "TRUE" } */ +} -- 2.21.0