diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2018-07-31 21:01:53 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2018-07-31 21:01:53 +0000 |
commit | 84fd36a067fc9b9529d42ff596b22fff8a607a28 (patch) | |
tree | 6b2a6ddf5c84aab01d07698f9ccfeb34a6125ee1 /test | |
parent | 4b1d99562879a0e3ff14137592345925f32a8482 (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.cpp | 16 | ||||
-rw-r--r-- | test/PCH/cxx-templates.h | 35 |
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 |