summaryrefslogtreecommitdiffstats
path: root/clang/lib/Serialization
diff options
context:
space:
mode:
authorRichard Trieu <rtrieu@google.com>2017-02-23 00:23:01 +0000
committerRichard Trieu <rtrieu@google.com>2017-02-23 00:23:01 +0000
commitd0786099b189ea848d88fac9ba0b23b3d2c9ad7e (patch)
tree1c3fd11f5e7357202b2bddb34f7812a05e0a8756 /clang/lib/Serialization
parenta55b86c0e5eca17b382c8bbe207bcc95be825887 (diff)
downloadbcm5719-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.cpp22
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)
OpenPOWER on IntegriCloud