llvm-project/clang/test/Modules/Inputs/redecl-merge-left.h
Douglas Gregor 6168bd2323 Ensure that the identifier chains have the most recent declaration after module deserialization.
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
2013-02-18 15:53:43 +00:00

94 lines
1.2 KiB
Objective-C

@import redecl_merge_top;
@class A;
@class A;
@interface B
+ (B*) create_a_B;
@end
@class A;
@protocol P1;
@protocol P2
- (void)protoMethod2;
@end
struct S1;
struct S2 {
int field;
};
struct S1 *produce_S1(void);
void consume_S2(struct S2*);
// Test declarations in different modules with no common initial
// declaration.
@class C;
void accept_a_C(C*);
@class C2;
void accept_a_C2(C2*);
@class C3;
void accept_a_C3(C3*);
@class C3;
@class C4;
@class Explicit;
int *explicit_func(void);
struct explicit_struct;
@protocol P3, P4;
@protocol P3;
struct S3;
struct S3;
struct S4 {
int field;
};
struct S3 *produce_S3(void);
void consume_S4(struct S4*);
typedef int T1;
typedef float T2;
int func0(int);
int func1(int x) { return x; }
int func2(int);
// Spacing matters!
extern int var1;
extern float var2;
extern double var3;
// Make sure this doesn't introduce an ambiguity-creating 'id' at the
// top level.
typedef void funcptr_with_id(int id);
// A class that is declared in the 'bottom' module, then loaded from
// one of the modules it depends on.
@interface DeclaredThenLoaded
- declaredThenLoadedMethod;
@end
@class DeclaredThenLoaded;
void eventually_noreturn2(void);