Skip to content

Commit

Permalink
[ODRHash] Hash TemplateArgument::Pack and TemplateTypeParmType
Browse files Browse the repository at this point in the history
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@305440 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
Weverything committed Jun 15, 2017
1 parent 5ae017d commit 8e8d2bb
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 0 deletions.
11 changes: 11 additions & 0 deletions lib/AST/ODRHash.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,10 @@ void ODRHash::AddTemplateArgument(TemplateArgument TA) {
AddStmt(TA.getAsExpr());
break;
case TemplateArgument::Pack:
ID.AddInteger(TA.pack_size());
for (auto SubTA : TA.pack_elements()) {
AddTemplateArgument(SubTA);
}
break;
}
}
Expand Down Expand Up @@ -549,6 +553,13 @@ class ODRTypeVisitor : public TypeVisitor<ODRTypeVisitor> {
Hash.AddTemplateName(T->getTemplateName());
VisitType(T);
}

void VisitTemplateTypeParmType(const TemplateTypeParmType *T) {
ID.AddInteger(T->getDepth());
ID.AddInteger(T->getIndex());
Hash.AddBoolean(T->isParameterPack());
AddDecl(T->getDecl());
}
};

void ODRHash::AddType(const Type *T) {
Expand Down
41 changes: 41 additions & 0 deletions test/Modules/odr_hash.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1068,7 +1068,48 @@ S4 s4;
// [email protected]:* {{'TemplateArgument::S4::x' from module 'FirstModule' is not present in definition of 'TemplateArgument::S4' in module 'SecondModule'}}
// [email protected]:* {{declaration of 'x' does not match}}
#endif
}

namespace TemplateTypeParmType {
#if defined(FIRST)
template <class T1, class T2>
struct S1 {
T1 x;
};
#elif defined(SECOND)
template <class T1, class T2>
struct S1 {
T2 x;
};
#else
using TemplateTypeParmType::S1;
// [email protected]:* {{'TemplateTypeParmType::S1::x' from module 'FirstModule' is not present in definition of 'S1<T1, T2>' in module 'SecondModule'}}
// [email protected]:* {{declaration of 'x' does not match}}
#endif

#if defined(FIRST)
template <int ...Ts>
struct U2 {};
template <int T, int U>
class S2 {
typedef U2<U, T> type;
type x;
};
#elif defined(SECOND)
template <int ...Ts>
struct U2 {};
template <int T, int U>
class S2 {
typedef U2<T, U> type;
type x;
};
#else
using TemplateTypeParmType::S2;
// [email protected]:* {{'TemplateTypeParmType::S2::x' from module 'FirstModule' is not present in definition of 'S2<T, U>' in module 'SecondModule'}}
// [email protected]:* {{declaration of 'x' does not match}}
// [email protected]:* {{'TemplateTypeParmType::S2::type' from module 'FirstModule' is not present in definition of 'S2<T, U>' in module 'SecondModule'}}
// [email protected]:* {{declaration of 'type' does not match}}
#endif
}

// Interesting cases that should not cause errors. struct S should not error
Expand Down

0 comments on commit 8e8d2bb

Please sign in to comment.