diff options
author | Jason Merrill <jason@redhat.com> | 2013-05-09 12:43:49 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2013-05-09 12:43:49 -0400 |
commit | 26863a324a5697fe20d2fb8610010551785a9a15 (patch) | |
tree | 8bdf0ef1eeb748ec76ba9b632ef7eeb9a3dff0ce /gcc | |
parent | a57dbdaac40dbaaaba5b6d9954829a5e6f630ae4 (diff) | |
download | gcc-26863a324a5697fe20d2fb8610010551785a9a15.zip gcc-26863a324a5697fe20d2fb8610010551785a9a15.tar.gz gcc-26863a324a5697fe20d2fb8610010551785a9a15.tar.bz2 |
re PR c++/57222 (Template alias not working in argument of template class template method)
PR c++/57222
* pt.c (lookup_template_class_1): Handle getting a template
template parameter as D1.
From-SVN: r198747
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/pt.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/alias-decl-34.C | 23 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/crash84.C | 7 |
4 files changed, 37 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 74480f6..a254a8e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2013-05-09 Jason Merrill <jason@redhat.com> + PR c++/57222 + * pt.c (lookup_template_class_1): Handle getting a template + template parameter as D1. + N3639 C++1y VLA diagnostics * decl.c (grokdeclarator): Complain about reference, pointer, or typedef to VLA. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 2cb2abd..0747de6 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -7016,7 +7016,7 @@ maybe_get_template_decl_from_type_decl (tree decl) ? CLASSTYPE_TI_TEMPLATE (TREE_TYPE (decl)) : decl; } -/* Given an IDENTIFIER_NODE (type TEMPLATE_DECL) and a chain of +/* Given an IDENTIFIER_NODE (or type TEMPLATE_DECL) and a chain of parameters, find the desired type. D1 is the PTYPENAME terminal, and ARGLIST is the list of arguments. @@ -7097,6 +7097,11 @@ lookup_template_class_1 (tree d1, tree arglist, tree in_decl, tree context, d1 = DECL_NAME (templ); context = DECL_CONTEXT (templ); } + else if (DECL_TEMPLATE_TEMPLATE_PARM_P (d1)) + { + templ = d1; + d1 = DECL_NAME (templ); + } /* Issue an error message if we didn't find a template. */ if (! templ) diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-34.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-34.C new file mode 100644 index 0000000..4306ab7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-34.C @@ -0,0 +1,23 @@ +// PR c++/57222 +// { dg-require-effective-target c++11 } + +template <template <typename T> class Templ> +using Bool = Templ<bool>; + +template <typename T> +class Foo { +private: +public: + template<template<typename U> class Templ> + void method(Bool<Templ> boolTempl); +}; + +template <typename T> +template <template <typename U> class Templ> +void Foo<T>::method(Bool<Templ> boolTempl) { +} + +int main() { + Foo<char> foo; + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/crash84.C b/gcc/testsuite/g++.dg/template/crash84.C index c42f85c..103e90a 100644 --- a/gcc/testsuite/g++.dg/template/crash84.C +++ b/gcc/testsuite/g++.dg/template/crash84.C @@ -5,7 +5,7 @@ template<typename T> struct a { template <template <typename> class C, typename X, C<X>* =0> - struct b // { dg-error "class C' is not a template|is not a valid type" } + struct b { }; }; @@ -13,7 +13,8 @@ template<typename T> struct a void foo () { - a<int> v; // { dg-message "required from here" } + a<int> a1; // OK + a<int>::b<a,int> b1; // { dg-error "template argument" } } - +// { dg-prune-output "invalid type in declaration" } |