r306904 - [ODRHash] Support Type TemplateArgument
Richard Trieu via cfe-commits
cfe-commits at lists.llvm.org
Fri Jun 30 15:40:33 PDT 2017
Author: rtrieu
Date: Fri Jun 30 15:40:33 2017
New Revision: 306904
URL: http://llvm.org/viewvc/llvm-project?rev=306904&view=rev
Log:
[ODRHash] Support Type TemplateArgument
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=306904&r1=306903&r2=306904&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ODRHash.cpp (original)
+++ cfe/trunk/lib/AST/ODRHash.cpp Fri Jun 30 15:40:33 2017
@@ -146,7 +146,10 @@ void ODRHash::AddTemplateArgument(Templa
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:
Modified: cfe/trunk/test/Modules/odr_hash.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/odr_hash.cpp?rev=306904&r1=306903&r2=306904&view=diff
==============================================================================
--- cfe/trunk/test/Modules/odr_hash.cpp (original)
+++ cfe/trunk/test/Modules/odr_hash.cpp Fri Jun 30 15:40:33 2017
@@ -1070,6 +1070,40 @@ 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
+
+#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 at first.h:* {{'TemplateArgument::S5::x' from module 'FirstModule' is not present in definition of 'TemplateArgument::S5' in module 'SecondModule'}}
+// expected-note at 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 at second.h:* {{'TemplateArgument::S6' has different definitions in different modules; first difference is definition in module 'SecondModule' found field 'y'}}
+// expected-note at first.h:* {{but in 'FirstModule' found field 'x'}}
+#endif
}
namespace TemplateTypeParmType {
More information about the cfe-commits
mailing list