diff options
author | Richard Trieu <rtrieu@google.com> | 2017-06-15 01:35:06 +0000 |
---|---|---|
committer | Richard Trieu <rtrieu@google.com> | 2017-06-15 01:35:06 +0000 |
commit | 8e8d2bb6ec0311aab3ab5f989f36868e12c968ed (patch) | |
tree | 8a42fcfb42487d381533757e287f0b65ee889774 | |
parent | 5ae017de6d07cd1fae4e475d5b64423551828f87 (diff) |
[ODRHash] Hash TemplateArgument::Pack and TemplateTypeParmType
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@305440 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/AST/ODRHash.cpp | 11 | ||||
-rw-r--r-- | test/Modules/odr_hash.cpp | 41 |
2 files changed, 52 insertions, 0 deletions
diff --git a/lib/AST/ODRHash.cpp b/lib/AST/ODRHash.cpp index f037827da8..3bf9896985 100644 --- a/lib/AST/ODRHash.cpp +++ b/lib/AST/ODRHash.cpp @@ -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; } } @@ -549,6 +553,13 @@ public: 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) { diff --git a/test/Modules/odr_hash.cpp b/test/Modules/odr_hash.cpp index 51bd626972..28b05a5356 100644 --- a/test/Modules/odr_hash.cpp +++ b/test/Modules/odr_hash.cpp @@ -1068,7 +1068,48 @@ S4 s4; // expected-error@first.h:* {{'TemplateArgument::S4::x' from module 'FirstModule' is not present in definition of 'TemplateArgument::S4' in module 'SecondModule'}} // expected-note@second.h:* {{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; +// expected-error@first.h:* {{'TemplateTypeParmType::S1::x' from module 'FirstModule' is not present in definition of 'S1<T1, T2>' in module 'SecondModule'}} +// expected-note@second.h:* {{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; +// expected-error@first.h:* {{'TemplateTypeParmType::S2::x' from module 'FirstModule' is not present in definition of 'S2<T, U>' in module 'SecondModule'}} +// expected-note@second.h:* {{declaration of 'x' does not match}} +// expected-error@first.h:* {{'TemplateTypeParmType::S2::type' from module 'FirstModule' is not present in definition of 'S2<T, U>' in module 'SecondModule'}} +// expected-note@second.h:* {{declaration of 'type' does not match}} +#endif } // Interesting cases that should not cause errors. struct S should not error |