mirror of git://gcc.gnu.org/git/gcc.git
re PR debug/52048 (-fcompare-debug failure with -O2 -fcompare-debug -fnon-call-exceptions -fno-tree-dominator-opts)
PR debug/52048 * tree-ssa-tail-merge.c (local_def): Ignore debug uses. * g++.dg/other/pr52048.C: New test. From-SVN: r183723
This commit is contained in:
parent
ab448cfa68
commit
dd44dcb022
|
|
@ -1,3 +1,8 @@
|
||||||
|
2012-01-30 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR debug/52048
|
||||||
|
* tree-ssa-tail-merge.c (local_def): Ignore debug uses.
|
||||||
|
|
||||||
2012-01-30 Richard Guenther <rguenther@suse.de>
|
2012-01-30 Richard Guenther <rguenther@suse.de>
|
||||||
|
|
||||||
PR tree-optimization/52045
|
PR tree-optimization/52045
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,8 @@
|
||||||
|
2012-01-30 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR debug/52048
|
||||||
|
* g++.dg/other/pr52048.C: New test.
|
||||||
|
|
||||||
2012-01-30 Richard Guenther <rguenther@suse.de>
|
2012-01-30 Richard Guenther <rguenther@suse.de>
|
||||||
|
|
||||||
PR tree-optimization/52045
|
PR tree-optimization/52045
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,79 @@
|
||||||
|
// PR debug/52048
|
||||||
|
// { dg-do compile }
|
||||||
|
// { dg-options "-fcompare-debug -fnon-call-exceptions -fno-tree-dominator-opts -O2" }
|
||||||
|
|
||||||
|
template <typename T> struct A;
|
||||||
|
template <typename T>
|
||||||
|
struct A <T *>
|
||||||
|
{
|
||||||
|
typedef T &a;
|
||||||
|
};
|
||||||
|
template <typename T>
|
||||||
|
struct B
|
||||||
|
{
|
||||||
|
typedef typename A <T>::a a;
|
||||||
|
a operator *() {}
|
||||||
|
};
|
||||||
|
template <typename T, typename U>
|
||||||
|
bool operator != (B <T>, B <U>)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
template <typename T>
|
||||||
|
struct C
|
||||||
|
{
|
||||||
|
typedef T *c;
|
||||||
|
template <typename>
|
||||||
|
struct D { typedef C d; };
|
||||||
|
};
|
||||||
|
template <typename T, typename U> struct E
|
||||||
|
{
|
||||||
|
typedef typename U::template D <T>::d e;
|
||||||
|
};
|
||||||
|
template <typename T, typename U = C <T> >
|
||||||
|
struct F
|
||||||
|
{
|
||||||
|
typedef E <T, U> b;
|
||||||
|
typedef typename b::e e;
|
||||||
|
typedef typename e::c c;
|
||||||
|
typedef B <c> i;
|
||||||
|
i begin ();
|
||||||
|
i end ();
|
||||||
|
};
|
||||||
|
class G;
|
||||||
|
class H;
|
||||||
|
struct I
|
||||||
|
{
|
||||||
|
void *i;
|
||||||
|
template <typename T> T foo ();
|
||||||
|
};
|
||||||
|
struct J : public I
|
||||||
|
{
|
||||||
|
virtual bool bar ();
|
||||||
|
};
|
||||||
|
class K {};
|
||||||
|
struct L
|
||||||
|
{
|
||||||
|
bool baz () {}
|
||||||
|
};
|
||||||
|
struct M
|
||||||
|
{
|
||||||
|
K m1 (K);
|
||||||
|
K m2 (H *) {}
|
||||||
|
};
|
||||||
|
struct N : J
|
||||||
|
{
|
||||||
|
bool bar (G &);
|
||||||
|
};
|
||||||
|
bool
|
||||||
|
N::bar (G &)
|
||||||
|
{
|
||||||
|
M m = foo <M> ();
|
||||||
|
F <H *> f;
|
||||||
|
for (F <H *>::i I = f.begin (), E = f.end (); I != E;)
|
||||||
|
{
|
||||||
|
H *h = *I;
|
||||||
|
L l;
|
||||||
|
if (l.baz ())
|
||||||
|
m.m1 (m.m2 (h));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -371,6 +371,8 @@ local_def (tree val)
|
||||||
res = true;
|
res = true;
|
||||||
FOR_EACH_IMM_USE_STMT (stmt, iter, val)
|
FOR_EACH_IMM_USE_STMT (stmt, iter, val)
|
||||||
{
|
{
|
||||||
|
if (is_gimple_debug (stmt))
|
||||||
|
continue;
|
||||||
bb = gimple_bb (stmt);
|
bb = gimple_bb (stmt);
|
||||||
if (bb == def_bb)
|
if (bb == def_bb)
|
||||||
continue;
|
continue;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue