diff --git a/lib/Sema/SemaObjCProperty.cpp b/lib/Sema/SemaObjCProperty.cpp index a15fc7dd8d12a9cb1e86209b6d971ca34c979e60..efef7caadccbe8de60d3459a627701c5d6d21359 100644 --- a/lib/Sema/SemaObjCProperty.cpp +++ b/lib/Sema/SemaObjCProperty.cpp @@ -1797,6 +1797,14 @@ void Sema::CheckObjCPropertyAttributes(Decl *PDecl, // not specified; including when property is 'readonly'. PropertyDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_strong); else if (!(Attributes & ObjCDeclSpec::DQ_PR_readonly)) { + bool isAnyClassTy = + (PropertyTy->isObjCClassType() || + PropertyTy->isObjCQualifiedClassType()); + // In non-gc, non-arc mode, 'Class' is treated as a 'void *' no need to + // issue any warning. + if (isAnyClassTy && getLangOptions().getGC() == LangOptions::NonGC) + ; + else { // Skip this warning in gc-only mode. if (getLangOptions().getGC() != LangOptions::GCOnly) Diag(Loc, diag::warn_objc_property_no_assignment_attribute); @@ -1804,6 +1812,7 @@ void Sema::CheckObjCPropertyAttributes(Decl *PDecl, // If non-gc code warn that this is likely inappropriate. if (getLangOptions().getGC() == LangOptions::NonGC) Diag(Loc, diag::warn_objc_property_default_assign_on_object); + } } // FIXME: Implement warning dependent on NSCopying being diff --git a/test/SemaObjC/ClassPropertyNotObject.m b/test/SemaObjC/ClassPropertyNotObject.m new file mode 100644 index 0000000000000000000000000000000000000000..df2f835932f121f1cc3f5c8e00fb84e2b0bfaffd --- /dev/null +++ b/test/SemaObjC/ClassPropertyNotObject.m @@ -0,0 +1,15 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: %clang_cc1 -x objective-c++ -fsyntax-only -verify %s +// rdar://10565506 + +@protocol P @end + +@interface I +@property Class<P> MyClass; +@property Class MyClass1; +@property void * VOIDSTAR; +@end + +@implementation I +@synthesize MyClass, MyClass1, VOIDSTAR; +@end