diff options
author | Jason Merrill <jason@redhat.com> | 2015-12-06 23:35:02 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2015-12-06 23:35:02 -0500 |
commit | 5ea106d85b5e2e7278472070b45d22f892f1e1d3 (patch) | |
tree | 3a70da5301392ce4cbe8d929532e03902294f033 | |
parent | 19dedccfc36a34b843292e6493c7ffd429673de2 (diff) | |
download | gcc-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/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/crash70.C | 2 |
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" } |