[cfe-commits] r104206 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaDeclCXX.cpp lib/Sema/SemaDeclObjC.cpp lib/Sema/SemaLookup.cpp test/CodeGenObjCXX/encode.mm test/SemaCXX/vararg-adl.cpp test/SemaObjCXX/ivar-construct.mm

Douglas Gregor dgregor at apple.com
Wed May 19 19:24:22 PDT 2010


Author: dgregor
Date: Wed May 19 21:24:22 2010
New Revision: 104206

URL: http://llvm.org/viewvc/llvm-project?rev=104206&view=rev
Log:
Various small fixes for construction/destruction of Objective-C++
instance variables:
  - Use isRecordType() rather than isa<RecordType>(), so that we see
  through typedefs in ivar types.
  - Mark the destructor as referenced
  - Perform C++ access control on the destructor

Added:
    cfe/trunk/test/SemaCXX/vararg-adl.cpp   (with props)
    cfe/trunk/test/SemaObjCXX/ivar-construct.mm
Modified:
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
    cfe/trunk/lib/Sema/SemaDeclCXX.cpp
    cfe/trunk/lib/Sema/SemaDeclObjC.cpp
    cfe/trunk/lib/Sema/SemaLookup.cpp
    cfe/trunk/test/CodeGenObjCXX/encode.mm

Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=104206&r1=104205&r2=104206&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Wed May 19 21:24:22 2010
@@ -503,6 +503,10 @@
 def err_access_copy_base :
     Error<"base class %0 has %select{private|protected}1 copy constructor">,
     NoSFINAE;
+def err_access_dtor_ivar :
+    Error<"instance variable of type %0 has %select{private|protected}1 "
+          "destructor">,
+    NoSFINAE;
 def note_previous_access_declaration : Note<
   "previously declared '%1' here">;
 def err_access_outside_class : Error<

Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=104206&r1=104205&r2=104206&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Wed May 19 21:24:22 2010
@@ -6190,6 +6190,9 @@
     llvm::SmallVector<CXXBaseOrMemberInitializer*, 32> AllToInit;
     for (unsigned i = 0; i < ivars.size(); i++) {
       FieldDecl *Field = ivars[i];
+      if (Field->isInvalidDecl())
+        continue;
+      
       CXXBaseOrMemberInitializer *Member;
       InitializedEntity InitEntity = InitializedEntity::InitializeMember(Field);
       InitializationKind InitKind = 
@@ -6212,6 +6215,20 @@
                                                  MemberInit.takeAs<Expr>(),
                                                  SourceLocation());
       AllToInit.push_back(Member);
+      
+      // Be sure that the destructor is accessible and is marked as referenced.
+      if (const RecordType *RecordTy
+                  = Context.getBaseElementType(Field->getType())
+                                                        ->getAs<RecordType>()) {
+                    CXXRecordDecl *RD = cast<CXXRecordDecl>(RecordTy->getDecl());
+        if (CXXDestructorDecl *Destructor
+              = const_cast<CXXDestructorDecl*>(RD->getDestructor(Context))) {
+          MarkDeclarationReferenced(Field->getLocation(), Destructor);
+          CheckDestructorAccess(Field->getLocation(), Destructor,
+                            PDiag(diag::err_access_dtor_ivar)
+                              << Context.getBaseElementType(Field->getType()));
+        }
+      }      
     }
     ObjCImplementation->setIvarInitializers(Context, 
                                             AllToInit.data(), AllToInit.size());

Modified: cfe/trunk/lib/Sema/SemaDeclObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclObjC.cpp?rev=104206&r1=104205&r2=104206&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclObjC.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclObjC.cpp Wed May 19 21:24:22 2010
@@ -1812,7 +1812,7 @@
        E = OI->ivar_end(); I != E; ++I) {
     ObjCIvarDecl *Iv = (*I);
     QualType QT = Context.getBaseElementType(Iv->getType());
-    if (isa<RecordType>(QT))
+    if (QT->isRecordType())
       Ivars.push_back(*I);
   }
   
@@ -1822,7 +1822,7 @@
          E = CDecl->ivar_end(); I != E; ++I) {
       ObjCIvarDecl *Iv = (*I);
       QualType QT = Context.getBaseElementType(Iv->getType());
-      if (isa<RecordType>(QT))
+      if (QT->isRecordType())
         Ivars.push_back(*I);
     }
   }
