[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:
parent
4900146ce0
commit
1ea71a82f9
@ -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.
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
40
gcc/testsuite/g++.dg/pr84492.C
Normal file
40
gcc/testsuite/g++.dg/pr84492.C
Normal 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" }
|
||||
}
|
||||
};
|
Loading…
x
Reference in New Issue
Block a user