Commit 8b91e848 by Jason Merrill

c++: Fix ICE with lambda in member operator (PR93279)

Here the problem was that we were remembering the lookup in template scope,
and then trying to reuse that lookup in the instantiation without
substituting into it at all.  The simplest solution is to not try to
remember a lookup that finds a class-scope declaration, as in that case
doing the normal lookup again at instantiation time will always find the
right declarations.

	PR c++/93279 - ICE with lambda in member operator.
	* name-lookup.c (maybe_save_operator_binding): Don't remember
	class-scope bindings.
parent c6717270
2020-01-24 Jason Merrill <jason@redhat.com> 2020-01-24 Jason Merrill <jason@redhat.com>
PR c++/93279 - ICE with lambda in member operator.
* name-lookup.c (maybe_save_operator_binding): Don't remember
class-scope bindings.
2020-01-24 Jason Merrill <jason@redhat.com>
PR c++/93377 - ICE with member alias in constraint. PR c++/93377 - ICE with member alias in constraint.
* pt.c (any_template_parm_r): Look at template arguments for all * pt.c (any_template_parm_r): Look at template arguments for all
aliases, not only alias templates. aliases, not only alias templates.
......
...@@ -7616,6 +7616,12 @@ maybe_save_operator_binding (tree e) ...@@ -7616,6 +7616,12 @@ maybe_save_operator_binding (tree e)
if (!fns && (fns = op_unqualified_lookup (fnname))) if (!fns && (fns = op_unqualified_lookup (fnname)))
{ {
tree fn = get_first_fn (fns);
if (DECL_CLASS_SCOPE_P (fn))
/* We don't need to remember class-scope functions, normal unqualified
lookup will find them again. */
return;
bindings = tree_cons (fnname, fns, bindings); bindings = tree_cons (fnname, fns, bindings);
if (attr) if (attr)
TREE_VALUE (attr) = bindings; TREE_VALUE (attr) = bindings;
......
// PR c++/93279
// { dg-do compile { target c++11 } }
template <typename T> struct B { using f = int; };
template <typename T, int N> struct E {
template <typename U, typename B<E>::f = 0>
void operator*(U l) { [l](T m) { m * l; }; }
};
int
main ()
{
E<E<float, 4>, 1> n;
n * 4.f;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment