[Bug objc/48527] New: Incorrect list of methods in @protocol used across compilation units
nicola at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Sat Apr 9 10:46:00 GMT 2011
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48527
Summary: Incorrect list of methods in @protocol used across
compilation units
Product: gcc
Version: 4.6.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: objc
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: nicola@gcc.gnu.org
I'm using GCC 4.6.0.
The following example shows things working correctly when a protocol is used
in the same compilation unit:
[nicola@lampone ~]$ cat x1.m
#include <objc/runtime.h>
@protocol A
- (void) test;
@end
int main (void)
{
Protocol *p = @protocol (A);
struct objc_method_description method = protocol_getMethodDescription (p,
@selector (test),
YES,
YES);
printf ("Protocol name is %s\n", protocol_getName (p));
printf ("Method is %s, %s\n", sel_getName (method.name), method.types);
return 0;
}
[nicola@lampone ~]$ gcc x1.m -lobjc
x1.m: In function ‘main’:
x1.m:13:3: warning: incompatible implicit declaration of built-in function
‘printf’ [enabled by default]
[nicola@lampone ~]$ ./a.out
Protocol name is A
Method is test, v8@0:4
[nicola@lampone ~]$
This shows the protocol being recognized, and the full list of methods being
available when you introspect the protocol. :-)
But, if you move the @protocol to another compilation unit, things stop
working! :-(
[nicola@lampone ~]$ cat x2.m
#include <objc/runtime.h>
@protocol A;
int main (void)
{
Protocol *p = @protocol (A);
struct objc_method_description method = protocol_getMethodDescription (p,
@selector (test),
YES,
YES);
printf ("Protocol name is %s\n", protocol_getName (p));
printf ("Method is %s, %s\n", sel_getName (method.name), method.types);
return 0;
}
[nicola@lampone ~]$ gcc x2.m -c
x2.m: In function ‘main’:
x2.m:11:3: warning: incompatible implicit declaration of built-in function
‘printf’ [enabled by default]
[nicola@lampone ~]$ cat x3.m
#include <objc/runtime.h>
@protocol A
- (void) test;
@end
[nicola@lampone ~]$ gcc x3.m -c
[nicola@lampone ~]$ gcc x2.o x3.o -lobjc
[nicola@lampone ~]$ ./a.out
Protocol name is A
Method is <null selector>, (null)
[nicola@lampone ~]$
As you can see, in this case the protocol looks good if you check only the
name, but it isn't, since the method is not there in the list of protocol
methods!
Thanks
More information about the Gcc-bugs
mailing list