This commit introduces a set of related changes to ensure that the declaration that shows up in the identifier chain after deserializing declarations with a given identifier is, in fact, the most recent declaration. The primary change involves waiting until after we deserialize and wire up redeclaration chains before updating the identifier chains. There is a minor optimization in here to avoid recursively deserializing names as part of looking to see whether top-level declarations for a given name exist. A related change that became suddenly more urgent is to property record a merged declaration when an entity first declared in the current translation unit is later deserialized from a module (that had not been loaded at the time of the original declaration). Since we key off the canonical declaration (which is parsed, not from an AST file) for emitted redeclarations, we simply record this as a merged declaration during AST writing and let the readers merge them. Re-fixes <rdar://problem/13189985>, presumably for good this time. llvm-svn: 175447
91 lines
1.2 KiB
Objective-C
91 lines
1.2 KiB
Objective-C
@import redecl_merge_top;
|
|
|
|
@interface Super
|
|
@end
|
|
|
|
@interface A : Super
|
|
- (Super*)init;
|
|
@end
|
|
|
|
@class B;
|
|
|
|
@protocol P1
|
|
- (void)protoMethod1;
|
|
@end
|
|
|
|
@protocol P1;
|
|
|
|
@protocol P2;
|
|
|
|
@protocol P2;
|
|
|
|
@protocol P2;
|
|
|
|
struct S1;
|
|
struct S2;
|
|
|
|
void consume_S1(struct S1*);
|
|
struct S2 *produce_S2(void);
|
|
|
|
// Test declarations in different modules with no common initial
|
|
// declaration.
|
|
@class C;
|
|
C *get_a_C(void);
|
|
@class C2;
|
|
C2 *get_a_C2(void);
|
|
@class C3;
|
|
C3 *get_a_C3(void);
|
|
|
|
@class C4;
|
|
@class C4;
|
|
@class C4;
|
|
@class C4;
|
|
C4 *get_a_C4(void);
|
|
|
|
@class Explicit;
|
|
|
|
int *explicit_func(void);
|
|
|
|
struct explicit_struct;
|
|
|
|
@protocol P4, P3;
|
|
@protocol P3;
|
|
@protocol P3;
|
|
@protocol P3;
|
|
|
|
struct S3;
|
|
struct S4;
|
|
|
|
void consume_S3(struct S3*);
|
|
struct S4 *produce_S4(void);
|
|
|
|
typedef int T1;
|
|
typedef double T2;
|
|
|
|
int func0(int);
|
|
int func1(int);
|
|
int func1(int);
|
|
int func1(int x) { return x; }
|
|
int func1(int);
|
|
static int func2(int);
|
|
|
|
|
|
|
|
|
|
// Spacing matters!
|
|
extern int var1;
|
|
extern int var2;
|
|
|
|
static double var3;
|
|
|
|
int ONE;
|
|
@import redecl_merge_top.Explicit;
|
|
const int one = ONE;
|
|
|
|
@interface ClassWithDef
|
|
- (void)method;
|
|
@end
|
|
|
|
void eventually_noreturn(void) __attribute__((noreturn));
|
|
void eventually_noreturn2(void) __attribute__((noreturn));
|