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:
Daniel Berlin 2005-10-06 19:38:00 +00:00 committed by Daniel Berlin
parent 5597a350f4
commit 6c11790df9
3 changed files with 69 additions and 2 deletions

View File

@ -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

View 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());
}

View File

@ -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);