diff options
| author | John McCall <rjmccall@apple.com> | 2010-04-07 00:41:46 +0000 | 
|---|---|---|
| committer | John McCall <rjmccall@apple.com> | 2010-04-07 00:41:46 +0000 | 
| commit | 8e36d53e34be6d74ce4fa76b2b5cb586d32da51b (patch) | |
| tree | ff54ed353c53921fe60e3a6f4f4fd98ca24c1722 /clang | |
| parent | 6ea5949a93840eb1ae127e60b1423178c05878d4 (diff) | |
| download | bcm5719-llvm-8e36d53e34be6d74ce4fa76b2b5cb586d32da51b.tar.gz bcm5719-llvm-8e36d53e34be6d74ce4fa76b2b5cb586d32da51b.zip | |
Check access for the implicit calls to destructors that occur when we
have a temporary object in C++.
Also fix a tag mismatch that Doug noticed.
llvm-svn: 100593
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 3 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaAccess.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 6 | ||||
| -rw-r--r-- | clang/test/CXX/class.access/p4.cpp | 12 | 
4 files changed, 21 insertions, 2 deletions
| diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index a2f7147e442..dfbb5979547 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -462,6 +462,9 @@ def err_access_dtor_vbase :      Error<"inherited virtual base class %0 has "      "%select{private|protected}1 destructor">,      NoSFINAE; +def err_access_dtor_temp : +    Error<"temporary of type %0 has %select{private|protected}1 destructor">, +    NoSFINAE;  def err_access_dtor_field :      Error<"field of type %1 has %select{private|protected}2 destructor">,      NoSFINAE; diff --git a/clang/lib/Sema/SemaAccess.cpp b/clang/lib/Sema/SemaAccess.cpp index 99a8f9f5bdd..520a9708c6e 100644 --- a/clang/lib/Sema/SemaAccess.cpp +++ b/clang/lib/Sema/SemaAccess.cpp @@ -168,7 +168,7 @@ struct AccessTarget : public Sema::AccessedEntity {      }    private: -    friend class AccessTarget; +    friend struct AccessTarget;      explicit SavedInstanceContext(AccessTarget &Target)        : Target(Target), Has(Target.HasInstanceContext) {}      AccessTarget &Target; diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 501c877c3dd..f6adb1545df 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -2450,8 +2450,12 @@ Sema::OwningExprResult Sema::MaybeBindToTemporary(Expr *E) {                                              RD->getDestructor(Context));    ExprTemporaries.push_back(Temp);    if (CXXDestructorDecl *Destructor = -        const_cast<CXXDestructorDecl*>(RD->getDestructor(Context))) +        const_cast<CXXDestructorDecl*>(RD->getDestructor(Context))) {      MarkDeclarationReferenced(E->getExprLoc(), Destructor); +    CheckDestructorAccess(E->getExprLoc(), Destructor, +                          PDiag(diag::err_access_dtor_temp) +                            << E->getType()); +  }    // FIXME: Add the temporary to the temporaries vector.    return Owned(CXXBindTemporaryExpr::Create(Context, Temp, E));  } diff --git a/clang/test/CXX/class.access/p4.cpp b/clang/test/CXX/class.access/p4.cpp index 3bbdbab8d51..434d8e4fc11 100644 --- a/clang/test/CXX/class.access/p4.cpp +++ b/clang/test/CXX/class.access/p4.cpp @@ -327,3 +327,15 @@ namespace test13 {      (void) d->x;    }  } + +// Destructors for temporaries. +namespace test14 { +  class A { +  private: ~A(); // expected-note {{declared private here}} +  }; +  A foo(); + +  void test() { +    foo(); // expected-error {{temporary of type 'test14::A' has private destructor}} +  } +} | 

