diff options
author | Richard Trieu <rtrieu@google.com> | 2017-06-12 21:58:22 +0000 |
---|---|---|
committer | Richard Trieu <rtrieu@google.com> | 2017-06-12 21:58:22 +0000 |
commit | 11d566acee0f58480dff03fdb6229e464cea5864 (patch) | |
tree | 0baef0bd8cea12ca1747767b7b71085a0b687cff /clang/lib/Serialization/ASTReader.cpp | |
parent | 44f95c43023166a3fc0cfdfdb6884860834ed469 (diff) | |
download | bcm5719-llvm-11d566acee0f58480dff03fdb6229e464cea5864.tar.gz bcm5719-llvm-11d566acee0f58480dff03fdb6229e464cea5864.zip |
[ODRHash] Add diagnostic messages for typedef and type alias.
llvm-svn: 305238
Diffstat (limited to 'clang/lib/Serialization/ASTReader.cpp')
-rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 94a8f609f57..5bef65fc890 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -9242,6 +9242,7 @@ void ASTReader::diagnoseOdrViolations() { // Used with err_module_odr_violation_mismatch_decl and // note_module_odr_violation_mismatch_decl + // This list should be the same Decl's as in ODRHash::isWhiteListedDecl enum { EndOfClass, PublicSpecifer, @@ -9250,6 +9251,8 @@ void ASTReader::diagnoseOdrViolations() { StaticAssert, Field, CXXMethod, + TypeAlias, + TypeDef, Other } FirstDiffType = Other, SecondDiffType = Other; @@ -9277,6 +9280,10 @@ void ASTReader::diagnoseOdrViolations() { return Field; case Decl::CXXMethod: return CXXMethod; + case Decl::TypeAlias: + return TypeAlias; + case Decl::Typedef: + return TypeDef; } }; @@ -9373,6 +9380,8 @@ void ASTReader::diagnoseOdrViolations() { MethodNumberParameters, MethodParameterType, MethodParameterName, + TypedefName, + TypedefType, }; // These lambdas have the common portions of the ODR diagnostics. This @@ -9748,6 +9757,38 @@ void ASTReader::diagnoseOdrViolations() { break; } + case TypeAlias: + case TypeDef: { + TypedefNameDecl *FirstTD = cast<TypedefNameDecl>(FirstDecl); + TypedefNameDecl *SecondTD = cast<TypedefNameDecl>(SecondDecl); + auto FirstName = FirstTD->getDeclName(); + auto SecondName = SecondTD->getDeclName(); + if (FirstName != SecondName) { + ODRDiagError(FirstTD->getLocation(), FirstTD->getSourceRange(), + TypedefName) + << (FirstDiffType == TypeAlias) << FirstName; + ODRDiagNote(SecondTD->getLocation(), SecondTD->getSourceRange(), + TypedefName) + << (FirstDiffType == TypeAlias) << SecondName; + Diagnosed = true; + break; + } + + QualType FirstType = FirstTD->getUnderlyingType(); + QualType SecondType = SecondTD->getUnderlyingType(); + if (ComputeQualTypeODRHash(FirstType) != + ComputeQualTypeODRHash(SecondType)) { + ODRDiagError(FirstTD->getLocation(), FirstTD->getSourceRange(), + TypedefType) + << (FirstDiffType == TypeAlias) << FirstName << FirstType; + ODRDiagNote(SecondTD->getLocation(), SecondTD->getSourceRange(), + TypedefType) + << (FirstDiffType == TypeAlias) << SecondName << SecondType; + Diagnosed = true; + break; + } + break; + } } if (Diagnosed == true) |