aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/name-lookup.c14
-rw-r--r--gcc/cp/semantics.c1
-rw-r--r--gcc/testsuite/ChangeLog12
-rw-r--r--gcc/testsuite/g++.dg/lookup/koenig5.C46
-rw-r--r--gcc/testsuite/g++.dg/template/crash56.C16
6 files changed, 90 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index bb2e8415f3a..45597c33c75 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,10 @@
2006-09-01 Nathan Sidwell <nathan@codesourcery.com>
+ PR c++/28705
+ * semantics.c (finish_call_expr): Add assert.
+ * name-lookup.c (lookup_arg_dependent): Check we found an overload
+ or an object.
+
PR c++/23287
* parser.c (cp_parser_id_expression): Add member_p
argument. Update all callers.
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index b32ebfd9f77..e794232131d 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -4668,7 +4668,19 @@ lookup_arg_dependent (tree name, tree fns, tree args)
k.namespaces = NULL_TREE;
arg_assoc_args (&k, args);
- POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, k.functions);
+
+ fns = k.functions;
+
+ if (fns
+ && TREE_CODE (fns) != VAR_DECL
+ && !is_overloaded_fn (fns))
+ {
+ error ("argument dependent lookup finds %q+D", fns);
+ error (" in call to %qD", name);
+ fns = error_mark_node;
+ }
+
+ POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, fns);
}
/* Add namespace to using_directives. Return NULL_TREE if nothing was
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 94e6dfd312c..3ec0a1a1a95 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -1754,6 +1754,7 @@ finish_call_expr (tree fn, tree args, bool disallow_virtual, bool koenig_p)
/* ARGS should be a list of arguments. */
gcc_assert (!args || TREE_CODE (args) == TREE_LIST);
+ gcc_assert (!TYPE_P (fn));
orig_fn = fn;
orig_args = args;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index df6e40fda2d..530c23e2aae 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,9 +1,15 @@
+2006-09-01 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/28705
+ * g++.dg/lookup/koenig5.C: New.
+ * g++.dg/template/crash56.C: New.
+
2006-09-01 Josh Conner <jconner@apple.com>
PR c++/25505
- gcc.dg/nrv3.c: New test.
- gcc.dg/nrv4.c: New test.
- gcc.dg/nrv5.c: New test.
+ * gcc.dg/nrv3.c: New test.
+ * gcc.dg/nrv4.c: New test.
+ * gcc.dg/nrv5.c: New test.
2006-09-01 Nathan Sidwell <nathan@codesourcery.com>
diff --git a/gcc/testsuite/g++.dg/lookup/koenig5.C b/gcc/testsuite/g++.dg/lookup/koenig5.C
new file mode 100644
index 00000000000..139e3b86684
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/koenig5.C
@@ -0,0 +1,46 @@
+// Koenig lookup is not defined as intended in the std. DR 218 gives
+// an indication of what is meant. This test case encapsulates the
+// current conservative behaviour
+
+// Copyright (C) 2006 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 27 Aug 2006 <nathan@codesourcery.com>
+
+namespace N
+{
+ struct A {};
+ void One (...); // { dg-error "conflict with" "" }
+ void (*Two) (...); // { dg-error "not a function" "" }
+ namespace Three {} // { dg-error "lookup finds|not a function" "" }
+}
+
+namespace M
+{
+ struct B {};
+ struct One {}; // { dg-error "lookup finds|not a function" "" }
+ void (*Two) (...); // { dg-error "conflict with" "" }
+ void Three (...); // { dg-error "conflict with" "" }
+}
+
+namespace O
+{
+ struct C {};
+ void Two (...); // { dg-error "conflict with" "" }
+}
+
+void g (N::A *a, M::B *b, O::C *c)
+{
+ One (a); // ok
+ One (b); // { dg-error "in call to" "" }
+ One (a, b); // { dg-error "in call to" "" }
+
+ Two (a); // ok
+ Two (a, a); // ok
+ Two (b); // ok
+ Two (c); // ok
+ Two (a, b); // { dg-error "in call to" "" }
+ Two (a, c); // { dg-error "in call to" "" }
+
+ Three (a); // { dg-error "in call to" "" }
+ Three (b); // ok
+ Three (a, b); // { dg-error "in call to" "" }
+}
diff --git a/gcc/testsuite/g++.dg/template/crash56.C b/gcc/testsuite/g++.dg/template/crash56.C
new file mode 100644
index 00000000000..1efa3500d8a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/crash56.C
@@ -0,0 +1,16 @@
+// Origin: Wolfgang Bangerth <bangerth@dealii.org>
+
+// PR c++/28705
+// DR 218 is debating whether this is well formed or not. We've never
+// accepted it (because we'd crash), so we continue to reject it, but
+// without crashing.
+
+namespace N
+{
+ struct A { A (A*); }; // { dg-error "lookup finds" "" }
+}
+
+template<typename T> void g (N::A *p)
+{
+ (void) A (p); // { dg-error "in call" "" }
+}