mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-21 00:21:03 +08:00
re PR c++/28705 (ICE: in type_dependent_expression_p, at cp/pt.c:12837)
cp/ 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. From-SVN: r116638
This commit is contained in:
parent
4832214af7
commit
4860b87477
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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>
|
||||
|
||||
|
46
gcc/testsuite/g++.dg/lookup/koenig5.C
Normal file
46
gcc/testsuite/g++.dg/lookup/koenig5.C
Normal file
@ -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" "" }
|
||||
}
|
16
gcc/testsuite/g++.dg/template/crash56.C
Normal file
16
gcc/testsuite/g++.dg/template/crash56.C
Normal file
@ -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" "" }
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user