aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2013-05-09 12:43:49 -0400
committerJason Merrill <jason@gcc.gnu.org>2013-05-09 12:43:49 -0400
commit26863a324a5697fe20d2fb8610010551785a9a15 (patch)
tree8bdf0ef1eeb748ec76ba9b632ef7eeb9a3dff0ce
parenta57dbdaac40dbaaaba5b6d9954829a5e6f630ae4 (diff)
downloadgcc-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
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/pt.c7
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/alias-decl-34.C23
-rw-r--r--gcc/testsuite/g++.dg/template/crash84.C7
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" }