Douglas Gregor b4964f7705 Cope with anonymous tags defined within declarators by structurally
comparing their types under the assumption that they are equivalent,
rather than importing the types and then checking for compatibility. A
few minor tweaks here:
  - Teach structural matching to handle compatibility between
  function types with prototypes and those without prototypes.
  - Teach structural matching that an incomplete record decl is the
  same as any other record decl with the same name.
  - Keep track of pairs of declarations that we have already checked
  (but failed to find as structurally matching), so we don't emit
  diagnostics repeatedly.
  - When importing a typedef of an anonymous tag, be sure to link the
  imported tag type to its typedef.

With these changes, we survive a repeated import of <stdlib.h> and
<stdio.h>. Alas, the ASTNodeImporter is getting a little grotty.

llvm-svn: 96298
2010-02-15 23:54:17 +00:00

64 lines
947 B
C

typedef int Int;
typedef float Float;
// Matches
struct S0 {
Int field1;
Float field2;
};
struct S0 x0;
// Mismatch in field type
struct S1 {
Int field1;
int field2;
};
struct S1 x1;
// Mismatch in tag kind.
struct S2 { int i; float f; } x2;
// Missing fields
struct S3 { int i; float f; double d; } x3;
// Extra fields
struct S4 { int i; } x4;
// Bit-field matches
struct S5 { int i : 8; unsigned j : 8; } x5;
// Bit-field mismatch
struct S6 { int i : 8; unsigned j : 8; } x6;
// Bit-field mismatch
struct S7 { int i : 8; unsigned j : 8; } x7;
// Incomplete type
struct S8 *x8;
// Incomplete type
struct S9 { int i; float f; } *x9;
// Incomplete type
struct S10 *x10;
// Matches
struct ListNode {
int value;
struct ListNode *Next;
} xList;
// Mismatch due to struct used internally
struct DeepError {
int value;
struct DeeperError { int i; int f; } *Deeper;
} xDeep;
// Matches
struct {
Int i;
float f;
} x11;