aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2015-12-06 23:35:02 -0500
committerJason Merrill <jason@gcc.gnu.org>2015-12-06 23:35:02 -0500
commit5ea106d85b5e2e7278472070b45d22f892f1e1d3 (patch)
tree3a70da5301392ce4cbe8d929532e03902294f033
parent19dedccfc36a34b843292e6493c7ffd429673de2 (diff)
downloadgcc-5ea106d85b5e2e7278472070b45d22f892f1e1d3.zip
gcc-5ea106d85b5e2e7278472070b45d22f892f1e1d3.tar.gz
gcc-5ea106d85b5e2e7278472070b45d22f892f1e1d3.tar.bz2
Fix crash70.C with -std=c++1z.
* semantics.c (finish_qualified_id_expr): Handle UNBOUND_CLASS_TEMPLATE. From-SVN: r231352
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/semantics.c12
-rw-r--r--gcc/testsuite/g++.dg/template/crash70.C2
3 files changed, 15 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 1fdbe05..9a8a2b5 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
2015-12-06 Jason Merrill <jason@redhat.com>
+ * semantics.c (finish_qualified_id_expr): Handle
+ UNBOUND_CLASS_TEMPLATE.
+
* parser.c (cp_parser_template_argument): Handle references in
C++1z mode.
* constexpr.c (potential_constant_expression_1): Don't error about
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 82f7d3a..80d1b10 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -1929,7 +1929,17 @@ finish_qualified_id_expr (tree qualifying_class,
return error_mark_node;
if (template_p)
- check_template_keyword (expr);
+ {
+ if (TREE_CODE (expr) == UNBOUND_CLASS_TEMPLATE)
+ /* cp_parser_lookup_name thought we were looking for a type,
+ but we're actually looking for a declaration. */
+ expr = build_qualified_name (/*type*/NULL_TREE,
+ TYPE_CONTEXT (expr),
+ TYPE_IDENTIFIER (expr),
+ /*template_p*/true);
+ else
+ check_template_keyword (expr);
+ }
/* If EXPR occurs as the operand of '&', use special handling that
permits a pointer-to-member. */
diff --git a/gcc/testsuite/g++.dg/template/crash70.C b/gcc/testsuite/g++.dg/template/crash70.C
index 742f77b..9ccadfb 100644
--- a/gcc/testsuite/g++.dg/template/crash70.C
+++ b/gcc/testsuite/g++.dg/template/crash70.C
@@ -2,6 +2,6 @@
template<int> struct A;
-template<typename T> void foo (A<&T::template i>); // { dg-error "not a template" }
+template<typename T> void foo (A<&T::template i>);
template void foo<A<0> > (A<0>); // { dg-error "does not match" }