This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug objc/48527] New: Incorrect list of methods in @protocol used across compilation units
- From: "nicola at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Sat, 9 Apr 2011 10:46:20 +0000
- Subject: [Bug objc/48527] New: Incorrect list of methods in @protocol used across compilation units
- Auto-submitted: auto-generated
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