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
This commit is contained in:
Nathan Sidwell 2002-01-02 12:47:26 +00:00 committed by Nathan Sidwell
parent 303d1c55d3
commit 18976b2144
4 changed files with 64 additions and 7 deletions

View File

@ -1,3 +1,10 @@
2002-01-02 Nathan Sidwell <nathan@codesourcery.com>
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 <nathan@codesourcery.com>
PR c++/5213

View File

@ -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,

View File

@ -1,5 +1,7 @@
2002-01-02 Nathan Sidwell <nathan@codesourcery.com>
* g++.dg/other/component1.C: New test.
* g++.dg/template/ttp3.C: New test.
* g++.dg/template/friend2.C: New test.

View File

@ -0,0 +1,29 @@
// { dg-do compile }
// Copyright (C) 2001 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 28 Dec 2001 <nathan@codesourcery.com>
// PR 5123. ICE
struct C {
template<class T> void f(T);
void g ();
void g (int);
};
void Foo () {
C c;
(c.g) ();
(c.f) (1);
(c.f<int>) (2);
c.g; // { dg-error "statement cannot resolve" "" }
c.f; // { dg-error "statement cannot resolve" "" }
c.f<int>; // { dg-error "statement cannot resolve" "" }
c.g == 1; // { dg-error "invalid use of" "" }
c.f == 1; // { dg-error "invalid use of" "" }
c.f<int> == 1; // { dg-error "invalid use of" "" }
};