forked from OSchip/llvm-project
[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:
parent
28082ab0e5
commit
96b4164968
|
@ -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) {
|
||||
|
|
|
@ -186,7 +186,10 @@ namespace {
|
|||
Hash.AddTemplateName(Name);
|
||||
}
|
||||
void VisitNestedNameSpecifier(NestedNameSpecifier *NNS) override {
|
||||
Hash.AddNestedNameSpecifier(NNS);
|
||||
ID.AddBoolean(NNS);
|
||||
if (NNS) {
|
||||
Hash.AddNestedNameSpecifier(NNS);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue