diff options
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/name-lookup.c | 14 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 1 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lookup/koenig5.C | 46 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/crash56.C | 16 |
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" "" } +} |