aprantl added a comment.

In D66121#1656442 <https://reviews.llvm.org/D66121#1656442>, @rjmccall wrote:

> Can you prepare an NFC patch with just the changes relating to adding 
> `ObjCPropertyImplDecl::get{Getter,Setter}MethodDecl`?


Sure, I will do that.

> I don't get why the redeclaration logic is changing.  What happens when a 
> normal method is implemented?  Is that not linked up as a redeclaration?

From what I can tell from injecting an assertion into 
`ObjCMethodDecl::setAsRedeclaration()` only redeclarations within the same 
protocol/interface/category are linked up as redeclarations. An implementation 
of an interface is not a redeclaration in the SemaObjC sense. Digging further, 
this is implemented in 
https://github.com/llvm/llvm-project/blob/244e738485445fa4b72bfef9b9b2f9625cee989e/clang/lib/Sema/SemaDeclObjC.cpp#L3930
 by checking whether a method's selector has been processed before within the 
same property/interface/category.

That's very different from what my patch is doing. The following example is 
extracted from `clang/test/CodeGenObjC/newproperty-nested-synthesis-1.m`:

   1    @interface Tester : Object
   2    @property char PropertyAtomic_char;
   3    @end
   4    
   5    @implementation Tester
   6    @dynamic PropertyAtomic_char;
   7    @end
   8    
   9    @interface SubClass : Tester
  10    {
  11        char PropertyAtomic_char;
  12    }
  13    @end
  14    
  15    @implementation SubClass
  16    @synthesize PropertyAtomic_char;
  17    @end

My patch sets the getter synthesized at line 6 up as a redeclaration of getter 
from the interface on line 2 and the getter from `SubClass` on line 16 as a 
redeclaration of the getter from `Tester` on line 6. That must be wrong: If 
there were another subclass of `Tester` with another getter, the compiler would 
assert, because each Objective-C method declaration can have at most one 
redeclaration.

So in summary I think what I was trying to do doesn't make sense in the 
existing infrastructure and I shouldn't be trying to set up methods as 
redeclarations between *different* interfaces/protocols/implementations. Do you 
agree with this assessment? If yes I'll try to redo the patch without using the 
redeclaration mechanism.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D66121/new/

https://reviews.llvm.org/D66121



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to