On 07/31/2014 01:36 PM, Paolo Carlini wrote:
The problem is that when grokfndecl calls duplicate_decls in such member cases 
it looks through TEMPLATE_DECLs
and then telling apart the two cases above is tough, both are FUNCTION_DECLs

Ideas about the best way to handle that?

Could you just condition it on DECL_TEMPLATE_INFO?

          tree t2 = TYPE_ARG_TYPES (TREE_TYPE (newdecl));
          int i = 1;

-         if (TREE_CODE (TREE_TYPE (newdecl)) == METHOD_TYPE)
+         if (DECL_NONSTATIC_MEMBER_FUNCTION_P (newdecl))
            t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2);

Let's use FUNCTION_FIRST_USER_PARMTYPE instead.

-         if (TREE_CODE (TREE_TYPE (newdecl)) == METHOD_TYPE
+         if (DECL_FUNCTION_MEMBER_P (newdecl)

This change is OK.

and in the predicate patch:

-             || TREE_CODE (TREE_TYPE (target_type)) != METHOD_TYPE);
+             || !DECL_NONSTATIC_MEMBER_FUNCTION_P (target_type));

This is wrong because target_type is not a FUNCTION_DECL. We should probably either add FUNCTION_DECL_CHECK to DECL_NONSTATIC_MEMBER_FUNCTION_P or make it false if the argument isn't a FUNCTION_DECL.

There are a bunch of instances of this in the patch.

   if (TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE
-      || TREE_CODE (TREE_TYPE (expr)) == METHOD_TYPE
+      || DECL_NONSTATIC_MEMBER_FUNCTION_P (expr)

Changing this instance and similar ones doesn't make much sense since the condition is looking for any kind of function, not just a non-static member function.

Jason

Reply via email to