Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[GNU ObjC] Fix a regression listing methods twice.
Methods synthesized from declared properties were being added to the method lists twice. This came from the change to list them in the class's method list, which missed removing the place in CGObjCGNU that added them again. Reviewed By: lanza Differential Revision: https://reviews.llvm.org/D91874
- Loading branch information
1 parent
82d9fb0
commit d1ed670
Showing
2 changed files
with
23 additions
and
13 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
// RUN: %clang_cc1 -triple x86_64-unknown-freebsd -S -emit-llvm -fobjc-runtime=gnustep-2.0 -o - %s | FileCheck %s -check-prefix=CHECK-NEW | ||
// RUN: %clang_cc1 -triple x86_64-unknown-freebsd -S -emit-llvm -fobjc-runtime=gnustep-1.8 -o - %s | FileCheck %s -check-prefix=CHECK-OLD | ||
|
||
// Clang 9 or 10 changed the handling of method lists so that methods provided | ||
// from synthesised properties showed up in the method list, where previously | ||
// CGObjCGNU had to collect them and merge them. One of the places where this | ||
// merging happened was missed in the move and so we ended up emitting two | ||
// copies of method metadata for declared properties. | ||
|
||
// This class has only instance properties and only one pair of synthesized | ||
// methods from the property and so we should synthesize only one method list, | ||
// with precisely two methods on it. | ||
@interface X | ||
@property (retain) id iProp; | ||
@end | ||
|
||
@implementation X | ||
@synthesize iProp; | ||
@end | ||
|
||
// Check that the method list has precisely 2 methods. | ||
// CHECK-NEW: @.objc_method_list = internal global { i8*, i32, i64, [2 x | ||
// CHECK-OLD: @.objc_method_list = internal global { i8*, i32, [2 x |