+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
--- /dev/null
+// 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());
+}
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. */
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);