Index: gcc/gcc/function.c =================================================================== --- gcc.orig/gcc/function.c +++ gcc/gcc/function.c @@ -1766,7 +1766,8 @@ aggregate_value_p (const_tree exp, const { case CALL_EXPR: fndecl = get_callee_fndecl (fntype); - fntype = fndecl ? TREE_TYPE (fndecl) : 0; + fntype = fndecl ? TREE_TYPE (fndecl) + : TREE_TYPE (CALL_EXPR_FN (fntype)); break; case FUNCTION_DECL: fndecl = fntype; Index: gcc/gcc/tree.c =================================================================== --- gcc.orig/gcc/tree.c +++ gcc/gcc/tree.c @@ -6854,6 +6854,8 @@ get_callee_fndecl (const_tree call) if (TREE_CODE (addr) == ADDR_EXPR && TREE_CODE (TREE_OPERAND (addr, 0)) == FUNCTION_DECL) return TREE_OPERAND (addr, 0); + if (TREE_CODE (addr) == FUNCTION_DECL) + return addr; /* We couldn't figure out what was being called. */ return NULL_TREE;