summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>1998-07-16 11:46:44 +0000
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>1998-07-16 11:46:44 +0000
commit36472de313caafba8955e95e5859fd1d0bd57264 (patch)
treea6e848c78d9073f720fbddc475ad6ab9b8ba81be
parent197586bd3f208eb9622b3988df85f3df5183384d (diff)
downloadgcc-36472de313caafba8955e95e5859fd1d0bd57264.tar.gz
1998-07-16 Mark Mitchell <mark@markmitchell.com>
* semantics.c (finish_object_call_expr): Move test for the function called being a TYPE_DECL to ... * call.c (build_new_method_call): Here. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@21213 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/call.c6
-rw-r--r--gcc/cp/semantics.c6
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/call1.C13
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/call2.C14
5 files changed, 39 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 37a85a73d27..08b57eb98fb 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): Move test for the
+ function called being a TYPE_DECL to ...
+ * call.c (build_new_method_call): Here.
+
1998-07-15 Jason Merrill <jason@yorick.cygnus.com>
* decl2.c (arg_assoc_class): Also look at template arguments, if any.
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 3e11a741fa5..7a8719153cb 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -3552,6 +3552,12 @@ 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 fe4709aee95..cae0b673466 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -922,12 +922,6 @@ 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)
- {
- 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
new file mode 100644
index 00000000000..257d5473295
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/call1.C
@@ -0,0 +1,13 @@
+// Build don't link:
+
+struct IsCompressed { };
+struct Field {
+ bool IsCompressed() const { return true; }
+};
+
+template<class C>
+inline bool
+for_each(const Field& p, IsCompressed, C)
+{
+ return p.IsCompressed();
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/call2.C b/gcc/testsuite/g++.old-deja/g++.pt/call2.C
new file mode 100644
index 00000000000..51b246948ed
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/call2.C
@@ -0,0 +1,14 @@
+// Build don't link:
+
+struct IsCompressed { };
+struct Field {
+};
+
+template<class C>
+inline bool
+for_each(const Field& p, IsCompressed, C)
+{
+ return p.IsCompressed(); // ERROR - calling type like a method
+}
+
+template bool for_each<int>(const Field& p, IsCompressed, int); // ERROR - instantiated from here