summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authornicola <nicola@138bc75d-0d04-0410-961f-82ee72b054a4>2010-11-29 20:45:49 +0000
committernicola <nicola@138bc75d-0d04-0410-961f-82ee72b054a4>2010-11-29 20:45:49 +0000
commit1cd5e6abf0d15e1dc0ab214eae2dcc3f83275334 (patch)
tree5fbe0db7e4a7ed1c71df82aac25a743af0e5c20d /gcc
parent1a19222c3edd588c72da222faa80ca804f8040f3 (diff)
downloadgcc-1cd5e6abf0d15e1dc0ab214eae2dcc3f83275334.tar.gz
In gcc/objc/:
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/objc/ChangeLog6
-rw-r--r--gcc/objc/objc-act.c9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/obj-c++.dg/duplicate-class-1.mm31
-rw-r--r--gcc/testsuite/objc.dg/duplicate-class-1.m31
5 files changed, 79 insertions, 3 deletions
diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog
index 636bf85de1b..47c896a7073 100644
--- a/gcc/objc/ChangeLog
+++ b/gcc/objc/ChangeLog
@@ -1,5 +1,11 @@
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.
2010-11-29 Nicola Pero <nicola.pero@meta-innovation.com>
diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c
index 2382da4fd4d..8de8e255e24 100644
--- a/gcc/objc/objc-act.c
+++ b/gcc/objc/objc-act.c
@@ -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. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0a154e003a5..5792e66d131 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
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
* obj-c++.dg/property/dotsyntax-21.mm
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
index 00000000000..9476533d1ea
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/duplicate-class-1.mm
@@ -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
index 00000000000..f86159211b3
--- /dev/null
+++ b/gcc/testsuite/objc.dg/duplicate-class-1.m
@@ -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 } */