[PR c++/84492] stmt expr ending with overload

We ICEd when returning a stmt expr that ends with an overloaded
function, because instantiate_type did not know what to do with
STMT_EXPRs.  And it shouldn't have to: the expected type of a stmt
expr cannot be used to resolve its value: an unresolved overload
cannot supply the result of a stmt expr.  Catch that and report the
error in the stmt expr before we have a chance to instantiate it.

for  gcc/cp/ChangeLog

	PR c++/84492
	* semantics.c (finish_stmt_expr_expr): Reject unresolved
	overloads used as stmt expr values.

for  gcc/testsuite/ChangeLog

	PR c++/84492
	* g++.dg/pr84492.C: New.

From-SVN: r258269
This commit is contained in:
Alexandre Oliva 2018-03-06 06:24:40 +00:00 committed by Alexandre Oliva
parent 4900146ce0
commit 1ea71a82f9
4 changed files with 59 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2018-03-06 Alexandre Oliva <aoliva@redhat.com>
PR c++/84492
* semantics.c (finish_stmt_expr_expr): Reject unresolved
overloads used as stmt expr values.
2018-03-05 Jason Merrill <jason@redhat.com>
PR c++/84708 - ICE with lambda in local class NSDMI.

View File

@ -2114,7 +2114,14 @@ finish_stmt_expr_expr (tree expr, tree stmt_expr)
{
tree type = TREE_TYPE (expr);
if (processing_template_decl)
if (type && type_unknown_p (type))
{
error ("a statement expression is an insufficient context"
" for overload resolution");
TREE_TYPE (stmt_expr) = error_mark_node;
return error_mark_node;
}
else if (processing_template_decl)
{
expr = build_stmt (input_location, EXPR_STMT, expr);
expr = add_stmt (expr);

View File

@ -1,3 +1,8 @@
2018-03-06 Alexandre Oliva <aoliva@redhat.com>
PR c++/84492
* g++.dg/pr84492.C: New.
2018-03-05 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
* gcc.target/powerpc/spec-barr-1.c: Change called function name to

View File

@ -0,0 +1,40 @@
// { dg-do compile }
// { dg-options "-fpermissive" }
template<int> int foo()
{
return ({ foo; }); // { dg-error "insufficient context" }
}
int bar()
{
return ({ foo; }); // { dg-error "insufficient context" }
}
void bar(int);
typedef void (*bart)(int);
bart barf()
{
return ({ bar; }); // { dg-error "insufficient context" }
}
bool bark()
{
return ({ barf; }); // ok, no overload
}
template <typename T>
class C
{
static int f();
bool g()
{
return ({ f; }); // ok, no overload
}
bool g(int)
{
return ({ g; }); // { dg-error "insufficient context" }
}
};