mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-22 07:00:29 +08:00
re PR c++/22488 (C++ frontend generates RECORD_TYPEs with overlapping FIELD_DECLs)
2005-10-06 Daniel Berlin <dberlin@dberlin.org> Fix PR tree-optimization/22488 * tree-ssa-structalias.c (check_for_overlaps): New function. (create_variable_info_for): Use it. From-SVN: r105052
This commit is contained in:
parent
5597a350f4
commit
6c11790df9
@ -1,3 +1,9 @@
|
||||
2005-10-06 Daniel Berlin <dberlin@dberlin.org>
|
||||
|
||||
Fix PR tree-optimization/22488
|
||||
* tree-ssa-structalias.c (check_for_overlaps): New function.
|
||||
(create_variable_info_for): Use it.
|
||||
|
||||
2005-10-06 Richard Henderson <rth@redhat.com>
|
||||
|
||||
PR debug/24070
|
||||
|
33
gcc/testsuite/g++.dg/tree-ssa/pr22488.C
Normal file
33
gcc/testsuite/g++.dg/tree-ssa/pr22488.C
Normal file
@ -0,0 +1,33 @@
|
||||
// PR tree-optimization/22488
|
||||
// This testcase is really a C++ FE bug in represnting virtual inheritance
|
||||
// It gives the appearance to the middle end that the fields exist twice
|
||||
// which resulted in a very confused structure analyzer
|
||||
// { dg-do compile }
|
||||
// { dg-options "-O" }
|
||||
struct X
|
||||
{
|
||||
int i0, i1;
|
||||
char c;
|
||||
};
|
||||
|
||||
struct A
|
||||
{
|
||||
int i;
|
||||
char c0, c1;
|
||||
|
||||
virtual ~A();
|
||||
};
|
||||
|
||||
struct B : virtual A {};
|
||||
|
||||
struct C : B
|
||||
{
|
||||
X x;
|
||||
|
||||
void bar(X y) { x = y; }
|
||||
};
|
||||
|
||||
void foo()
|
||||
{
|
||||
C().bar(X());
|
||||
}
|
@ -3020,6 +3020,26 @@ make_constraint_to_anything (varinfo_t vi)
|
||||
process_constraint (new_constraint (lhs, rhs));
|
||||
}
|
||||
|
||||
|
||||
/* Return true if FIELDSTACK contains fields that overlap.
|
||||
FIELDSTACK is assumed to be sorted by offset. */
|
||||
|
||||
static bool
|
||||
check_for_overlaps (VEC (fieldoff_s,heap) *fieldstack)
|
||||
{
|
||||
fieldoff_s *fo = NULL;
|
||||
unsigned int i;
|
||||
unsigned int lastoffset = ~0;
|
||||
|
||||
for (i = 0; VEC_iterate (fieldoff_s, fieldstack, i, fo); i++)
|
||||
{
|
||||
if (fo->offset == lastoffset)
|
||||
return true;
|
||||
lastoffset = fo->offset;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Create a varinfo structure for NAME and DECL, and add it to VARMAP.
|
||||
This will also create any varinfo structures necessary for fields
|
||||
of DECL. */
|
||||
@ -3104,8 +3124,16 @@ create_variable_info_for (tree decl, const char *name)
|
||||
which will make notokay = true. In that case, we are going to return
|
||||
without creating varinfos for the fields anyway, so sorting them is a
|
||||
waste to boot. */
|
||||
if (!notokay)
|
||||
sort_fieldstack (fieldstack);
|
||||
if (!notokay)
|
||||
{
|
||||
sort_fieldstack (fieldstack);
|
||||
/* Due to some C++ FE issues, like PR 22488, we might end up
|
||||
what appear to be overlapping fields even though they,
|
||||
in reality, do not overlap. Until the C++ FE is fixed,
|
||||
we will simply disable field-sensitivity for these cases. */
|
||||
notokay = check_for_overlaps (fieldstack);
|
||||
}
|
||||
|
||||
|
||||
if (VEC_length (fieldoff_s, fieldstack) != 0)
|
||||
fo = VEC_index (fieldoff_s, fieldstack, 0);
|
||||
|
Loading…
x
Reference in New Issue
Block a user