We ICEd when returning a stmt expr that ends with an overloaded function. It's ill-formed when we can't convert the function name to the return type, but we should say that, not ICE.
The problem was that instantiate_type did not know what to do with STMT_EXPRs. Regstrapped on x86_64- and i686-linux-gnu. Ok to install? for gcc/cp/ChangeLog PR c++/84492 * class.c (instantiate_type): Deal with STMT_EXPRs. for gcc/testsuite/ChangeLog PR c++/84492 * g++.dg/pr84492.C: New. --- gcc/cp/class.c | 6 +++++- gcc/testsuite/g++.dg/pr84492.C | 7 +++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/pr84492.C diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 8348552a05b6..06630dc165d0 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -8013,7 +8013,8 @@ instantiate_type (tree lhstype, tree rhs, tsubst_flags_t complain) gcc_assert (TREE_CODE (rhs) == ADDR_EXPR || TREE_CODE (rhs) == COMPONENT_REF || is_overloaded_fn (rhs) - || (flag_ms_extensions && TREE_CODE (rhs) == FUNCTION_DECL)); + || (flag_ms_extensions && TREE_CODE (rhs) == FUNCTION_DECL) + || TREE_CODE (rhs) == STMT_EXPR); /* This should really only be used when attempting to distinguish what sort of a pointer to function we have. For now, any @@ -8073,6 +8074,9 @@ instantiate_type (tree lhstype, tree rhs, tsubst_flags_t complain) return instantiate_type (lhstype, TREE_OPERAND (rhs, 0), complain); } + case STMT_EXPR: + return instantiate_type (lhstype, stmt_expr_value_expr (rhs), complain); + case ERROR_MARK: return error_mark_node; diff --git a/gcc/testsuite/g++.dg/pr84492.C b/gcc/testsuite/g++.dg/pr84492.C new file mode 100644 index 000000000000..51fbd883a990 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr84492.C @@ -0,0 +1,7 @@ +// { dg-do compile } +// { dg-options "-fpermissive" } + +template<int> int foo() +{ + return ({ foo; }); // { dg-error "cannot resolve overloaded function" } +} -- Alexandre Oliva, freedom fighter http://FSFLA.org/~lxoliva/ You must be the change you wish to see in the world. -- Gandhi Be Free! -- http://FSFLA.org/ FSF Latin America board member Free Software Evangelist|Red Hat Brasil GNU Toolchain Engineer