aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/call.c6
-rw-r--r--gcc/cp/semantics.c19
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/call1.C2
4 files changed, 27 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 20e6653..62d2753 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+1998-07-16 Mark Mitchell <mark@markmitchell.com>
+
+ * 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 <jason@yorick.cygnus.com>
* decl.c (qualify_lookup): Handle templates.
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 7a87191..3e11a74 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 cae0b67..3459d1a 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 <class T> 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 257d547..b9836bbc 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<int>(const Field& p, IsCompressed, int);