On Jun 3, 2010, at 4:25 PM, Eli Friedman wrote:

> On Thu, Jun 3, 2010 at 4:13 PM, Douglas Gregor <dgre...@apple.com> wrote:
>> 
>> On Jun 3, 2010, at 1:39 PM, Eli Friedman wrote:
>> 
>>> Author: efriedma
>>> Date: Thu Jun  3 15:39:03 2010
>>> New Revision: 105408
>>> 
>>> URL: http://llvm.org/viewvc/llvm-project?rev=105408&view=rev
>>> Log:
>>> Make sure to check the accessibility of and mark the destructor for the
>>> operand of a throw expression.  Fixes PR7281.
>> 
>> Cool. One comment below.
>> 
>>> Added:
>>>    cfe/trunk/test/CodeGenCXX/throw-expression-dtor.cpp
>>> Modified:
>>>    cfe/trunk/lib/Sema/SemaExprCXX.cpp
>>>    cfe/trunk/test/CXX/class.access/p4.cpp
>>> 
>>> Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
>>> URL: 
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=105408&r1=105407&r2=105408&view=diff
>>> ==============================================================================
>>> --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
>>> +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Thu Jun  3 15:39:03 2010
>>> @@ -458,11 +458,28 @@
>>>     return true;
>>>   E = Res.takeAs<Expr>();
>>> 
>>> +  // If the exception has class type, we need additional handling.
>>> +  const RecordType *RecordTy = Ty->getAs<RecordType>();
>>> +  if (!RecordTy)
>>> +    return false;
>>> +  CXXRecordDecl *RD = cast<CXXRecordDecl>(RecordTy->getDecl());
>>> +
>>>   // If we are throwing a polymorphic class type or pointer thereof,
>>>   // exception handling will make use of the vtable.
>>> -  if (const RecordType *RecordTy = Ty->getAs<RecordType>())
>>> -    MarkVTableUsed(ThrowLoc, cast<CXXRecordDecl>(RecordTy->getDecl()));
>>> -
>>> +  MarkVTableUsed(ThrowLoc, RD);
>>> +
>>> +  // If the class has a non-trivial destructor, we must be able to call it.
>>> +  if (RD->hasTrivialDestructor())
>>> +    return false;
>>> +
>>> +  CXXDestructorDecl *Destructor =
>>> +    const_cast<CXXDestructorDecl*>(RD->getDestructor(Context));
>>> +  if (!Destructor)
>>> +    return false;
>>> +
>>> +  MarkDeclarationReferenced(E->getExprLoc(), Destructor);
>>> +  CheckDestructorAccess(E->getExprLoc(), Destructor,
>>> +                        PDiag(diag::err_access_dtor_temp) << Ty);
>>>   return false;
>>> }
>> 
>> Could we get a new diagnostic that talks about the destructor of the 
>> exception object, rather than reusing err_access_dtor_temp?
> 
> Would something like "exception object of type 'test16::A' has private
> destructor" be okay?
> 
>>> 
>>> Modified: cfe/trunk/test/CXX/class.access/p4.cpp
>>> URL: 
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/class.access/p4.cpp?rev=105408&r1=105407&r2=105408&view=diff
>>> ==============================================================================
>>> --- cfe/trunk/test/CXX/class.access/p4.cpp (original)
>>> +++ cfe/trunk/test/CXX/class.access/p4.cpp Thu Jun  3 15:39:03 2010
>>> @@ -420,3 +420,9 @@
>>>   template class B<int>;  // expected-note {{in instantiation}}
>>>   template class B<long>; // expected-note 4 {{in instantiation}}
>>> }
>>> +
>>> +// PR7281
>>> +namespace test16 {
>>> +  class A { ~A(); }; // expected-note {{declared private here}}
>>> +  void b() { throw A(); } // expected-error{{temporary of type 'test16::A' 
>>> has private destructor}}
>>> +}
>>> 
>>> Added: cfe/trunk/test/CodeGenCXX/throw-expression-dtor.cpp
>>> URL: 
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/throw-expression-dtor.cpp?rev=105408&view=auto
>>> ==============================================================================
>>> --- cfe/trunk/test/CodeGenCXX/throw-expression-dtor.cpp (added)
>>> +++ cfe/trunk/test/CodeGenCXX/throw-expression-dtor.cpp Thu Jun  3 15:39:03 
>>> 2010
>>> @@ -0,0 +1,14 @@
>>> +// RUN: %clang_cc1 %s -emit-llvm-only -verify
>>> +// PR7281
>>> +
>>> +class A {
>>> +public:
>>> +    ~A();
>>> +};
>>> +class B : public A {
>>> +    void ice_throw();
>>> +};
>>> +void B::ice_throw() {
>>> +    throw *this;
>>> +}
>>> +
>> 
>> I guess this is just testing that CodeGen doesn't crash, right? Could we 
>> check the generated IR to ensure that a pointer to the destructor is being 
>> put into the right place as part of the throw statement?
> 
> I think that's sufficiently covered by test/CodeGenCXX/eh.cpp, and I
> don't really know what we should be generating well enough to verify
> that it's working.

Yes, I see it tested in eh.cpp. Thanks!

        - Doug


_______________________________________________
cfe-commits mailing list
cfe-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to