arg1 = prep_operand (arg1);
+ bool memonly = false;
switch (code)
{
case NEW_EXPR:
code_orig_arg1 = TREE_CODE (TREE_TYPE (arg1));
code_orig_arg2 = TREE_CODE (TREE_TYPE (arg2));
break;
+
+ /* =, ->, [], () must be non-static member functions. */
+ case MODIFY_EXPR:
+ if (code2 != NOP_EXPR)
+ break;
+ case COMPONENT_REF:
+ case ARRAY_REF:
+ memonly = true;
+ break;
+
default:
break;
}
/* Add namespace-scope operators to the list of functions to
consider. */
- add_candidates (lookup_function_nonclass (fnname, arglist, /*block_p=*/true),
- NULL_TREE, arglist, NULL_TREE,
- NULL_TREE, false, NULL_TREE, NULL_TREE,
- flags, &candidates, complain);
+ if (!memonly)
+ add_candidates (lookup_function_nonclass (fnname, arglist,
+ /*block_p=*/true),
+ NULL_TREE, arglist, NULL_TREE,
+ NULL_TREE, false, NULL_TREE, NULL_TREE,
+ flags, &candidates, complain);
args[0] = arg1;
args[1] = arg2;
--- /dev/null
+// DR 2007
+// We shouldn't instantiate A<void> to lookup operator=, since operator=
+// must be a non-static member function.
+
+template<typename T> struct A { typename T::error e; };
+template<typename T> struct B { };
+B<A<void> > b1, &b2 = (b1 = b1);