From: Fariborz Jahanian Date: Wed, 4 Jan 2012 00:31:53 +0000 (+0000) Subject: In non-gc, non-arc mode, property of 'Class' type X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9f37cd1810646ffc9002c7a6477fe158ee15ede4;p=clang In non-gc, non-arc mode, property of 'Class' type variety is treated as a 'void *'. No need to issue warning reserved for objc object properties. // rdar://10565506 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@147504 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaObjCProperty.cpp b/lib/Sema/SemaObjCProperty.cpp index a15fc7dd8d..efef7caadc 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 0000000000..df2f835932 --- /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

MyClass; +@property Class MyClass1; +@property void * VOIDSTAR; +@end + +@implementation I +@synthesize MyClass, MyClass1, VOIDSTAR; +@end