aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2022-04-06 10:40:06 +0200
committerRichard Biener <rguenther@suse.de>2022-04-06 12:23:17 +0200
commit4be08315124281f4e9359bc7e5279a99bdbdd053 (patch)
tree67323567ec05e2df87286d881a783dc58d33d64c
parent44fe49401725055a740ce47e80561b6932b8cd01 (diff)
downloadgcc-4be08315124281f4e9359bc7e5279a99bdbdd053.zip
gcc-4be08315124281f4e9359bc7e5279a99bdbdd053.tar.gz
gcc-4be08315124281f4e9359bc7e5279a99bdbdd053.tar.bz2
ipa/105166 - avoid modref queries with mismatching types
We should avoid mismatched argument values (integers for pointers) when doing modref queries. This is the third place to guard. 2022-04-06 Richard Biener <rguenther@suse.de> PR ipa/105166 * ipa-modref-tree.cc (modref_access_node::get_ao_ref ): Bail out for non-pointer arguments. * gcc.dg/torture/pr105166.c: New testcase.
-rw-r--r--gcc/ipa-modref-tree.cc4
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr105166.c9
2 files changed, 12 insertions, 1 deletions
diff --git a/gcc/ipa-modref-tree.cc b/gcc/ipa-modref-tree.cc
index d0ec2fb..f19af8c 100644
--- a/gcc/ipa-modref-tree.cc
+++ b/gcc/ipa-modref-tree.cc
@@ -678,7 +678,9 @@ modref_access_node::get_ao_ref (const gcall *stmt, ao_ref *ref) const
{
tree arg;
- if (!parm_offset_known || !(arg = get_call_arg (stmt)))
+ if (!parm_offset_known
+ || !(arg = get_call_arg (stmt))
+ || !POINTER_TYPE_P (TREE_TYPE (arg)))
return false;
poly_offset_int off = (poly_offset_int)offset
+ ((poly_offset_int)parm_offset << LOG2_BITS_PER_UNIT);
diff --git a/gcc/testsuite/gcc.dg/torture/pr105166.c b/gcc/testsuite/gcc.dg/torture/pr105166.c
new file mode 100644
index 0000000..60e8b73
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr105166.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+
+int bar (foo, a)
+ int (**foo) ();
+ int a;
+{
+ (foo)[1] = bar;
+ foo[1] (1);
+}