Commit 6c11790d by Daniel Berlin Committed by Daniel Berlin

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
parent 5597a350
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> 2005-10-06 Richard Henderson <rth@redhat.com>
PR debug/24070 PR debug/24070
......
// 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) ...@@ -3020,6 +3020,26 @@ make_constraint_to_anything (varinfo_t vi)
process_constraint (new_constraint (lhs, rhs)); 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. /* Create a varinfo structure for NAME and DECL, and add it to VARMAP.
This will also create any varinfo structures necessary for fields This will also create any varinfo structures necessary for fields
of DECL. */ of DECL. */
...@@ -3104,8 +3124,16 @@ create_variable_info_for (tree decl, const char *name) ...@@ -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 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 without creating varinfos for the fields anyway, so sorting them is a
waste to boot. */ waste to boot. */
if (!notokay) if (!notokay)
sort_fieldstack (fieldstack); {
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) if (VEC_length (fieldoff_s, fieldstack) != 0)
fo = VEC_index (fieldoff_s, fieldstack, 0); fo = VEC_index (fieldoff_s, fieldstack, 0);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment