[ODRHash] Revert r305104 - Skip inline namespaces when hashing.

Test inline namespaces and handle them in the ODR hash again.

llvm-svn: 306926
This commit is contained in:
Richard Trieu 2017-07-01 02:00:05 +00:00
parent 28082ab0e5
commit 96b4164968
3 changed files with 31 additions and 19 deletions

View File

@ -82,25 +82,13 @@ void ODRHash::AddDeclarationName(DeclarationName Name) {
}
void ODRHash::AddNestedNameSpecifier(const NestedNameSpecifier *NNS) {
// Unlike the other pointer handling functions, allow null pointers here.
if (!NNS) {
AddBoolean(false);
return;
assert(NNS && "Expecting non-null pointer.");
const auto *Prefix = NNS->getPrefix();
AddBoolean(Prefix);
if (Prefix) {
AddNestedNameSpecifier(Prefix);
}
// Skip inlined namespaces.
auto Kind = NNS->getKind();
if (Kind == NestedNameSpecifier::Namespace) {
if (NNS->getAsNamespace()->isInline()) {
return AddNestedNameSpecifier(NNS->getPrefix());
}
}
AddBoolean(true);
// Process prefix
AddNestedNameSpecifier(NNS->getPrefix());
ID.AddInteger(Kind);
switch (Kind) {
case NestedNameSpecifier::Identifier:
@ -441,7 +429,10 @@ public:
}
void AddNestedNameSpecifier(const NestedNameSpecifier *NNS) {
Hash.AddNestedNameSpecifier(NNS);
Hash.AddBoolean(NNS);
if (NNS) {
Hash.AddNestedNameSpecifier(NNS);
}
}
void AddIdentifierInfo(const IdentifierInfo *II) {

View File

@ -186,7 +186,10 @@ namespace {
Hash.AddTemplateName(Name);
}
void VisitNestedNameSpecifier(NestedNameSpecifier *NNS) override {
Hash.AddNestedNameSpecifier(NNS);
ID.AddBoolean(NNS);
if (NNS) {
Hash.AddNestedNameSpecifier(NNS);
}
}
};
}

View File

@ -968,6 +968,24 @@ S9 s9;
// expected-error@second.h:* {{'NestedNamespaceSpecifier::S9' has different definitions in different modules; first difference is definition in module 'SecondModule' found field 'x' with type 'P9::I' (aka 'int')}}
// expected-note@first.h:* {{but in 'FirstModule' found field 'x' with type 'O9::I' (aka 'int')}}
#endif
namespace N10 {
#if defined(FIRST)
inline namespace A { struct X {}; }
struct S10 {
A::X x;
};
#elif defined(SECOND)
inline namespace B { struct X {}; }
struct S10 {
B::X x;
};
#else
S10 s10;
// expected-error@second.h:* {{'NestedNamespaceSpecifier::N10::S10::x' from module 'SecondModule' is not present in definition of 'NestedNamespaceSpecifier::N10::S10' in module 'FirstModule'}}
// expected-note@first.h:* {{declaration of 'x' does not match}}
#endif
}
}
namespace TemplateSpecializationType {