Commit a60e8927 authored by Weverything's avatar Weverything
Browse files

[ODRHash] Fix wrong error message with bitfields and mutable.

Add a check to bitfield mismatches that may have caused Clang to
give an error about the bitfield instead of being mutable.
parent 36eedfcb
Loading
Loading
Loading
Loading
+16 −8
Original line number Diff line number Diff line
@@ -10094,15 +10094,23 @@ void ASTReader::diagnoseOdrViolations() {
        }

        if (IsFirstBitField && IsSecondBitField) {
          ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(),
          unsigned FirstBitWidthHash =
              ComputeODRHash(FirstField->getBitWidth());
          unsigned SecondBitWidthHash =
              ComputeODRHash(SecondField->getBitWidth());
          if (FirstBitWidthHash != SecondBitWidthHash) {
            ODRDiagError(FirstField->getLocation(),
                         FirstField->getSourceRange(),
                         FieldDifferentWidthBitField)
                << FirstII << FirstField->getBitWidth()->getSourceRange();
          ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(),
            ODRDiagNote(SecondField->getLocation(),
                        SecondField->getSourceRange(),
                        FieldDifferentWidthBitField)
                << SecondII << SecondField->getBitWidth()->getSourceRange();
            Diagnosed = true;
            break;
          }
        }

        const bool IsFirstMutable = FirstField->isMutable();
        const bool IsSecondMutable = SecondField->isMutable();
+17 −1
Original line number Diff line number Diff line
@@ -310,6 +310,20 @@ S9 s9;
// expected-note@first.h:* {{but in 'FirstModule' found mutable field 'x'}}
#endif

#if defined(FIRST)
struct S9b {
  mutable int x : 2;
};
#elif defined(SECOND)
struct S9b {
  int x : 2;
};
#else
S9b s9b;
// expected-error@second.h:* {{'Field::S9b' has different definitions in different modules; first difference is definition in module 'SecondModule' found non-mutable field 'x'}}
// expected-note@first.h:* {{but in 'FirstModule' found mutable field 'x'}}
#endif

#if defined(FIRST)
struct S10 {
  unsigned x = 5;
@@ -372,7 +386,9 @@ S13 s13;
  unsigned c : 1 + 2; \
  s d;                \
  double e = 1.0;     \
  long f[5];
  long f[5];          \
  mutable int g;      \
  mutable int h : 5;

#if defined(FIRST) || defined(SECOND)
typedef short s;