[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