diff --git a/lib/AST/ODRHash.cpp b/lib/AST/ODRHash.cpp
index 5c8d151e081832b871e23f451941aa7b23ead632..0e44a12257cb0fee8972c693ecd554b7b0ee44d2 100644
--- a/lib/AST/ODRHash.cpp
+++ b/lib/AST/ODRHash.cpp
@@ -146,7 +146,10 @@ void ODRHash::AddTemplateArgument(TemplateArgument TA) {
 
   switch (Kind) {
     case TemplateArgument::Null:
+      llvm_unreachable("Expected valid TemplateArgument");
     case TemplateArgument::Type:
+      AddQualType(TA.getAsType());
+      break;
     case TemplateArgument::Declaration:
     case TemplateArgument::NullPtr:
     case TemplateArgument::Integral:
diff --git a/test/Modules/odr_hash.cpp b/test/Modules/odr_hash.cpp
index f01c4e836a30f285c7ca34c6b0db456134fd62e3..3b213971696c24343d89a3f1ac2a09ef1b05d034 100644
--- a/test/Modules/odr_hash.cpp
+++ b/test/Modules/odr_hash.cpp
@@ -1070,6 +1070,40 @@ 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
+
+#if defined(FIRST)
+template <class T> struct U5 {};
+struct S5 {
+  U5<int> x;
+};
+#elif defined(SECOND)
+template <class T> struct U5 {};
+struct S5 {
+  U5<short> x;
+};
+#else
+S5 s5;
+// expected-error@first.h:* {{'TemplateArgument::S5::x' from module 'FirstModule' is not present in definition of 'TemplateArgument::S5' in module 'SecondModule'}}
+// expected-note@second.h:* {{declaration of 'x' does not match}}
+#endif
+
+#if defined(FIRST)
+template <class T> struct U6 {};
+struct S6 {
+  U6<int> x;
+  U6<short> y;
+};
+#elif defined(SECOND)
+template <class T> struct U6 {};
+struct S6 {
+  U6<short> y;
+  U6<int> x;
+};
+#else
+S6 s6;
+// expected-error@second.h:* {{'TemplateArgument::S6' has different definitions in different modules; first difference is definition in module 'SecondModule' found field 'y'}}
+// expected-note@first.h:* {{but in 'FirstModule' found field 'x'}}
+#endif
 }
 
 namespace TemplateTypeParmType {