This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix wrong assumption in contains_type_p (PR ipa/71207).


> 
> Ok, applied without the renaming as r244530. I guess you added that to cut the recursion.
> 
> Would it be fine to install the patch to active branches after proper testing?
OK
Honza
> Thanks,
> Martin
> 
> >>  		 bool consider_placement_new,
> >>  		 bool consider_bases)
> >>  {
> >> @@ -463,18 +463,18 @@ contains_type_p (tree outer_type, HOST_WIDE_INT offset,
> >>    /* Check that type is within range.  */
> >>    if (offset < 0)
> >>      return false;
> >> -  if (TYPE_SIZE (outer_type) && TYPE_SIZE (otr_type)
> >> -      && TREE_CODE (TYPE_SIZE (outer_type)) == INTEGER_CST
> >> -      && TREE_CODE (TYPE_SIZE (otr_type)) == INTEGER_CST
> >> -      && wi::ltu_p (wi::to_offset (TYPE_SIZE (outer_type)),
> >> -		    (wi::to_offset (TYPE_SIZE (otr_type)) + offset)))
> >> -    return false;
> >> +
> >> +  /* PR ipa/71207
> >> +     As OUTER_TYPE can be a type which has a diamond virtual inheritance,
> >> +     it's not necessary that INNER_TYPE will fit within OUTER_TYPE with
> >> +     a given offset.  It can happen that INNER_TYPE also contains a base object,
> >> +     however it would point to the same instance in the OUTER_TYPE.  */
> >>  
> >>    context.offset = offset;
> >>    context.outer_type = TYPE_MAIN_VARIANT (outer_type);
> >>    context.maybe_derived_type = false;
> >>    context.dynamic = false;
> >> -  return context.restrict_to_inner_class (otr_type, consider_placement_new,
> >> +  return context.restrict_to_inner_class (inner_type, consider_placement_new,
> >>  					  consider_bases);
> >>  }
> >>  
> >> diff --git a/gcc/testsuite/g++.dg/ipa/pr71207.C b/gcc/testsuite/g++.dg/ipa/pr71207.C
> >> new file mode 100644
> >> index 00000000000..19a03998460
> >> --- /dev/null
> >> +++ b/gcc/testsuite/g++.dg/ipa/pr71207.C
> >> @@ -0,0 +1,42 @@
> >> +/* PR ipa/71207 */
> >> +/* { dg-do run } */
> >> +
> >> +class Class1
> >> +{
> >> +public:
> >> +  Class1() {};
> >> +  virtual ~Class1() {};
> >> +
> >> +protected:
> >> +  unsigned Field1;
> >> +};
> >> +
> >> +class Class2 : public virtual Class1
> >> +{
> >> +};
> >> +
> >> +class Class3 : public virtual Class1
> >> +{
> >> +public:
> >> +  virtual void Method1() = 0;
> >> +
> >> +  void Method2()
> >> +  {
> >> +    Method1();
> >> +  }
> >> +};
> >> +
> >> +class Class4 : public Class2, public virtual Class3
> >> +{
> >> +public:
> >> +  Class4() {};
> >> +  virtual void Method1() {};
> >> +};
> >> +
> >> +int main()
> >> +{
> >> +  Class4 var1;
> >> +  var1.Method2();
> >> +
> >> +  return 0;
> >> +}
> >> -- 
> >> 2.11.0
> >>
> > 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]