This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug objc/48527] New: Incorrect list of methods in @protocol used across compilation units


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]