This is indeed a problem. Good catch; thanks! -DeLesley
On Fri, Jul 1, 2011 at 11:50 AM, Martin Jambor <mjam...@suse.cz> wrote: > Hi, > > On Fri, Jul 01, 2011 at 09:31:30AM -0700, Delesley Hutchins wrote: >> > Just out of curiosity, I does your >> > analysis crash also on the testcase below (add the Mutex field if it >> > is necessary)? >> >> No, the static type of b (in b->test()) remains Bar* in gimple, so the >> analysis works fine (i.e. the analyzer will not crash). >> > > Sorry, I've had a look only just now and you do the analysis before > early inlining and as long as you do that, the type is really Bar and > you are fine as far as far as placement new is concerned. > > However, on the second thought, I still think you need to handle the > case when BINFO_VIRTUALS are NULL in cp_get_virtual_function_decl > (BTW, there is a non-langhook variant in gimple-fold.c called > gimple_get_virt_method_for_binfo) because of the case below. > > Martin > > > // { dg-do compile } > // { dg-options "-Wthread-safety -O" } > //#include "thread_annot_common.h" > > class Anc { > public: > int a; > }; > > class Foo : public Anc { > public: > // Mutex m; > > Foo(); > virtual ~Foo(); > virtual void doSomething() = 0;// EXCLUSIVE_LOCKS_REQUIRED(m) = 0; > }; > > > class FooDerived : public Foo { > public: > FooDerived(); > virtual ~FooDerived(); > virtual void doSomething(); > }; > > // reinterpret_cast > void foo1(Anc* ptr) > { > reinterpret_cast<Foo*>(ptr)->doSomething(); > } > > // C-style cast > void foo2(Anc* buf) > { > ((Foo*) buf)->doSomething(); > } > > > -- DeLesley Hutchins | Software Engineer | deles...@google.com | 505-206-0315