Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Objective-C] Fix non-determinism in clang
Summary: Iteration of the unordered Ivars causes objc-modern-metadata-visibility.mm (uncovered by reverse iterating SmallPtrSet). Reviewers: dblaikie, davide, rsmith Reviewed By: dblaikie Subscribers: cfe-commits, llvm-commits Differential Revision: https://reviews.llvm.org/D34860 llvm-svn: 307296
- Loading branch information
Mandeep Singh Grang
committed
Jul 6, 2017
1 parent
e9bf7eb
commit a2baff0
Showing
2 changed files
with
50 additions
and
4 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,45 @@ | ||
// REQUIRES: abi-breaking-checks | ||
// NOTE: This test has been split from objc-modern-metadata-visibility.mm in | ||
// order to test with -reverse-iterate as this flag is only present with | ||
// ABI_BREAKING_CHECKS. | ||
|
||
// RUN: %clang_cc1 -E %s -o %t.mm -mllvm -reverse-iterate | ||
// RUN: %clang_cc1 -x objective-c++ -fblocks -fms-extensions -rewrite-objc %t.mm -mllvm -reverse-iterate -o - | FileCheck %s | ||
// rdar://11144048 | ||
|
||
@class NSString; | ||
|
||
@interface NSObject { | ||
Class isa; | ||
} | ||
@end | ||
|
||
@interface Sub : NSObject { | ||
int subIvar; | ||
NSString *nsstring; | ||
@private | ||
id PrivateIvar; | ||
} | ||
@end | ||
|
||
@implementation Sub | ||
- (id) MyNSString { return subIvar ? PrivateIvar : nsstring; } | ||
@end | ||
|
||
@interface NSString @end | ||
@implementation NSString @end | ||
|
||
// CHECK: __declspec(allocate(".objc_ivar$B")) extern "C" __declspec(dllimport) unsigned long OBJC_IVAR_$_Sub$subIvar; | ||
// CHECK: __declspec(allocate(".objc_ivar$B")) extern "C" unsigned long OBJC_IVAR_$_Sub$PrivateIvar; | ||
// CHECK: __declspec(allocate(".objc_ivar$B")) extern "C" __declspec(dllimport) unsigned long OBJC_IVAR_$_Sub$nsstring; | ||
// CHECK: #pragma warning(disable:4273) | ||
// CHECK: __declspec(allocate(".objc_ivar$B")) extern "C" __declspec(dllexport) unsigned long int OBJC_IVAR_$_Sub$subIvar | ||
// CHECK: __declspec(allocate(".objc_ivar$B")) extern "C" __declspec(dllexport) unsigned long int OBJC_IVAR_$_Sub$nsstring | ||
// CHECK: __declspec(allocate(".objc_ivar$B")) extern "C" unsigned long int OBJC_IVAR_$_Sub$PrivateIvar | ||
// CHECK: extern "C" __declspec(dllimport) struct _class_t OBJC_METACLASS_$_NSObject; | ||
// CHECK: extern "C" __declspec(dllexport) struct _class_t OBJC_METACLASS_$_Sub | ||
// CHECK: extern "C" __declspec(dllimport) struct _class_t OBJC_CLASS_$_NSObject; | ||
// CHECK: extern "C" __declspec(dllexport) struct _class_t OBJC_CLASS_$_Sub | ||
// CHECK: extern "C" __declspec(dllexport) struct _class_t OBJC_CLASS_$_NSString; | ||
// CHECK: extern "C" __declspec(dllexport) struct _class_t OBJC_METACLASS_$_NSString | ||
// CHECK: extern "C" __declspec(dllexport) struct _class_t OBJC_CLASS_$_NSString |