aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2015-12-11 12:27:11 +0100
committerMartin Jambor <jamborm@gcc.gnu.org>2015-12-11 12:27:11 +0100
commit9e64af18754df7b9360cb9b693111caf0df8e7a2 (patch)
tree96d2c0c0834139ec38bc420965962410743d5f59
parentda0dcab1848db83728e0549c14bdacfc47321f5a (diff)
downloadgcc-9e64af18754df7b9360cb9b693111caf0df8e7a2.zip
gcc-9e64af18754df7b9360cb9b693111caf0df8e7a2.tar.gz
gcc-9e64af18754df7b9360cb9b693111caf0df8e7a2.tar.bz2
Add an asssert and testcase for PR 68064
2015-12-11 Martin Jambor <mjambor@suse.cz> PR ipa/68064 * ipa-prop.c (ipa_compute_jump_functions_for_edge): Add checking assert that align is nonzero. testsuite/ * g++.dg/torture/pr68064.C: New test. From-SVN: r231559
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ipa-prop.c1
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr68064.C35
4 files changed, 47 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index da9e02f..6df230b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2015-12-11 Martin Jambor <mjambor@suse.cz>
+
+ PR ipa/68064
+ * ipa-prop.c (ipa_compute_jump_functions_for_edge): Add checking
+ assert that align is nonzero.
+
2015-12-11 Dominik Vogt <vogt@linux.vnet.ibm.com>
* config/s390/s390.c (s390_expand_setmem): Use new expanders.
diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c
index f96bf97..72c2fed 100644
--- a/gcc/ipa-prop.c
+++ b/gcc/ipa-prop.c
@@ -1646,6 +1646,7 @@ ipa_compute_jump_functions_for_edge (struct ipa_func_body_info *fbi,
&& align % BITS_PER_UNIT == 0
&& hwi_bitpos % BITS_PER_UNIT == 0)
{
+ gcc_checking_assert (align != 0);
jfunc->alignment.known = true;
jfunc->alignment.align = align / BITS_PER_UNIT;
jfunc->alignment.misalign = hwi_bitpos / BITS_PER_UNIT;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 283da3b..c1a0579 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-12-11 Martin Jambor <mjambor@suse.cz>
+
+ PR ipa/68064
+ * g++.dg/torture/pr68064.C: New test.
+
2015-12-11 Dominik Vogt <vogt@linux.vnet.ibm.com>
* gcc.target/s390/md/setmem_long-1.c: New test.
diff --git a/gcc/testsuite/g++.dg/torture/pr68064.C b/gcc/testsuite/g++.dg/torture/pr68064.C
new file mode 100644
index 0000000..59b6897
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr68064.C
@@ -0,0 +1,35 @@
+// { dg-do compile }
+
+template <class Config> class A {
+public:
+ class B;
+ typedef typename Config::template D<A>::type TypeHandle;
+ static A *Tagged() { return B::New(B::kTagged); }
+ static TypeHandle Union(TypeHandle);
+ static TypeHandle Representation(TypeHandle, typename Config::Region *);
+ bool Is();
+};
+
+template <class Config> class A<Config>::B {
+ friend A;
+ enum { kTaggedPointer = 1 << 31, kTagged = kTaggedPointer };
+ static A *New(int p1) { return Config::from_bitset(p1); }
+};
+
+struct C {
+ typedef int Region;
+ template <class> struct D { typedef A<C> *type; };
+ static A<C> *from_bitset(unsigned);
+};
+A<C> *C::from_bitset(unsigned p1) { return reinterpret_cast<A<C> *>(p1); }
+
+namespace {
+int *a;
+void fn1(A<C> *p1) { A<C>::Union(A<C>::Representation(p1, a)); }
+}
+
+void fn2() {
+ A<C> b;
+ A<C> *c = b.Is() ? 0 : A<C>::Tagged();
+ fn1(c);
+}