]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
In gcc/objc/:
authornicola <nicola@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 29 Nov 2010 20:45:49 +0000 (20:45 +0000)
committernicola <nicola@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 29 Nov 2010 20:45:49 +0000 (20:45 +0000)
2010-11-29  Nicola Pero  <nicola.pero@meta-innovation.com>

* objc-act.c (start_class): When a class is reimplemented,
generate an error and avoid adding the class to the list of
implemented classes again, but do not return error_mark_node.

In gcc/testsuite/:
2010-11-29  Nicola Pero  <nicola.pero@meta-innovation.com>

* objc.dg/duplicate-class-1.m: New.
* obj-c++.dg/duplicate-class-1.mm: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@167270 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/objc/ChangeLog
gcc/objc/objc-act.c
gcc/testsuite/ChangeLog
gcc/testsuite/obj-c++.dg/duplicate-class-1.mm [new file with mode: 0644]
gcc/testsuite/objc.dg/duplicate-class-1.m [new file with mode: 0644]

index 636bf85de1bfe3a6f5e539d3d454cca9d70a13ac..47c896a7073ffaa699cf225e6f8c86df6dea3a1e 100644 (file)
@@ -1,3 +1,9 @@
+2010-11-29  Nicola Pero  <nicola.pero@meta-innovation.com>
+
+       * objc-act.c (start_class): When a class is reimplemented,
+       generate an error and avoid adding the class to the list of
+       implemented classes again, but do not return error_mark_node.
+
 2010-11-29  Nicola Pero  <nicola.pero@meta-innovation.com>
 
        * objc-act.c (objc_maybe_build_component_ref): Removed TODO.
index 2382da4fd4d4eae3508e7f5b1889e0c004a8afe2..8de8e255e24093e7b42b020b9780b224d6c0ad57 100644 (file)
@@ -9537,10 +9537,13 @@ start_class (enum tree_code code, tree class_name, tree super_name,
            {
              error ("reimplementation of class %qE",
                     class_name);
-             return error_mark_node;
+             /* TODO: error message saying where it was previously
+                implemented.  */
+             break;
            }
-       implemented_classes = tree_cons (NULL_TREE, class_name,
-                                        implemented_classes);
+       if (chain == NULL_TREE)
+         implemented_classes = tree_cons (NULL_TREE, class_name,
+                                          implemented_classes);
       }
 
       /* Reset for multiple classes per file.  */
index 0a154e003a5388cd2e49169a021362975ae82793..5792e66d131bc707b247d7bb97cd5b756a15fca5 100644 (file)
@@ -1,3 +1,8 @@
+2010-11-29  Nicola Pero  <nicola.pero@meta-innovation.com>
+
+       * objc.dg/duplicate-class-1.m: New.
+       * obj-c++.dg/duplicate-class-1.mm: New.
+
 2010-11-29  Nicola Pero  <nicola.pero@meta-innovation.com>
 
        * objc.dg/property/dotsyntax-21.m
diff --git a/gcc/testsuite/obj-c++.dg/duplicate-class-1.mm b/gcc/testsuite/obj-c++.dg/duplicate-class-1.mm
new file mode 100644 (file)
index 0000000..9476533
--- /dev/null
@@ -0,0 +1,31 @@
+/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, November 2010.  */
+/* { dg-do compile } */
+
+/* Test that a duplicated @implementation for the same class does not
+   crash the compiler.  */
+
+@interface Test
+{
+  Class isa;
+}
+- (int) test;
+@end
+
+@implementation Test
+- (int) test
+{
+  return 4;
+}
+@end
+
+/* The most likely cause is that the programmer meant this to be a
+   category, so check what happens if we have some different methods
+   in there.  */
+@implementation Test /* { dg-error "reimplementation of class .Test." } */
+- (int) test2
+{
+  return [self test];
+}
+@end
+/* { dg-warning "incomplete implementation" "" { target *-*-* } 29 } */
+/* { dg-warning "not found" "" { target *-*-* } 29 } */
diff --git a/gcc/testsuite/objc.dg/duplicate-class-1.m b/gcc/testsuite/objc.dg/duplicate-class-1.m
new file mode 100644 (file)
index 0000000..f861592
--- /dev/null
@@ -0,0 +1,31 @@
+/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, November 2010.  */
+/* { dg-do compile } */
+
+/* Test that a duplicated @implementation for the same class does not
+   crash the compiler.  */
+
+@interface Test
+{
+  Class isa;
+}
+- (int) test;
+@end
+
+@implementation Test
+- (int) test
+{
+  return 4;
+}
+@end
+
+/* The most likely cause is that the programmer meant this to be a
+   category, so check what happens if we have some different methods
+   in there.  */
+@implementation Test
+- (int) test2  /* { dg-error "reimplementation of class .Test." } */
+{
+  return [self test];
+}
+@end
+/* { dg-warning "incomplete implementation" "" { target *-*-* } 29 } */
+/* { dg-warning "not found" "" { target *-*-* } 29 } */