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
4 changed files with 91 additions and 0 deletions
|
@ -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>
|
||||
|
||||
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>
|
||||
|
||||
PR tree-optimization/52045
|
||||
|
|
79
gcc/testsuite/g++.dg/other/pr52048.C
Normal file
79
gcc/testsuite/g++.dg/other/pr52048.C
Normal file
|
@ -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;
|
||||
FOR_EACH_IMM_USE_STMT (stmt, iter, val)
|
||||
{
|
||||
if (is_gimple_debug (stmt))
|
||||
continue;
|
||||
bb = gimple_bb (stmt);
|
||||
if (bb == def_bb)
|
||||
continue;
|
||||
|
|
Loading…
Add table
Reference in a new issue