From 18976b21446cfafe728b739b7220fd02f4ea5328 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Wed, 2 Jan 2002 12:47:26 +0000 Subject: [PATCH] re PR c++/5123 (tree check: expected identifier_node, have template_id_expr in build_component_ref, at cp/typeck.c:2133) cp: PR c++/5123 * typeck.c (build_component_ref): Cope with a TEMPLATE_ID_EXPR. (build_x_function_call): Cope with a COMPONENT_REF containing a TEMPLATE_ID_EXPR. testsuite: * g++.dg/other/component1.C: New test. From-SVN: r48469 --- gcc/cp/ChangeLog | 7 ++++++ gcc/cp/typeck.c | 33 +++++++++++++++++++------ gcc/testsuite/ChangeLog | 2 ++ gcc/testsuite/g++.dg/other/component1.C | 29 ++++++++++++++++++++++ 4 files changed, 64 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/g++.dg/other/component1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 145f5bea273..ef4c0ddf60d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2002-01-02 Nathan Sidwell + + PR c++/5123 + * typeck.c (build_component_ref): Cope with a TEMPLATE_ID_EXPR. + (build_x_function_call): Cope with a COMPONENT_REF containing a + TEMPLATE_ID_EXPR. + 2002-01-02 Nathan Sidwell PR c++/5213 diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 9fdd168343c..b939de70447 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -2030,7 +2030,7 @@ build_component_ref (datum, component, basetype_path, protect) basetype_path, protect)); case TEMPLATE_DECL: - error ("invalid use of %D", datum); + error ("invalid use of `%D'", datum); datum = error_mark_node; break; @@ -2114,7 +2114,10 @@ build_component_ref (datum, component, basetype_path, protect) else { tree name = component; - if (TREE_CODE (component) == VAR_DECL) + + if (TREE_CODE (component) == TEMPLATE_ID_EXPR) + name = TREE_OPERAND (component, 0); + else if (TREE_CODE (component) == VAR_DECL) name = DECL_NAME (component); if (TREE_CODE (component) == NAMESPACE_DECL) /* Source is in error, but produce a sensible diagnostic. */ @@ -2162,8 +2165,14 @@ build_component_ref (datum, component, basetype_path, protect) } } + fndecls = TREE_VALUE (fndecls); + + if (TREE_CODE (component) == TEMPLATE_ID_EXPR) + fndecls = build_nt (TEMPLATE_ID_EXPR, + fndecls, TREE_OPERAND (component, 1)); + ref = build (COMPONENT_REF, unknown_type_node, - datum, TREE_VALUE (fndecls)); + datum, fndecls); return ref; } @@ -2699,12 +2708,22 @@ build_x_function_call (function, params, decl) /* Undo what we did in build_component_ref. */ decl = TREE_OPERAND (function, 0); function = TREE_OPERAND (function, 1); - function = DECL_NAME (OVL_CURRENT (function)); - if (template_id) + if (TREE_CODE (function) == TEMPLATE_ID_EXPR) { - TREE_OPERAND (template_id, 0) = function; - function = template_id; + my_friendly_assert (!template_id, 20011228); + + template_id = function; + } + else + { + function = DECL_NAME (OVL_CURRENT (function)); + + if (template_id) + { + TREE_OPERAND (template_id, 0) = function; + function = template_id; + } } return build_method_call (decl, function, params, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fc18102da11..dac37bd7936 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,7 @@ 2002-01-02 Nathan Sidwell + * g++.dg/other/component1.C: New test. + * g++.dg/template/ttp3.C: New test. * g++.dg/template/friend2.C: New test. diff --git a/gcc/testsuite/g++.dg/other/component1.C b/gcc/testsuite/g++.dg/other/component1.C new file mode 100644 index 00000000000..3041a23193f --- /dev/null +++ b/gcc/testsuite/g++.dg/other/component1.C @@ -0,0 +1,29 @@ +// { dg-do compile } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 28 Dec 2001 + +// PR 5123. ICE + +struct C { + template void f(T); + void g (); + void g (int); +}; + +void Foo () { + C c; + + (c.g) (); + (c.f) (1); + + (c.f) (2); + + c.g; // { dg-error "statement cannot resolve" "" } + c.f; // { dg-error "statement cannot resolve" "" } + c.f; // { dg-error "statement cannot resolve" "" } + + c.g == 1; // { dg-error "invalid use of" "" } + c.f == 1; // { dg-error "invalid use of" "" } + c.f == 1; // { dg-error "invalid use of" "" } +};