From c68c56f7272a81e363a632eda204055d8c8c7319 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Thu, 16 Jul 1998 23:38:43 +0000 Subject: [PATCH] semantics.c (finish_object_call_expr): Revert previous change. 1998-07-16 Mark Mitchell * semantics.c (finish_object_call_expr): Revert previous change. * call.c (build_new_method_call): Likewise. Instead, convert TYPE_DECLs to IDENTIFIERs here, in the presence of templates. From-SVN: r21240 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/call.c | 6 ------ gcc/cp/semantics.c | 19 +++++++++++++++++++ gcc/testsuite/g++.old-deja/g++.pt/call1.C | 2 ++ 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 20e6653c630..62d2753af9a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +1998-07-16 Mark Mitchell + + * semantics.c (finish_object_call_expr): Revert previous change. + * call.c (build_new_method_call): Likewise. Instead, convert + TYPE_DECLs to IDENTIFIERs here, in the presence of templates. + 1998-07-16 Jason Merrill * decl.c (qualify_lookup): Handle templates. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 7a8719153cb..3e11a741fa5 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -3552,12 +3552,6 @@ build_new_method_call (instance, name, args, basetype_path, flags) template_only = 1; } - if (TREE_CODE (name) == TYPE_DECL) - { - cp_error ("calling type `%T' like a method", name); - return error_mark_node; - } - /* If there is an extra argument for controlling virtual bases, remove it for error reporting. */ if (flags & LOOKUP_HAS_IN_CHARGE) diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index cae0b673466..3459d1a80fc 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -922,6 +922,25 @@ finish_object_call_expr (fn, object, args) tree real_fn = build_component_ref (object, fn, NULL_TREE, 1); return finish_call_expr (real_fn, args); #else + if (TREE_CODE (fn) == TYPE_DECL) + { + if (processing_template_decl) + /* This can happen on code like: + + class X; + template void f(T t) { + t.X(); + } + + We just grab the underlying IDENTIFIER. */ + fn = DECL_NAME (fn); + else + { + cp_error ("calling type `%T' like a method", fn); + return error_mark_node; + } + } + return build_method_call (object, fn, args, NULL_TREE, LOOKUP_NORMAL); #endif } diff --git a/gcc/testsuite/g++.old-deja/g++.pt/call1.C b/gcc/testsuite/g++.old-deja/g++.pt/call1.C index 257d5473295..b9836bbcc5a 100644 --- a/gcc/testsuite/g++.old-deja/g++.pt/call1.C +++ b/gcc/testsuite/g++.old-deja/g++.pt/call1.C @@ -11,3 +11,5 @@ for_each(const Field& p, IsCompressed, C) { return p.IsCompressed(); } + +template bool for_each(const Field& p, IsCompressed, int); -- 2.30.2