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
This commit is contained in:
parent
39986460d6
commit
d4e72c58e3
@ -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.
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
@end
|
||||
|
||||
@implementation depobj
|
||||
-(int) mth { return var; }
|
||||
@end
|
||||
|
||||
@interface depobj (ok_categ)
|
||||
@end
|
||||
|
||||
@interface NS : depobj
|
||||
@end
|
||||
|
||||
depobj * deprecated;
|
||||
|
||||
int foo (depobj *dep_obj) /* dg - warning "deprecated" */
|
||||
@interface DeprecatedClass
|
||||
{
|
||||
depobj *p = [depobj new]; /* dg - warning "deprecated" */
|
||||
|
||||
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];
|
||||
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
|
||||
|
||||
@interface Subclass : DeprecatedClass /* { dg-warning "is deprecated" } */
|
||||
@end
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
id function2 (void)
|
||||
{
|
||||
return DeprecatedClass.classObject; /* { dg-warning "is deprecated" } */
|
||||
}
|
||||
|
||||
@interface NormalClass
|
||||
{
|
||||
Class isa;
|
||||
DeprecatedClass *object; /* { dg-warning "is deprecated" } */
|
||||
}
|
||||
- (DeprecatedClass *)method; /* { dg-warning "is deprecated" } */
|
||||
@end
|
||||
|
||||
@implementation NormalClass
|
||||
- (DeprecatedClass *)method /* { dg-warning "is deprecated" } */
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
@end
|
||||
|
@ -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;
|
||||
@end
|
||||
|
||||
__attribute ((deprecated))
|
||||
@implementation depobj /* { dg-error "prefix attributes are ignored before" } */
|
||||
-(int) mth { return ivar; }
|
||||
@end
|
||||
|
||||
int foo (void)
|
||||
__attribute__ ((deprecated))
|
||||
@interface DeprecatedClass
|
||||
{
|
||||
depobj *p = [depobj new]; /* dg - warning "deprecated" */
|
||||
|
||||
int q = p->ivar;
|
||||
return [p mth];
|
||||
Class isa;
|
||||
}
|
||||
+ (id) new;
|
||||
@end
|
||||
|
||||
__attribute__ ((deprecated))
|
||||
@implementation DeprecatedClass /* { dg-warning "prefix attributes are ignored" } */
|
||||
+ (id) new { return nil; }
|
||||
@end
|
||||
|
||||
void function (void)
|
||||
{
|
||||
DeprecatedClass *object = [DeprecatedClass new]; /* { dg-warning "is deprecated" } */
|
||||
}
|
||||
|
@ -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" } */
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
@end
|
||||
|
||||
@implementation DEPRECATED
|
||||
-(int) instancemethod { return ivar; }
|
||||
@end
|
||||
|
||||
@interface DEPRECATED (Category)
|
||||
@end /* dg - warning "deprecated" */
|
||||
|
||||
@interface NS : DEPRECATED
|
||||
@end /* dg - warning "deprecated" */
|
||||
|
||||
DEPRECATED * deprecated_obj; /* dg - warning "deprecated" */
|
||||
|
||||
int foo (DEPRECATED *unavailable_obj) /* dg - warning "deprecated" */
|
||||
@interface DeprecatedClass
|
||||
{
|
||||
DEPRECATED *p = [DEPRECATED new]; /* dg - warning "deprecated" */
|
||||
|
||||
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];
|
||||
Class isa;
|
||||
}
|
||||
+ (id) classObject;
|
||||
+ (id) new;
|
||||
@end
|
||||
|
||||
@implementation DeprecatedClass
|
||||
+ (id) classObject { return self; }
|
||||
+ (id) new { return nil; }
|
||||
@end
|
||||
|
||||
@interface DeprecatedClass (Category)
|
||||
@end /* { dg-warning "is 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;
|
||||
}
|
||||
|
||||
id function2 (void)
|
||||
{
|
||||
return DeprecatedClass.classObject; /* { dg-warning "is deprecated" } */
|
||||
}
|
||||
|
||||
@interface NormalClass
|
||||
{
|
||||
Class isa;
|
||||
DeprecatedClass *object; /* { dg-warning "is deprecated" } */
|
||||
}
|
||||
- (DeprecatedClass *)method; /* { dg-warning "is deprecated" } */
|
||||
@end
|
||||
|
||||
@implementation NormalClass
|
||||
- (DeprecatedClass *)method /* { dg-warning "is deprecated" } */
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
@end
|
||||
|
@ -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;
|
||||
@end
|
||||
|
||||
__attribute ((deprecated))
|
||||
@implementation depobj /* { dg-warning "prefix attributes are ignored for implementations" } */
|
||||
-(int) mth { return ivar; }
|
||||
@end
|
||||
|
||||
int foo (void)
|
||||
__attribute__ ((deprecated))
|
||||
@interface DeprecatedClass
|
||||
{
|
||||
depobj *p = [depobj new]; /* dg - warning "deprecated" */
|
||||
|
||||
int q = p->ivar;
|
||||
return [p mth];
|
||||
Class isa;
|
||||
}
|
||||
+ (id) new;
|
||||
@end
|
||||
|
||||
__attribute__ ((deprecated))
|
||||
@implementation DeprecatedClass /* { dg-warning "prefix attributes are ignored for implementations" } */
|
||||
+ (id) new { return nil; }
|
||||
@end
|
||||
|
||||
void function (void)
|
||||
{
|
||||
DeprecatedClass *object = [DeprecatedClass new]; /* { dg-warning "is deprecated" } */
|
||||
}
|
||||
|
@ -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;
|
||||
@ -29,6 +28,13 @@ __attribute__ ((deprecated))
|
||||
@dynamic b; /* { dg-error "not available in Objective.C 1.0" } */
|
||||
@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" } */
|
||||
|
Loading…
Reference in New Issue
Block a user