@@ -1834,7 +1834,7 @@
          E = ImplDecl->ivar_end(); I != E; ++I) {
       ObjCIvarDecl *Iv = (*I);
       QualType QT = Context.getBaseElementType(Iv->getType());
-      if (isa<RecordType>(QT))
+      if (QT->isRecordType())
         Ivars.push_back(*I);
     }
   }

Modified: cfe/trunk/lib/Sema/SemaLookup.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaLookup.cpp?rev=104206&r1=104205&r2=104206&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaLookup.cpp (original)
+++ cfe/trunk/lib/Sema/SemaLookup.cpp Wed May 19 21:24:22 2010
@@ -1626,15 +1626,21 @@
   //        member, if any; and its direct and indirect base
   //        classes. Its associated namespaces are the namespaces in
   //        which its associated classes are defined.
-  if (const RecordType *ClassType = T->getAs<RecordType>())
+  if (const RecordType *ClassType = T->getAs<RecordType>()) {
     if (CXXRecordDecl *ClassDecl
         = dyn_cast<CXXRecordDecl>(ClassType->getDecl())) {
+      // The __builtin_va_list type does not participate in ADL.
+      if (ClassDecl->getIdentifier() && 
+          ClassDecl->getIdentifier()->isStr("__va_list_tag"))
+        return;
+      
       addAssociatedClassesAndNamespaces(ClassDecl, Context,
                                         AssociatedNamespaces,
                                         AssociatedClasses);
       return;
     }
-
+  }
+  
   //     -- If T is an enumeration type, its associated namespace is
   //        the namespace in which it is defined. If it is class
   //        member, its associated class is the member’s class; else

Modified: cfe/trunk/test/CodeGenObjCXX/encode.mm
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjCXX/encode.mm?rev=104206&r1=104205&r2=104206&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenObjCXX/encode.mm (original)
+++ cfe/trunk/test/CodeGenObjCXX/encode.mm Wed May 19 21:24:22 2010
@@ -5,7 +5,8 @@
 // CHECK: v24 at 0:816
 
 template <typename T1, typename T2, typename T3> struct vector {
-    vector(T1,T2,T3);
+  vector();
+  vector(T1,T2,T3);
 };
 
 typedef vector< float, float, float > vector3f;

Added: cfe/trunk/test/SemaCXX/vararg-adl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/vararg-adl.cpp?rev=104206&view=auto
==============================================================================
--- cfe/trunk/test/SemaCXX/vararg-adl.cpp (added)
+++ cfe/trunk/test/SemaCXX/vararg-adl.cpp Wed May 19 21:24:22 2010
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 -fsyntax-only -triple x86_64-apple-darwin -verify %s
+
+// PR6762
+#define a_list __builtin_va_list
+extern a_list l;
+extern int f (a_list arg);
+namespace n {
+int f(a_list arguments);
+void y() {
+  f(l);
+}
+}

Propchange: cfe/trunk/test/SemaCXX/vararg-adl.cpp
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cfe/trunk/test/SemaCXX/vararg-adl.cpp
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cfe/trunk/test/SemaCXX/vararg-adl.cpp
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cfe/trunk/test/SemaObjCXX/ivar-construct.mm
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjCXX/ivar-construct.mm?rev=104206&view=auto
==============================================================================
--- cfe/trunk/test/SemaObjCXX/ivar-construct.mm (added)
+++ cfe/trunk/test/SemaObjCXX/ivar-construct.mm Wed May 19 21:24:22 2010
@@ -0,0 +1,29 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+struct Y { 
+  Y(); 
+
+private:
+  ~Y(); // expected-note 3{{declared private here}}
+};
+
+template<typename T>
+struct X : T { }; // expected-error 2{{private destructor}}
+
+struct Z; // expected-note{{forward declaration}}
+
+ at interface A {
+  X<Y> x; // expected-note{{implicit default destructor}}
+  Y y; // expected-error{{private destructor}}
+}
+ at end
+
+ at implementation A // expected-note{{implicit default constructor}}
+ at end
+
+ at interface B {
+  Z z; // expected-error{{incomplete type}}
+}
+ at end
+
+ at implementation B
+ at end





More information about the cfe-commits mailing list