]> granicus.if.org Git - clang/commitdiff
Tweak duplicate category diagnostic to work like the duplicate protocol diagnostic.
authorChris Lattner <sabre@nondot.org>
Sun, 23 Nov 2008 22:38:38 +0000 (22:38 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 23 Nov 2008 22:38:38 +0000 (22:38 +0000)
Also, point out where the previous decl was.  This unxfails two tests.

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

include/clang/Basic/DiagnosticKinds.def
lib/Sema/SemaDeclObjC.cpp
test/SemaObjC/category-1.m
test/SemaObjC/check-dup-objc-decls-1.m

index c08d55344f7de63f7a9d0539d8b66e034f70f4a1..860888f026dee39ddb9383ddeda59106f4e72878 100644 (file)
 //                 by default.
 //     ERROR     - Error, compilation will stop after parsing completes.
 
+//===----------------------------------------------------------------------===//
+// Common Helpers
+//===----------------------------------------------------------------------===//
+
+DIAG(note_previous_definition, NOTE,
+     "previous definition is here")
+
+
 //===----------------------------------------------------------------------===//
 // Lexer Diagnostics
 //===----------------------------------------------------------------------===//
@@ -126,8 +134,6 @@ DIAG(ext_pp_bad_vaargs_use, EXTENSION,
      "__VA_ARGS__ can only appear in the expansion of a C99 variadic macro")
 DIAG(ext_pp_macro_redef, EXTENSION,
      "%0 macro redefined")
-DIAG(note_previous_definition, NOTE,
-     "previous definition is here")
 DIAG(ext_variadic_macro, EXTENSION,
      "variadic macros were introduced in C99")
 DIAG(ext_named_variadic_macro, EXTENSION,
@@ -455,7 +461,7 @@ DIAG(err_duplicate_protocol_def, ERROR,
 DIAG(err_undef_interface, ERROR,
      "cannot find interface declaration for %0")
 DIAG(warn_dup_category_def, WARNING,
-     "duplicate interface declaration for category %0 (%1)")
+     "duplicate definition of category %1 on interface %0")
 DIAG(warn_undef_interface, WARNING,
      "cannot find interface declaration for %0")
 DIAG(err_dup_implementation_class, ERROR,
index 49bfad7634e229397b9dc6dd10803324ce7c640d..7ffae4725c8951722dfff53e299b6c48836ce456 100644 (file)
@@ -406,6 +406,7 @@ ActOnStartCategoryInterface(SourceLocation AtInterfaceLoc,
       if (CategoryName && CDeclChain->getIdentifier() == CategoryName) {
         Diag(CategoryLoc, diag::warn_dup_category_def)
           << ClassName << CategoryName;
+        Diag(CDeclChain->getLocation(), diag::note_previous_definition);
         break;
       }
     }
index 8ba15d397327f93f4cb5bd236938497bbadc9d0b..84f4c1953e5e0c20c71edd54e3521c5c4c1a784b 100644 (file)
@@ -1,29 +1,28 @@
 // RUN: clang -fsyntax-only -verify %s
-// XFAIL
 
 @interface MyClass1 @end
 
 @protocol p1,p2,p3;
 
-@interface MyClass1 (Category1)  <p1> // expected-warning {{cannot find protocol definition for 'p1'}}
+@interface MyClass1 (Category1)  <p1> // expected-warning {{cannot find protocol definition for 'p1'}} expected-note {{previous definition is here}}
 @end
 
-@interface MyClass1 (Category1)  // expected-warning {{duplicate interface declaration for category 'MyClass1(Category1)'}}
+@interface MyClass1 (Category1)  // expected-warning {{duplicate definition of category 'Category1' on interface 'MyClass1'}}
 @end
 
 @interface MyClass1 (Category3) 
 @end
 
-@interface MyClass1 (Category4) @end
+@interface MyClass1 (Category4) @end // expected-note {{previous definition is here}}
 @interface MyClass1 (Category5) @end
 @interface MyClass1 (Category6) @end
-@interface MyClass1 (Category7) @end
-@interface MyClass1 (Category8) @end
+@interface MyClass1 (Category7) @end // expected-note {{previous definition is here}}
+@interface MyClass1 (Category8) @end // expected-note {{previous definition is here}}
 
 
-@interface MyClass1 (Category4) @end // expected-warning {{duplicate interface declaration for category 'MyClass1(Category4)'}}
-@interface MyClass1 (Category7) @end // expected-warning {{duplicate interface declaration for category 'MyClass1(Category7)'}}
-@interface MyClass1 (Category8) @end // expected-warning {{duplicate interface declaration for category 'MyClass1(Category8)'}}
+@interface MyClass1 (Category4) @end // expected-warning {{duplicate definition of category 'Category4' on interface 'MyClass1'}}
+@interface MyClass1 (Category7) @end // expected-warning {{duplicate definition of category 'Category7' on interface 'MyClass1'}}
+@interface MyClass1 (Category8) @end // expected-warning {{duplicate definition of category 'Category8' on interface 'MyClass1'}}
 
 
 @protocol p3 @end
 @interface XCRemoteComputerManager()
 @end
 
-@interface XCRemoteComputerManager(x) 
+@interface XCRemoteComputerManager(x) // expected-note {{previous definition is here}}
 @end 
 
-@interface XCRemoteComputerManager(x) // expected-warning {{duplicate interface declaration for category 'XCRemoteComputerManager(x)'}}
+@interface XCRemoteComputerManager(x) // expected-warning {{duplicate definition of category 'x' on interface 'XCRemoteComputerManager'}}
 @end
 
 @implementation XCRemoteComputerManager
index 5f55cfdb27164d86b5ca1f505ab3d45f118cd6e8..a634d0e6da4d9bd2b1fb1704aa02afb6cc3915e8 100644 (file)
@@ -1,5 +1,4 @@
 // RUN: clang -fsyntax-only -verify %s
-// XFAIL
 
 @interface Foo // expected-error {{previous definition is here}}
 @end
@@ -36,5 +35,5 @@ void Gorf() // expected-error {{redefinition of 'Gorf' as different kind of symb
 @protocol PP<P> @end
 @protocol PP<Q> @end  // expected-error {{duplicate protocol declaration of 'PP'}}
 
-@interface A(Cat)<P> @end
-@interface A(Cat)<Q> @end // expected-warning {{duplicate interface declaration for category 'A(Cat)'}}
+@interface A(Cat)<P> @end // expected-note {{previous definition is here}}
+@interface A(Cat)<Q> @end // expected-warning {{duplicate definition of category 'Cat' on interface 'A'}}