From 18232de4dbc48214f26d2d7fc442ef4224afe3b0 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Fri, 28 Oct 2011 18:40:22 +0000 Subject: [PATCH] re PR c++/50864 (ICE with decltype and "declval" from another namespace) /cp 2011-10-28 Paolo Carlini PR c++/50864 * pt.c (tsubst_copy_and_build): Fix qualified_name_lookup_error call in case COMPONENT_REF. /testsuite 2011-10-28 Paolo Carlini PR c++/50864 * g++.dg/template/crash109.C: New. From-SVN: r180623 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/pt.c | 12 +++++------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/template/crash109.C | 10 ++++++++++ 4 files changed, 26 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/crash109.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9791ab5d3b25..14723f0909d1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2011-10-28 Paolo Carlini + + PR c++/50864 + * pt.c (tsubst_copy_and_build): Fix qualified_name_lookup_error + call in case COMPONENT_REF. + 2011-10-27 Jason Merrill * semantics.c (cxx_eval_outermost_constant_expr): Check diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 7aea72d4e59e..dc63366358b3 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -13741,14 +13741,12 @@ tsubst_copy_and_build (tree t, else if (TREE_CODE (member) == SCOPE_REF && TREE_CODE (TREE_OPERAND (member, 1)) == TEMPLATE_ID_EXPR) { - tree tmpl; - tree args; - /* Lookup the template functions now that we know what the scope is. */ - tmpl = TREE_OPERAND (TREE_OPERAND (member, 1), 0); - args = TREE_OPERAND (TREE_OPERAND (member, 1), 1); - member = lookup_qualified_name (TREE_OPERAND (member, 0), tmpl, + tree scope = TREE_OPERAND (member, 0); + tree tmpl = TREE_OPERAND (TREE_OPERAND (member, 1), 0); + tree args = TREE_OPERAND (TREE_OPERAND (member, 1), 1); + member = lookup_qualified_name (scope, tmpl, /*is_type_p=*/false, /*complain=*/false); if (BASELINK_P (member)) @@ -13762,7 +13760,7 @@ tsubst_copy_and_build (tree t, } else { - qualified_name_lookup_error (object_type, tmpl, member, + qualified_name_lookup_error (scope, tmpl, member, input_location); return error_mark_node; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f2f1c58b68ba..69378152e14b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-10-28 Paolo Carlini + + PR c++/50864 + * g++.dg/template/crash109.C: New. + 2011-10-28 Steven G. Kargl * gfortran.dg/nearest_5.f90: New test. diff --git a/gcc/testsuite/g++.dg/template/crash109.C b/gcc/testsuite/g++.dg/template/crash109.C new file mode 100644 index 000000000000..3f2f81ee8bc0 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash109.C @@ -0,0 +1,10 @@ +// PR c++/50864 + +namespace impl +{ + template T create(); +} + +template () -> impl::create())> // { dg-error "not a member" } +struct foo; -- 2.47.2