[cfe-commits] r100226 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaDeclObjC.cpp test/SemaObjC/class-extension-after-implementation.m

Fariborz Jahanian fjahanian at apple.com
Fri Apr 2 13:53:06 PDT 2010


Author: fjahanian
Date: Fri Apr  2 15:53:05 2010
New Revision: 100226

URL: http://llvm.org/viewvc/llvm-project?rev=100226&view=rev
Log:
diagnose declaring class extension after its implementation
(radar 7822210).

Added:
    cfe/trunk/test/SemaObjC/class-extension-after-implementation.m
Modified:
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
    cfe/trunk/lib/Sema/SemaDeclObjC.cpp

Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=100226&r1=100225&r2=100226&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Fri Apr  2 15:53:05 2010
@@ -256,6 +256,10 @@
 def warn_property_types_are_incompatible : Warning<
   "property type %0 is incompatible with type %1 inherited from %2">;
 def err_undef_interface : Error<"cannot find interface declaration for %0">;
+def err_class_extension_after_impl : Error<
+  "cannot declare class extension for %0 after class implementation">;
+def note_implementation_declared : Note<
+  "class implementation is declared here">;
 def warn_dup_category_def : Warning<
   "duplicate definition of category %1 on interface %0">;
 def err_conflicting_super_class : Error<"conflicting super class name %0">;

Modified: cfe/trunk/lib/Sema/SemaDeclObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclObjC.cpp?rev=100226&r1=100225&r2=100226&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclObjC.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclObjC.cpp Fri Apr  2 15:53:05 2010
@@ -431,6 +431,11 @@
     // Class extensions require a special treatment. Use an existing one.
     // Note that 'getClassExtension()' can return NULL.
     CDecl = IDecl->getClassExtension();
+    if (IDecl->getImplementation()) {
+      Diag(ClassLoc, diag::err_class_extension_after_impl) << ClassName;
+      Diag(IDecl->getImplementation()->getLocation(), 
+           diag::note_implementation_declared);
+    }
   }
 
   if (!CDecl) {

Added: cfe/trunk/test/SemaObjC/class-extension-after-implementation.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/class-extension-after-implementation.m?rev=100226&view=auto
==============================================================================
--- cfe/trunk/test/SemaObjC/class-extension-after-implementation.m (added)
+++ cfe/trunk/test/SemaObjC/class-extension-after-implementation.m Fri Apr  2 15:53:05 2010
@@ -0,0 +1,11 @@
+// RUN: %clang_cc1  -fsyntax-only -verify %s
+// rdar://7822210
+
+ at interface A @end
+
+ at implementation A @end // expected-note {{class implementation is declared here}}
+
+ at interface A () // expected-error {{cannot declare class extension for 'A' after class implementation}}
+-(void) im0;
+ at end
+





More information about the cfe-commits mailing list