]> granicus.if.org Git - clang/commitdiff
Check access for the implicit calls to destructors that occur when we
authorJohn McCall <rjmccall@apple.com>
Wed, 7 Apr 2010 00:41:46 +0000 (00:41 +0000)
committerJohn McCall <rjmccall@apple.com>
Wed, 7 Apr 2010 00:41:46 +0000 (00:41 +0000)
have a temporary object in C++.

Also fix a tag mismatch that Doug noticed.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@100593 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaAccess.cpp
lib/Sema/SemaExprCXX.cpp
test/CXX/class.access/p4.cpp

index a2f7147e4429b28bccedd38117a6c25d11ce6158..dfbb5979547a2c4b42671e4f29a1ef867cc18952 100644 (file)
@@ -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;
index 99a8f9f5bdd8e1a5da2491632c01eaa5c03a9bf2..520a9708c6e51bc1498206436269666f592f4608 100644 (file)
@@ -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;
index 501c877c3ddd894ff091fe71e484e754eae5fc3a..f6adb1545df4d2f92c59e5b3be70f34171769a15 100644 (file)
@@ -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));
 }
index 3bbdbab8d516d97abf4a6cbaa71f3e4c273899dd..434d8e4fc11ed4e29bdcf0272d331e15570b8296 100644 (file)
@@ -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}}
+  }
+}