From 8cc99a4d4717b4bd5cb2362ea3e18d0f745a83eb Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 14 Nov 2008 16:57:34 -0500 Subject: [PATCH] re PR c++/38030 (name-lookup for non-dependent name in template function is wrong) PR c++/38030 * semantics.c (finish_call_expr): Remember the result of non-dependent overload resolution. From-SVN: r141866 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/semantics.c | 4 +++- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/template/lookup8.C | 19 +++++++++++++++++++ 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/template/lookup8.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index fd610b1..a4dbc86 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2008-11-14 Jason Merrill + PR c++/38030 + * semantics.c (finish_call_expr): Don't repeat arg-dep lookup + for a non-dependent call. + PR c++/37740 * call.c (build_aggr_conv): Increment i. diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 664f36d4..e0ae6ff 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -1976,7 +1976,9 @@ finish_call_expr (tree fn, tree args, bool disallow_virtual, bool koenig_p, if (processing_template_decl) { result = build_call_list (TREE_TYPE (result), orig_fn, orig_args); - KOENIG_LOOKUP_P (result) = koenig_p; + /* Don't repeat arg-dependent lookup at instantiation time if this call + is not type-dependent. */ + KOENIG_LOOKUP_P (result) = 0; } return result; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6e86c2e..2c74349 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2008-11-14 Jason Merrill + PR c++/38030 + * g++.dg/template/lookup8.C: New test. + PR c++/37740 * g++.dg/cpp0x/initlist8.C: New test. diff --git a/gcc/testsuite/g++.dg/template/lookup8.C b/gcc/testsuite/g++.dg/template/lookup8.C new file mode 100644 index 0000000..981c283e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/lookup8.C @@ -0,0 +1,19 @@ +// PR c++/38030 +// The call to f should be resolved at template definition time. +// { dg-do link } + +struct B { }; +struct D : public B { }; +D d; +void f (B &) { } +template < class T > +void g () +{ + return f (d); +} +void f (D &); +int main () +{ + g (); + return 0; +} -- 2.7.4