r305440 - [ODRHash] Hash TemplateArgument::Pack and TemplateTypeParmType

Richard Trieu via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 14 18:35:07 PDT 2017


Author: rtrieu
Date: Wed Jun 14 20:35:06 2017
New Revision: 305440

URL: http://llvm.org/viewvc/llvm-project?rev=305440&view=rev
Log:
[ODRHash] Hash TemplateArgument::Pack and TemplateTypeParmType

Modified:
    cfe/trunk/lib/AST/ODRHash.cpp
    cfe/trunk/test/Modules/odr_hash.cpp

Modified: cfe/trunk/lib/AST/ODRHash.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ODRHash.cpp?rev=305440&r1=305439&r2=305440&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ODRHash.cpp (original)
+++ cfe/trunk/lib/AST/ODRHash.cpp Wed Jun 14 20:35:06 2017
@@ -159,6 +159,10 @@ void ODRHash::AddTemplateArgument(Templa
       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) {

Modified: cfe/trunk/test/Modules/odr_hash.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/odr_hash.cpp?rev=305440&r1=305439&r2=305440&view=diff
==============================================================================
--- cfe/trunk/test/Modules/odr_hash.cpp (original)
+++ cfe/trunk/test/Modules/odr_hash.cpp Wed Jun 14 20:35:06 2017
@@ -1068,7 +1068,48 @@ S4 s4;
 // expected-error at first.h:* {{'TemplateArgument::S4::x' from module 'FirstModule' is not present in definition of 'TemplateArgument::S4' in module 'SecondModule'}}
 // expected-note at 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 at first.h:* {{'TemplateTypeParmType::S1::x' from module 'FirstModule' is not present in definition of 'S1<T1, T2>' in module 'SecondModule'}}
+// expected-note at 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 at first.h:* {{'TemplateTypeParmType::S2::x' from module 'FirstModule' is not present in definition of 'S2<T, U>' in module 'SecondModule'}}
+// expected-note at second.h:* {{declaration of 'x' does not match}}
+// expected-error at first.h:* {{'TemplateTypeParmType::S2::type' from module 'FirstModule' is not present in definition of 'S2<T, U>' in module 'SecondModule'}}
+// expected-note at second.h:* {{declaration of 'type' does not match}}
+#endif
 }
 
 // Interesting cases that should not cause errors.  struct S should not error




More information about the cfe-commits mailing list