mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-12-17 23:30:07 +08:00
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:
parent
303d1c55d3
commit
18976b2144
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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.
|
||||
|
29
gcc/testsuite/g++.dg/other/component1.C
Normal file
29
gcc/testsuite/g++.dg/other/component1.C
Normal 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" "" }
|
||||
};
|
Loading…
Reference in New Issue
Block a user