summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2018-07-31 21:01:53 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2018-07-31 21:01:53 +0000
commit84fd36a067fc9b9529d42ff596b22fff8a607a28 (patch)
tree6b2a6ddf5c84aab01d07698f9ccfeb34a6125ee1 /test
parent4b1d99562879a0e3ff14137592345925f32a8482 (diff)
[serialization] PR34728: Don't assume that only a suffix of template
parameters can have default arguments. At least for function templates and class template partial specializations, it's possible for a template parameter with a default argument to be followed by a non-pack template parameter with no default argument, and this case was not properly handled here. Testcase by Steve O'Brien! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@338438 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r--test/PCH/cxx-templates.cpp16
-rw-r--r--test/PCH/cxx-templates.h35
2 files changed, 51 insertions, 0 deletions
diff --git a/test/PCH/cxx-templates.cpp b/test/PCH/cxx-templates.cpp
index e241701f50..a7f7b1981f 100644
--- a/test/PCH/cxx-templates.cpp
+++ b/test/PCH/cxx-templates.cpp
@@ -116,3 +116,19 @@ namespace MemberSpecializationLocation {
#endif
int k = A<int>::n;
}
+
+// https://bugs.llvm.org/show_bug.cgi?id=34728
+namespace PR34728 {
+int test() {
+ // Verify with several TemplateParmDecl kinds, using PCH (incl. modules).
+ int z1 = func1(/*ignored*/2.718);
+ int z2 = func2(/*ignored*/3.142);
+ int tmp3 = 30;
+ Container<int> c = func3(tmp3);
+ int z3 = c.item;
+
+ // Return value is meaningless. Just "use" all these values to avoid
+ // warning about unused vars / values.
+ return z1 + z2 + z3;
+}
+} // end namespace PR34728
diff --git a/test/PCH/cxx-templates.h b/test/PCH/cxx-templates.h
index 68b252e797..e812aa68fb 100644
--- a/test/PCH/cxx-templates.h
+++ b/test/PCH/cxx-templates.h
@@ -361,3 +361,38 @@ namespace rdar15468709c {
namespace MemberSpecializationLocation {
template<typename T> struct A { static int n; };
}
+
+// https://bugs.llvm.org/show_bug.cgi?id=34728
+namespace PR34728 {
+
+// case 1: defaulted `NonTypeTemplateParmDecl`, non-defaulted 2nd tpl param
+template <int foo = 10, class T>
+int func1(T const &);
+
+template <int foo, class T>
+int func1(T const &) {
+ return foo;
+}
+
+// case 2: defaulted `TemplateTypeParmDecl`, non-defaulted 2nd tpl param
+template <class A = int, class B>
+A func2(B const &);
+
+template <class A, class B>
+A func2(B const &) {
+ return A(20.0f);
+}
+
+// case 3: defaulted `TemplateTemplateParmDecl`, non-defaulted 2nd tpl param
+template <class T>
+struct Container { T const &item; };
+
+template <template <class> class C = Container, class D>
+C<D> func3(D const &);
+
+template <template <class> class C, class D>
+C<D> func3(D const &d) {
+ return Container<D>{d};
+}
+
+} // end namespace PR34728