aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicola Pero <nicola.pero@meta-innovation.com>2010-11-19 22:23:22 +0000
committerNicola Pero <nicola@gcc.gnu.org>2010-11-19 22:23:22 +0000
commitd4e72c58e36abe902834d122b291a91debd5625c (patch)
tree61b8716b8764294b3d8406542d9a1218c831fe48
parent39986460d63899e1e4a1a9ee976c9c21c338f643 (diff)
downloadgcc-d4e72c58e36abe902834d122b291a91debd5625c.zip
gcc-d4e72c58e36abe902834d122b291a91debd5625c.tar.gz
gcc-d4e72c58e36abe902834d122b291a91debd5625c.tar.bz2
In gcc/objc/: 2010-11-19 Nicola Pero <nicola.pero@meta-innovation.com>
In gcc/objc/: 2010-11-19 Nicola Pero <nicola.pero@meta-innovation.com> * objc-act.c (objc_start_class_interface): Do not warn that class attributes are unimplemented. Pass the attributes to start_class. (objc_start_category_interface): Updated call to start_class. (objc_start_class_implementation): Same change. (objc_start_category_implementation): Same change. (objc_build_class_component_ref): Warn if the class is deprecated. (build_private_template): Mark the template as deprecated if the class is deprecated. (start_class): Added 'attributes' argument. Emit a warning if using a deprecated class as superclass of a class, or original class of a category. Recognize the 'deprecated' attribute when starting and interface, and mark the interface with TREE_DEPRECATED if present. Store attributes in the interface. In gcc/testsuite/: 2010-11-19 Nicola Pero <nicola.pero@meta-innovation.com> * objc.dg/attributes/class-attribute-1.m: Rewritten. * objc.dg/attributes/class-attribute-2.m: Same change. * obj-c++.dg/attributes/class-attribute-1.mm: Same change. * obj-c++.dg/attributes/class-attribute-2.mm: Same change. * objc.dg/fobjc-std-1.m: Updated. * obj-c++.dg/fobjc-std-1.mm: Updated. From-SVN: r166963
-rw-r--r--gcc/objc/ChangeLog16
-rw-r--r--gcc/objc/objc-act.c74
-rw-r--r--gcc/testsuite/ChangeLog9
-rw-r--r--gcc/testsuite/obj-c++.dg/attributes/class-attribute-1.mm68
-rw-r--r--gcc/testsuite/obj-c++.dg/attributes/class-attribute-2.mm26
-rw-r--r--gcc/testsuite/obj-c++.dg/fobjc-std-1.mm21
-rw-r--r--gcc/testsuite/objc.dg/attributes/class-attribute-1.m66
-rw-r--r--gcc/testsuite/objc.dg/attributes/class-attribute-2.m26
-rw-r--r--gcc/testsuite/objc.dg/fobjc-std-1.m10
9 files changed, 215 insertions, 101 deletions
diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog
index a128604..a5ad136 100644
--- a/gcc/objc/ChangeLog
+++ b/gcc/objc/ChangeLog
@@ -1,5 +1,21 @@
2010-11-19 Nicola Pero <nicola.pero@meta-innovation.com>
+ * objc-act.c (objc_start_class_interface): Do not warn that class
+ attributes are unimplemented. Pass the attributes to start_class.
+ (objc_start_category_interface): Updated call to start_class.
+ (objc_start_class_implementation): Same change.
+ (objc_start_category_implementation): Same change.
+ (objc_build_class_component_ref): Warn if the class is deprecated.
+ (build_private_template): Mark the template as deprecated if the
+ class is deprecated.
+ (start_class): Added 'attributes' argument. Emit a warning if
+ using a deprecated class as superclass of a class, or original
+ class of a category. Recognize the 'deprecated' attribute when
+ starting and interface, and mark the interface with
+ TREE_DEPRECATED if present. Store attributes in the interface.
+
+2010-11-19 Nicola Pero <nicola.pero@meta-innovation.com>
+
* objc-act.c (lookup_protocol): Added 'warn_if_deprecated'
argument. If it is 'true' and the protocol is deprecated, emit a
deprecation warning.
diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c
index 1f5e2b2..3a87faf 100644
--- a/gcc/objc/objc-act.c
+++ b/gcc/objc/objc-act.c
@@ -144,7 +144,7 @@ static tree get_proto_encoding (tree);
static tree lookup_interface (tree);
static tree objc_add_static_instance (tree, tree);
-static tree start_class (enum tree_code, tree, tree, tree);
+static tree start_class (enum tree_code, tree, tree, tree, tree);
static tree continue_class (tree);
static void finish_class (tree);
static void start_method_def (tree);
@@ -730,18 +730,12 @@ void
objc_start_class_interface (tree klass, tree super_class,
tree protos, tree attributes)
{
- if (attributes)
- {
- if (flag_objc1_only)
- error_at (input_location, "class attributes are not available in Objective-C 1.0");
- else
- warning_at (input_location, OPT_Wattributes,
- "class attributes are not available in this version"
- " of the compiler, (ignored)");
- }
+ if (flag_objc1_only && attributes)
+ error_at (input_location, "class attributes are not available in Objective-C 1.0");
+
objc_interface_context
= objc_ivar_context
- = start_class (CLASS_INTERFACE_TYPE, klass, super_class, protos);
+ = start_class (CLASS_INTERFACE_TYPE, klass, super_class, protos, attributes);
objc_ivar_visibility = OBJC_IVAR_VIS_PROTECTED;
}
@@ -759,7 +753,7 @@ objc_start_category_interface (tree klass, tree categ,
" of the compiler, (ignored)");
}
objc_interface_context
- = start_class (CATEGORY_INTERFACE_TYPE, klass, categ, protos);
+ = start_class (CATEGORY_INTERFACE_TYPE, klass, categ, protos, NULL_TREE);
objc_ivar_chain
= continue_class (objc_interface_context);
}
@@ -795,7 +789,8 @@ objc_start_class_implementation (tree klass, tree super_class)
{
objc_implementation_context
= objc_ivar_context
- = start_class (CLASS_IMPLEMENTATION_TYPE, klass, super_class, NULL_TREE);
+ = start_class (CLASS_IMPLEMENTATION_TYPE, klass, super_class, NULL_TREE,
+ NULL_TREE);
objc_ivar_visibility = OBJC_IVAR_VIS_PROTECTED;
}
@@ -803,7 +798,8 @@ void
objc_start_category_implementation (tree klass, tree categ)
{
objc_implementation_context
- = start_class (CATEGORY_IMPLEMENTATION_TYPE, klass, categ, NULL_TREE);
+ = start_class (CATEGORY_IMPLEMENTATION_TYPE, klass, categ, NULL_TREE,
+ NULL_TREE);
objc_ivar_chain
= continue_class (objc_implementation_context);
}
@@ -1708,6 +1704,11 @@ objc_build_class_component_ref (tree class_name, tree property_ident)
error_at (input_location, "could not find interface for class %qE", class_name);
return error_mark_node;
}
+ else
+ {
+ if (TREE_DEPRECATED (rtype))
+ warning (OPT_Wdeprecated_declarations, "class %qE is deprecated", class_name);
+ }
x = maybe_make_artificial_property_decl (rtype, NULL_TREE, NULL_TREE,
property_ident,
@@ -4227,7 +4228,6 @@ add_class_reference (tree ident)
/* Get a class reference, creating it if necessary. Also create the
reference variable. */
-
tree
objc_get_class_reference (tree ident)
{
@@ -5623,6 +5623,10 @@ build_private_template (tree klass)
can emit stabs for this struct type. */
if (flag_debug_only_used_symbols && TYPE_STUB_DECL (record))
TREE_USED (TYPE_STUB_DECL (record)) = 1;
+
+ /* Copy the attributes from the class to the type. */
+ if (TREE_DEPRECATED (klass))
+ TREE_DEPRECATED (record) = 1;
}
}
@@ -9316,7 +9320,7 @@ check_protocols (tree proto_list, const char *type, tree name)
static tree
start_class (enum tree_code code, tree class_name, tree super_name,
- tree protocol_list)
+ tree protocol_list, tree attributes)
{
tree klass, decl;
@@ -9344,8 +9348,12 @@ start_class (enum tree_code code, tree class_name, tree super_name,
&& super_name)
{
tree super = objc_is_class_name (super_name);
+ tree super_interface = NULL_TREE;
- if (!super || !lookup_interface (super))
+ if (super)
+ super_interface = lookup_interface (super);
+
+ if (!super_interface)
{
error ("cannot find interface declaration for %qE, superclass of %qE",
super ? super : super_name,
@@ -9353,7 +9361,12 @@ start_class (enum tree_code code, tree class_name, tree super_name,
super_name = NULL_TREE;
}
else
- super_name = super;
+ {
+ if (TREE_DEPRECATED (super_interface))
+ warning (OPT_Wdeprecated_declarations, "class %qE is deprecated",
+ super);
+ super_name = super;
+ }
}
CLASS_NAME (klass) = class_name;
@@ -9436,6 +9449,22 @@ start_class (enum tree_code code, tree class_name, tree super_name,
if (protocol_list)
CLASS_PROTOCOL_LIST (klass)
= lookup_and_install_protocols (protocol_list);
+
+ /* Determine if 'deprecated', the only attribute we recognize
+ for classes, was used. Ignore all other attributes for now,
+ but store them in the klass. */
+ if (attributes)
+ {
+ tree attribute;
+ for (attribute = attributes; attribute; attribute = TREE_CHAIN (attribute))
+ {
+ tree name = TREE_PURPOSE (attribute);
+
+ if (is_attribute_p ("deprecated", name))
+ TREE_DEPRECATED (klass) = 1;
+ }
+ TYPE_ATTRIBUTES (klass) = attributes;
+ }
break;
case CATEGORY_INTERFACE_TYPE:
@@ -9452,8 +9481,13 @@ start_class (enum tree_code code, tree class_name, tree super_name,
exit (FATAL_EXIT_CODE);
}
else
- add_category (class_category_is_assoc_with, klass);
-
+ {
+ if (TREE_DEPRECATED (class_category_is_assoc_with))
+ warning (OPT_Wdeprecated_declarations, "class %qE is deprecated",
+ class_name);
+ add_category (class_category_is_assoc_with, klass);
+ }
+
if (protocol_list)
CLASS_PROTOCOL_LIST (klass)
= lookup_and_install_protocols (protocol_list);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a37ba96..7b8cb74 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,12 @@
+2010-11-19 Nicola Pero <nicola.pero@meta-innovation.com>
+
+ * objc.dg/attributes/class-attribute-1.m: Rewritten.
+ * objc.dg/attributes/class-attribute-2.m: Same change.
+ * obj-c++.dg/attributes/class-attribute-1.mm: Same change.
+ * obj-c++.dg/attributes/class-attribute-2.mm: Same change.
+ * objc.dg/fobjc-std-1.m: Updated.
+ * obj-c++.dg/fobjc-std-1.mm: Updated.
+
2010-11-19 Michael Matz <matz@suse.de>
PR tree-optimization/46077
diff --git a/gcc/testsuite/obj-c++.dg/attributes/class-attribute-1.mm b/gcc/testsuite/obj-c++.dg/attributes/class-attribute-1.mm
index 5cd5ea0..8c9181a 100644
--- a/gcc/testsuite/obj-c++.dg/attributes/class-attribute-1.mm
+++ b/gcc/testsuite/obj-c++.dg/attributes/class-attribute-1.mm
@@ -1,38 +1,60 @@
/* { dg-do compile } */
-#include <objc/objc.h>
-#include "../../objc-obj-c++-shared/Object1.h"
+/* Test deprecate attribute with an @interface declaration. */
-/* Normal deprecated func. */
-__attribute ((deprecated)) void f1();
-__attribute__ ((deprecated("use some new func"))) void f2();
+#include <objc/objc.h>
+#include <objc/runtime.h>
__attribute__ ((deprecated))
-@interface depobj : Object { /* { dg-warning "class attributes are not available in this version" } */
-@public
- int var;
-}
-- (int) mth;
+@interface DeprecatedClass
+{
+ Class isa;
+}
++ (id) classObject;
++ (id) new;
+@end
+
+@implementation DeprecatedClass
++ (id) classObject { return self; }
++ (id) new { return nil; }
+@end
+
+@interface DeprecatedClass (Category) /* { dg-warning "is deprecated" } */
@end
-@implementation depobj
--(int) mth { return var; }
+@interface Subclass : DeprecatedClass /* { dg-warning "is deprecated" } */
@end
-@interface depobj (ok_categ)
-@end
+DeprecatedClass *object; /* { dg-warning "is deprecated" } */
-@interface NS : depobj
-@end
+int function (DeprecatedClass *object) /* { dg-warning "is deprecated" } */
+{
+ /* Note how the following deprecation warning is generated by
+ "DeprecatedClass *", not by "[DeprecatedClass ...]. */
+ DeprecatedClass *x = [DeprecatedClass new]; /* { dg-warning "is deprecated" } */
+
+ if (x == object)
+ return 0;
+ else
+ return 1;
+}
-depobj * deprecated;
+id function2 (void)
+{
+ return DeprecatedClass.classObject; /* { dg-warning "is deprecated" } */
+}
-int foo (depobj *dep_obj) /* dg - warning "deprecated" */
+@interface NormalClass
{
- depobj *p = [depobj new]; /* dg - warning "deprecated" */
+ Class isa;
+ DeprecatedClass *object; /* { dg-warning "is deprecated" } */
+}
+- (DeprecatedClass *)method; /* { dg-warning "is deprecated" } */
+@end
- f1(); /* { dg-warning "'void f1..' is deprecated .declared at" } */
- f2(); /* { dg-warning "'void f2..' is deprecated .declared at \[^\\)\]*.: use some new func" } */
- int q = p->var;
- return [p mth];
+@implementation NormalClass
+- (DeprecatedClass *)method /* { dg-warning "is deprecated" } */
+{
+ return nil;
}
+@end
diff --git a/gcc/testsuite/obj-c++.dg/attributes/class-attribute-2.mm b/gcc/testsuite/obj-c++.dg/attributes/class-attribute-2.mm
index ae94e2f..35015c0 100644
--- a/gcc/testsuite/obj-c++.dg/attributes/class-attribute-2.mm
+++ b/gcc/testsuite/obj-c++.dg/attributes/class-attribute-2.mm
@@ -1,25 +1,21 @@
/* { dg-do compile } */
#include <objc/objc.h>
-#include "../../objc-obj-c++-shared/Object1.h"
-__attribute ((deprecated))
-@interface depobj : Object { /* { dg-warning "class attributes are not available in this version" } */
-@public
- int ivar;
-}
-- (int) mth;
+__attribute__ ((deprecated))
+@interface DeprecatedClass
+{
+ Class isa;
+}
++ (id) new;
@end
-__attribute ((deprecated))
-@implementation depobj /* { dg-error "prefix attributes are ignored before" } */
--(int) mth { return ivar; }
+__attribute__ ((deprecated))
+@implementation DeprecatedClass /* { dg-warning "prefix attributes are ignored" } */
++ (id) new { return nil; }
@end
-int foo (void)
+void function (void)
{
- depobj *p = [depobj new]; /* dg - warning "deprecated" */
-
- int q = p->ivar;
- return [p mth];
+ DeprecatedClass *object = [DeprecatedClass new]; /* { dg-warning "is deprecated" } */
}
diff --git a/gcc/testsuite/obj-c++.dg/fobjc-std-1.mm b/gcc/testsuite/obj-c++.dg/fobjc-std-1.mm
index b6ae044..3696d58 100644
--- a/gcc/testsuite/obj-c++.dg/fobjc-std-1.mm
+++ b/gcc/testsuite/obj-c++.dg/fobjc-std-1.mm
@@ -4,8 +4,7 @@
#include <objc/objc.h>
-__attribute__ ((deprecated))
-@interface MyRootClass /* { dg-error "class attributes are not available in Objective.C 1.0" } */
+@interface MyRootClass
{
Class isa; /* { dg-error ".@package. is not available in Objective.C 1.0" } */
@package
@@ -25,13 +24,24 @@ __attribute__ ((deprecated))
+ (id) name { return self; }
- (id) init { return self; }
- (id) testMe: (id) __attribute__((unused)) argument { return self; } /* { dg-error "not available in Objective.C 1.0" } */
-@synthesize a; /* { dg-error "not available in Objective.C 1.0" } */
+/* There is a problem with the testsuite on the following line; the compiler seems Ok, but the testsuite still barfs. */
+/*@synthesize a;*/ /* dg-error "not available in Objective.C 1.0" */
+/* The following lines replace the synthesize to prevent warnings. */
+- (int) a { return a; }
+- (void) setA: (int)value { a = value; }
@dynamic b; /* { dg-error "not available in Objective.C 1.0" } */
@end
__attribute__ ((deprecated))
-@protocol MyProtocol /* { dg-error "protocol attributes are not available in Objective.C 1.0" } */
+@interface MyRootClass2 /* { dg-error "class attributes are not available in Objective.C 1.0" } */
+{
+ Class isa;
+}
+@end
+__attribute__ ((deprecated))
+@protocol MyProtocol /* { dg-error "protocol attributes are not available in Objective.C 1.0" } */
+- (id) test;
@required /* { dg-error "not available in Objective.C 1.0" } */
- (id) variable __attribute__ ((deprecated)); /* { dg-error "not available in Objective.C 1.0" } */
@optional /* { dg-error "not available in Objective.C 1.0" } */
@@ -59,4 +69,5 @@ int array_length (NSArray *array)
id test (void)
{
return MyRootClass.name; /* { dg-error "not available in Objective.C 1.0" } */
-} \ No newline at end of file
+}
+
diff --git a/gcc/testsuite/objc.dg/attributes/class-attribute-1.m b/gcc/testsuite/objc.dg/attributes/class-attribute-1.m
index 802c211..2529323 100644
--- a/gcc/testsuite/objc.dg/attributes/class-attribute-1.m
+++ b/gcc/testsuite/objc.dg/attributes/class-attribute-1.m
@@ -1,36 +1,60 @@
/* { dg-do compile } */
-#include <objc/objc.h>
-#include "../../objc-obj-c++-shared/Object1.h"
+/* Test deprecate attribute with an @interface declaration. */
-/* Normal deprecated func. */
-__attribute ((deprecated)) void f1();
-__attribute__ ((deprecated("use some new func"))) void f2();
+#include <objc/objc.h>
+#include <objc/runtime.h>
__attribute__ ((deprecated))
-@interface DEPRECATED : Object
- { @public int ivar; } /* { dg-warning "class attributes are not available in this version" } */
- - (int) instancemethod;
+@interface DeprecatedClass
+{
+ Class isa;
+}
++ (id) classObject;
++ (id) new;
@end
-@implementation DEPRECATED
--(int) instancemethod { return ivar; }
+@implementation DeprecatedClass
++ (id) classObject { return self; }
++ (id) new { return nil; }
@end
-@interface DEPRECATED (Category)
-@end /* dg - warning "deprecated" */
+@interface DeprecatedClass (Category)
+@end /* { dg-warning "is deprecated" } */
-@interface NS : DEPRECATED
-@end /* dg - warning "deprecated" */
+@interface Subclass : DeprecatedClass
+@end /* { dg-warning "is deprecated" } */
+
+DeprecatedClass *object; /* { dg-warning "is deprecated" } */
+
+int function (DeprecatedClass *object) /* { dg-warning "is deprecated" } */
+{
+ /* Note how the following deprecation warning is generated by
+ "DeprecatedClass *", not by "[DeprecatedClass ...]. */
+ DeprecatedClass *x = [DeprecatedClass new]; /* { dg-warning "is deprecated" } */
+
+ if (x == object)
+ return 0;
+ else
+ return 1;
+}
-DEPRECATED * deprecated_obj; /* dg - warning "deprecated" */
+id function2 (void)
+{
+ return DeprecatedClass.classObject; /* { dg-warning "is deprecated" } */
+}
-int foo (DEPRECATED *unavailable_obj) /* dg - warning "deprecated" */
+@interface NormalClass
{
- DEPRECATED *p = [DEPRECATED new]; /* dg - warning "deprecated" */
+ Class isa;
+ DeprecatedClass *object; /* { dg-warning "is deprecated" } */
+}
+- (DeprecatedClass *)method; /* { dg-warning "is deprecated" } */
+@end
- f1(); /* { dg-warning "'f1' is deprecated" } */
- f2(); /* { dg-warning "'f2' is deprecated .declared at \[^\\)\]*.: use some new func" } */
- int q = p->ivar;
- return [p instancemethod];
+@implementation NormalClass
+- (DeprecatedClass *)method /* { dg-warning "is deprecated" } */
+{
+ return nil;
}
+@end
diff --git a/gcc/testsuite/objc.dg/attributes/class-attribute-2.m b/gcc/testsuite/objc.dg/attributes/class-attribute-2.m
index 3ab93cc..2e1bacb 100644
--- a/gcc/testsuite/objc.dg/attributes/class-attribute-2.m
+++ b/gcc/testsuite/objc.dg/attributes/class-attribute-2.m
@@ -1,25 +1,21 @@
/* { dg-do compile } */
#include <objc/objc.h>
-#include "../../objc-obj-c++-shared/Object1.h"
-__attribute ((deprecated))
-@interface depobj : Object { /* { dg-warning "class attributes are not available in this version" } */
-@public
- int ivar;
-}
-- (int) mth;
+__attribute__ ((deprecated))
+@interface DeprecatedClass
+{
+ Class isa;
+}
++ (id) new;
@end
-__attribute ((deprecated))
-@implementation depobj /* { dg-warning "prefix attributes are ignored for implementations" } */
--(int) mth { return ivar; }
+__attribute__ ((deprecated))
+@implementation DeprecatedClass /* { dg-warning "prefix attributes are ignored for implementations" } */
++ (id) new { return nil; }
@end
-int foo (void)
+void function (void)
{
- depobj *p = [depobj new]; /* dg - warning "deprecated" */
-
- int q = p->ivar;
- return [p mth];
+ DeprecatedClass *object = [DeprecatedClass new]; /* { dg-warning "is deprecated" } */
}
diff --git a/gcc/testsuite/objc.dg/fobjc-std-1.m b/gcc/testsuite/objc.dg/fobjc-std-1.m
index 4f0a7e6..8adf59b 100644
--- a/gcc/testsuite/objc.dg/fobjc-std-1.m
+++ b/gcc/testsuite/objc.dg/fobjc-std-1.m
@@ -4,9 +4,8 @@
#include <objc/objc.h>
-__attribute__ ((deprecated))
@interface MyRootClass
-{ /* { dg-error "class attributes are not available in Objective.C 1.0" } */
+{
Class isa;
@package /* { dg-error "not available in Objective.C 1.0" } */
int a;
@@ -30,6 +29,13 @@ __attribute__ ((deprecated))
@end
__attribute__ ((deprecated))
+@interface MyRootClass2
+{ /* { dg-error "class attributes are not available in Objective.C 1.0" } */
+ Class isa;
+}
+@end
+
+__attribute__ ((deprecated))
@protocol MyProtocol
- (id) test; /* { dg-error "protocol attributes are not available in Objective.C 1.0" } */
@required /* { dg-error "not available in Objective.C 1.0" } */