OSDN Git Service

cp/
authornathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 1 Sep 2006 18:10:17 +0000 (18:10 +0000)
committernathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 1 Sep 2006 18:10:17 +0000 (18:10 +0000)
PR c++/28705
* semantics.c (finish_call_expr): Add assert.
* name-lookup.c (lookup_arg_dependent): Check we found an overload
or an object.
testsuite/
PR c++/28705
* g++.dg/lookup/koenig5.C: New.
* g++.dg/template/crash56.C: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@116638 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/name-lookup.c
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lookup/koenig5.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/crash56.C [new file with mode: 0644]

index bb2e841..45597c3 100644 (file)
@@ -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.
index b32ebfd..e794232 100644 (file)
@@ -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
index 94e6dfd..3ec0a1a 100644 (file)
@@ -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;
index df6e40f..530c23e 100644 (file)
@@ -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 (file)
index 0000000..139e3b8
--- /dev/null
@@ -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 (file)
index 0000000..1efa350
--- /dev/null
@@ -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" "" }
+}