diff options
author | Richard Trieu <rtrieu@google.com> | 2017-02-23 00:23:01 +0000 |
---|---|---|
committer | Richard Trieu <rtrieu@google.com> | 2017-02-23 00:23:01 +0000 |
commit | d0786099b189ea848d88fac9ba0b23b3d2c9ad7e (patch) | |
tree | 1c3fd11f5e7357202b2bddb34f7812a05e0a8756 /clang/lib/Serialization | |
parent | a55b86c0e5eca17b382c8bbe207bcc95be825887 (diff) | |
download | bcm5719-llvm-d0786099b189ea848d88fac9ba0b23b3d2c9ad7e.tar.gz bcm5719-llvm-d0786099b189ea848d88fac9ba0b23b3d2c9ad7e.zip |
[ODRHash] Add IdentiferInfo and FieldDecl support.
IdentifierInfo is hashed based on the stored string. FieldDecl versus other
Decl is now detected, as well as differently named fields.
Differential Revision: https://reviews.llvm.org/D21675
llvm-svn: 295911
Diffstat (limited to 'clang/lib/Serialization')
-rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 977cc115ca1..72d4c75b063 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -8956,6 +8956,7 @@ void ASTReader::diagnoseOdrViolations() { PrivateSpecifer, ProtectedSpecifer, StaticAssert, + Field, Other } FirstDiffType = Other, SecondDiffType = Other; @@ -8979,6 +8980,8 @@ void ASTReader::diagnoseOdrViolations() { llvm_unreachable("Invalid access specifier"); case Decl::StaticAssert: return StaticAssert; + case Decl::Field: + return Field; } }; @@ -9058,6 +9061,7 @@ void ASTReader::diagnoseOdrViolations() { StaticAssertCondition, StaticAssertMessage, StaticAssertOnlyMessage, + FieldName, }; // These lambdas have the common portions of the ODR diagnostics. This @@ -9146,6 +9150,24 @@ void ASTReader::diagnoseOdrViolations() { } break; } + case Field: { + FieldDecl *FirstField = cast<FieldDecl>(FirstDecl); + FieldDecl *SecondField = cast<FieldDecl>(SecondDecl); + IdentifierInfo *FirstII = FirstField->getIdentifier(); + IdentifierInfo *SecondII = SecondField->getIdentifier(); + if (FirstII->getName() != SecondII->getName()) { + ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(), + FieldName) + << FirstII; + ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(), + FieldName) + << SecondII; + + Diagnosed = true; + break; + } + break; + } } if (Diagnosed == true) |