Commit d4e72c58 by Nicola Pero Committed by Nicola Pero

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
parent 39986460
2010-11-19 Nicola Pero <nicola.pero@meta-innovation.com> 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' * objc-act.c (lookup_protocol): Added 'warn_if_deprecated'
argument. If it is 'true' and the protocol is deprecated, emit a argument. If it is 'true' and the protocol is deprecated, emit a
deprecation warning. deprecation warning.
......
...@@ -144,7 +144,7 @@ static tree get_proto_encoding (tree); ...@@ -144,7 +144,7 @@ static tree get_proto_encoding (tree);
static tree lookup_interface (tree); static tree lookup_interface (tree);
static tree objc_add_static_instance (tree, 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 tree continue_class (tree);
static void finish_class (tree); static void finish_class (tree);
static void start_method_def (tree); static void start_method_def (tree);
...@@ -730,18 +730,12 @@ void ...@@ -730,18 +730,12 @@ void
objc_start_class_interface (tree klass, tree super_class, objc_start_class_interface (tree klass, tree super_class,
tree protos, tree attributes) tree protos, tree attributes)
{ {
if (attributes) if (flag_objc1_only && attributes)
{ error_at (input_location, "class attributes are not available in Objective-C 1.0");
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)");
}
objc_interface_context objc_interface_context
= objc_ivar_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; objc_ivar_visibility = OBJC_IVAR_VIS_PROTECTED;
} }
...@@ -759,7 +753,7 @@ objc_start_category_interface (tree klass, tree categ, ...@@ -759,7 +753,7 @@ objc_start_category_interface (tree klass, tree categ,
" of the compiler, (ignored)"); " of the compiler, (ignored)");
} }
objc_interface_context objc_interface_context
= start_class (CATEGORY_INTERFACE_TYPE, klass, categ, protos); = start_class (CATEGORY_INTERFACE_TYPE, klass, categ, protos, NULL_TREE);
objc_ivar_chain objc_ivar_chain
= continue_class (objc_interface_context); = continue_class (objc_interface_context);
} }
...@@ -795,7 +789,8 @@ objc_start_class_implementation (tree klass, tree super_class) ...@@ -795,7 +789,8 @@ objc_start_class_implementation (tree klass, tree super_class)
{ {
objc_implementation_context objc_implementation_context
= objc_ivar_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; objc_ivar_visibility = OBJC_IVAR_VIS_PROTECTED;
} }
...@@ -803,7 +798,8 @@ void ...@@ -803,7 +798,8 @@ void
objc_start_category_implementation (tree klass, tree categ) objc_start_category_implementation (tree klass, tree categ)
{ {
objc_implementation_context 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 objc_ivar_chain
= continue_class (objc_implementation_context); = continue_class (objc_implementation_context);
} }
...@@ -1708,6 +1704,11 @@ objc_build_class_component_ref (tree class_name, tree property_ident) ...@@ -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); error_at (input_location, "could not find interface for class %qE", class_name);
return error_mark_node; 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, x = maybe_make_artificial_property_decl (rtype, NULL_TREE, NULL_TREE,
property_ident, property_ident,
...@@ -4227,7 +4228,6 @@ add_class_reference (tree ident) ...@@ -4227,7 +4228,6 @@ add_class_reference (tree ident)
/* Get a class reference, creating it if necessary. Also create the /* Get a class reference, creating it if necessary. Also create the
reference variable. */ reference variable. */
tree tree
objc_get_class_reference (tree ident) objc_get_class_reference (tree ident)
{ {
...@@ -5623,6 +5623,10 @@ build_private_template (tree klass) ...@@ -5623,6 +5623,10 @@ build_private_template (tree klass)
can emit stabs for this struct type. */ can emit stabs for this struct type. */
if (flag_debug_only_used_symbols && TYPE_STUB_DECL (record)) if (flag_debug_only_used_symbols && TYPE_STUB_DECL (record))
TREE_USED (TYPE_STUB_DECL (record)) = 1; 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) ...@@ -9316,7 +9320,7 @@ check_protocols (tree proto_list, const char *type, tree name)
static tree static tree
start_class (enum tree_code code, tree class_name, tree super_name, start_class (enum tree_code code, tree class_name, tree super_name,
tree protocol_list) tree protocol_list, tree attributes)
{ {
tree klass, decl; tree klass, decl;
...@@ -9344,8 +9348,12 @@ start_class (enum tree_code code, tree class_name, tree super_name, ...@@ -9344,8 +9348,12 @@ start_class (enum tree_code code, tree class_name, tree super_name,
&& super_name) && super_name)
{ {
tree super = objc_is_class_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", error ("cannot find interface declaration for %qE, superclass of %qE",
super ? super : super_name, super ? super : super_name,
...@@ -9353,7 +9361,12 @@ start_class (enum tree_code code, tree class_name, tree super_name, ...@@ -9353,7 +9361,12 @@ start_class (enum tree_code code, tree class_name, tree super_name,
super_name = NULL_TREE; super_name = NULL_TREE;
} }
else 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; CLASS_NAME (klass) = class_name;
...@@ -9436,6 +9449,22 @@ start_class (enum tree_code code, tree class_name, tree super_name, ...@@ -9436,6 +9449,22 @@ start_class (enum tree_code code, tree class_name, tree super_name,
if (protocol_list) if (protocol_list)
CLASS_PROTOCOL_LIST (klass) CLASS_PROTOCOL_LIST (klass)
= lookup_and_install_protocols (protocol_list); = 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; break;
case CATEGORY_INTERFACE_TYPE: case CATEGORY_INTERFACE_TYPE:
...@@ -9452,8 +9481,13 @@ start_class (enum tree_code code, tree class_name, tree super_name, ...@@ -9452,8 +9481,13 @@ start_class (enum tree_code code, tree class_name, tree super_name,
exit (FATAL_EXIT_CODE); exit (FATAL_EXIT_CODE);
} }
else 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) if (protocol_list)
CLASS_PROTOCOL_LIST (klass) CLASS_PROTOCOL_LIST (klass)
= lookup_and_install_protocols (protocol_list); = lookup_and_install_protocols (protocol_list);
......
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> 2010-11-19 Michael Matz <matz@suse.de>
PR tree-optimization/46077 PR tree-optimization/46077
......
/* { dg-do compile } */ /* { dg-do compile } */
#include <objc/objc.h> /* Test deprecate attribute with an @interface declaration. */
#include "../../objc-obj-c++-shared/Object1.h"
/* Normal deprecated func. */ #include <objc/objc.h>
__attribute ((deprecated)) void f1(); #include <objc/runtime.h>
__attribute__ ((deprecated("use some new func"))) void f2();
__attribute__ ((deprecated)) __attribute__ ((deprecated))
@interface depobj : Object { /* { dg-warning "class attributes are not available in this version" } */ @interface DeprecatedClass
@public {
int var; Class isa;
} }
- (int) mth; + (id) classObject;
+ (id) new;
@end
@implementation DeprecatedClass
+ (id) classObject { return self; }
+ (id) new { return nil; }
@end
@interface DeprecatedClass (Category) /* { dg-warning "is deprecated" } */
@end @end
@implementation depobj @interface Subclass : DeprecatedClass /* { dg-warning "is deprecated" } */
-(int) mth { return var; }
@end @end
@interface depobj (ok_categ) DeprecatedClass *object; /* { dg-warning "is deprecated" } */
@end
@interface NS : depobj int function (DeprecatedClass *object) /* { dg-warning "is deprecated" } */
@end {
/* 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" } */ @implementation NormalClass
f2(); /* { dg-warning "'void f2..' is deprecated .declared at \[^\\)\]*.: use some new func" } */ - (DeprecatedClass *)method /* { dg-warning "is deprecated" } */
int q = p->var; {
return [p mth]; return nil;
} }
@end
/* { dg-do compile } */ /* { dg-do compile } */
#include <objc/objc.h> #include <objc/objc.h>
#include "../../objc-obj-c++-shared/Object1.h"
__attribute ((deprecated)) __attribute__ ((deprecated))
@interface depobj : Object { /* { dg-warning "class attributes are not available in this version" } */ @interface DeprecatedClass
@public {
int ivar; Class isa;
} }
- (int) mth; + (id) new;
@end @end
__attribute ((deprecated)) __attribute__ ((deprecated))
@implementation depobj /* { dg-error "prefix attributes are ignored before" } */ @implementation DeprecatedClass /* { dg-warning "prefix attributes are ignored" } */
-(int) mth { return ivar; } + (id) new { return nil; }
@end @end
int foo (void) void function (void)
{ {
depobj *p = [depobj new]; /* dg - warning "deprecated" */ DeprecatedClass *object = [DeprecatedClass new]; /* { dg-warning "is deprecated" } */
int q = p->ivar;
return [p mth];
} }
...@@ -4,8 +4,7 @@ ...@@ -4,8 +4,7 @@
#include <objc/objc.h> #include <objc/objc.h>
__attribute__ ((deprecated)) @interface MyRootClass
@interface MyRootClass /* { dg-error "class attributes are not available in Objective.C 1.0" } */
{ {
Class isa; /* { dg-error ".@package. is not available in Objective.C 1.0" } */ Class isa; /* { dg-error ".@package. is not available in Objective.C 1.0" } */
@package @package
...@@ -25,13 +24,24 @@ __attribute__ ((deprecated)) ...@@ -25,13 +24,24 @@ __attribute__ ((deprecated))
+ (id) name { return self; } + (id) name { return self; }
- (id) init { return self; } - (id) init { return self; }
- (id) testMe: (id) __attribute__((unused)) argument { return self; } /* { dg-error "not available in Objective.C 1.0" } */ - (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" } */ @dynamic b; /* { dg-error "not available in Objective.C 1.0" } */
@end @end
__attribute__ ((deprecated)) __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" } */ @required /* { dg-error "not available in Objective.C 1.0" } */
- (id) variable __attribute__ ((deprecated)); /* { 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" } */ @optional /* { dg-error "not available in Objective.C 1.0" } */
...@@ -59,4 +69,5 @@ int array_length (NSArray *array) ...@@ -59,4 +69,5 @@ int array_length (NSArray *array)
id test (void) id test (void)
{ {
return MyRootClass.name; /* { dg-error "not available in Objective.C 1.0" } */ return MyRootClass.name; /* { dg-error "not available in Objective.C 1.0" } */
} }
\ No newline at end of file
/* { dg-do compile } */ /* { dg-do compile } */
#include <objc/objc.h> /* Test deprecate attribute with an @interface declaration. */
#include "../../objc-obj-c++-shared/Object1.h"
/* Normal deprecated func. */ #include <objc/objc.h>
__attribute ((deprecated)) void f1(); #include <objc/runtime.h>
__attribute__ ((deprecated("use some new func"))) void f2();
__attribute__ ((deprecated)) __attribute__ ((deprecated))
@interface DEPRECATED : Object @interface DeprecatedClass
{ @public int ivar; } /* { dg-warning "class attributes are not available in this version" } */ {
- (int) instancemethod; Class isa;
}
+ (id) classObject;
+ (id) new;
@end @end
@implementation DEPRECATED @implementation DeprecatedClass
-(int) instancemethod { return ivar; } + (id) classObject { return self; }
+ (id) new { return nil; }
@end @end
@interface DEPRECATED (Category) @interface DeprecatedClass (Category)
@end /* dg - warning "deprecated" */ @end /* { dg-warning "is deprecated" } */
@interface NS : DEPRECATED @interface Subclass : DeprecatedClass
@end /* dg - warning "deprecated" */ @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" } */ @implementation NormalClass
f2(); /* { dg-warning "'f2' is deprecated .declared at \[^\\)\]*.: use some new func" } */ - (DeprecatedClass *)method /* { dg-warning "is deprecated" } */
int q = p->ivar; {
return [p instancemethod]; return nil;
} }
@end
/* { dg-do compile } */ /* { dg-do compile } */
#include <objc/objc.h> #include <objc/objc.h>
#include "../../objc-obj-c++-shared/Object1.h"
__attribute ((deprecated)) __attribute__ ((deprecated))
@interface depobj : Object { /* { dg-warning "class attributes are not available in this version" } */ @interface DeprecatedClass
@public {
int ivar; Class isa;
} }
- (int) mth; + (id) new;
@end @end
__attribute ((deprecated)) __attribute__ ((deprecated))
@implementation depobj /* { dg-warning "prefix attributes are ignored for implementations" } */ @implementation DeprecatedClass /* { dg-warning "prefix attributes are ignored for implementations" } */
-(int) mth { return ivar; } + (id) new { return nil; }
@end @end
int foo (void) void function (void)
{ {
depobj *p = [depobj new]; /* dg - warning "deprecated" */ DeprecatedClass *object = [DeprecatedClass new]; /* { dg-warning "is deprecated" } */
int q = p->ivar;
return [p mth];
} }
...@@ -4,9 +4,8 @@ ...@@ -4,9 +4,8 @@
#include <objc/objc.h> #include <objc/objc.h>
__attribute__ ((deprecated))
@interface MyRootClass @interface MyRootClass
{ /* { dg-error "class attributes are not available in Objective.C 1.0" } */ {
Class isa; Class isa;
@package /* { dg-error "not available in Objective.C 1.0" } */ @package /* { dg-error "not available in Objective.C 1.0" } */
int a; int a;
...@@ -30,6 +29,13 @@ __attribute__ ((deprecated)) ...@@ -30,6 +29,13 @@ __attribute__ ((deprecated))
@end @end
__attribute__ ((deprecated)) __attribute__ ((deprecated))
@interface MyRootClass2
{ /* { dg-error "class attributes are not available in Objective.C 1.0" } */
Class isa;
}
@end
__attribute__ ((deprecated))
@protocol MyProtocol @protocol MyProtocol
- (id) test; /* { dg-error "protocol attributes are not available in Objective.C 1.0" } */ - (id) test; /* { dg-error "protocol attributes are not available in Objective.C 1.0" } */
@required /* { dg-error "not available in Objective.C 1.0" } */ @required /* { dg-error "not available in Objective.C 1.0" } */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment