]> granicus.if.org Git - clang/commitdiff
Diagnose implementation of a property declared in a category
authorFariborz Jahanian <fjahanian@apple.com>
Mon, 2 Nov 2009 18:45:36 +0000 (18:45 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Mon, 2 Nov 2009 18:45:36 +0000 (18:45 +0000)
in its class implementation instead of crashing. Fixes radar 7350345.

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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDeclObjC.cpp
test/SemaObjC/property-category-4.m [new file with mode: 0644]

index 00723a3af9f09612ee571e3ed8b6be529ff39ecf..8c7c0cbbe99d9a5c54aca3942a5271768935537e 100644 (file)
@@ -271,6 +271,11 @@ def error_missing_property_context : Error<
   "missing context for property implementation declaration">;
 def error_bad_property_decl : Error<
   "property implementation must have its declaration in interface %0">;
+def error_category_property : Error<
+  "property declared in category %0 cannot be implemented in "
+  "class implementation">;
+def note_category_property : Note<
+  "property declared here">;
 def error_synthesize_category_decl : Error<
   "@synthesize not allowed in a category's implementation">;
 def error_missing_property_interface : Error<
index d1b68a7977542f6841ca4491ca61fbc8795b380d..881652f7aaa4ddebc808689bf0819365278f4c17 100644 (file)
@@ -2047,6 +2047,14 @@ Sema::DeclPtrTy Sema::ActOnPropertyImplDecl(SourceLocation AtLoc,
       Diag(PropertyLoc, diag::error_bad_property_decl) << IDecl->getDeclName();
       return DeclPtrTy();
     }
+    if (const ObjCCategoryDecl *CD = 
+        dyn_cast<ObjCCategoryDecl>(property->getDeclContext())) {
+      if (CD->getIdentifier()) {
+        Diag(PropertyLoc, diag::error_category_property) << CD->getDeclName();
+        Diag(property->getLocation(), diag::note_category_property);
+        return DeclPtrTy();
+      }
+    }
   } else if ((CatImplClass = dyn_cast<ObjCCategoryImplDecl>(ClassImpDecl))) {
     if (Synthesize) {
       Diag(AtLoc, diag::error_synthesize_category_decl);
diff --git a/test/SemaObjC/property-category-4.m b/test/SemaObjC/property-category-4.m
new file mode 100644 (file)
index 0000000..ee08b09
--- /dev/null
@@ -0,0 +1,18 @@
+// RUN: clang-cc -fsyntax-only -verify %s
+
+@interface IDELogNavigator
+{
+  id selectedObjects;
+}
+@end
+
+@interface IDELogNavigator (CAT)
+  @property (readwrite, retain) id selectedObjects; // expected-note {{property declared here}}
+  @property (readwrite, retain) id d_selectedObjects; // expected-note {{property declared here}}
+@end
+
+@implementation IDELogNavigator 
+@synthesize selectedObjects = _selectedObjects; // expected-error {{property declared in category 'CAT' cannot be implemented in class implementation}}
+@dynamic d_selectedObjects; // expected-error {{property declared in category 'CAT' cannot be implemented in class implementation}}
+@end
+