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

Reply via email to