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

43 lines
523 B
C

// Matching
enum E1 {
E1Enumerator1,
E1Enumerator2 = 3,
E1Enumerator3
} x1;
// Value mismatch
enum E2 {
E2Enumerator1,
E2Enumerator2 = 4,
E2Enumerator3
} x2;
// Name mismatch
enum E3 {
E3Enumerator1,
E3Enumerator = 3,
E3Enumerator3
} x3;
// Missing enumerator
enum E4 {
E4Enumerator1,
E4Enumerator2
} x4;
// Extra enumerator
enum E5 {
E5Enumerator1,
E5Enumerator2,
E5Enumerator3,
E5Enumerator4
} x5;
// Matching, with typedef
typedef enum {
E6Enumerator1,
E6Enumerator2
} E6;
E6 x6;