PR c++/86205 - ICE with ?: of throw and template-id.
My patch for 64372 removed a bogus lvalue-rvalue conversion for one arm of a ?: expression where the other arm is a throw. But we still need to require any overload to be resolved, even though we aren't getting that from decay_conversion anymore. * pt.c (resolve_nondeduced_context_or_error): Split out from... * typeck.c (decay_conversion): ...here. * call.c (build_conditional_expr_1): Use it. From-SVN: r268058
This commit is contained in:
parent
aee6ed4a2c
commit
b0f422220a
@ -1,5 +1,10 @@
|
||||
2019-01-17 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/86205 - ICE with ?: of throw and template-id.
|
||||
* pt.c (resolve_nondeduced_context_or_error): Split out from...
|
||||
* typeck.c (decay_conversion): ...here.
|
||||
* call.c (build_conditional_expr_1): Use it.
|
||||
|
||||
PR c++/86740, ICE with constexpr if and nested generic lambdas.
|
||||
* tree.c (cp_walk_subtrees): Handle LAMBDA_EXPR.
|
||||
|
||||
|
@ -5067,6 +5067,19 @@ build_conditional_expr_1 (const op_location_t &loc,
|
||||
arg3_type = unlowered_expr_type (arg3);
|
||||
if (VOID_TYPE_P (arg2_type) || VOID_TYPE_P (arg3_type))
|
||||
{
|
||||
/* 'void' won't help in resolving an overloaded expression on the
|
||||
other side, so require it to resolve by itself. */
|
||||
if (arg2_type == unknown_type_node)
|
||||
{
|
||||
arg2 = resolve_nondeduced_context_or_error (arg2, complain);
|
||||
arg2_type = TREE_TYPE (arg2);
|
||||
}
|
||||
if (arg3_type == unknown_type_node)
|
||||
{
|
||||
arg3 = resolve_nondeduced_context_or_error (arg3, complain);
|
||||
arg3_type = TREE_TYPE (arg3);
|
||||
}
|
||||
|
||||
/* [expr.cond]
|
||||
|
||||
One of the following shall hold:
|
||||
|
@ -6831,6 +6831,7 @@ extern tree get_template_innermost_arguments (const_tree);
|
||||
extern tree get_template_argument_pack_elems (const_tree);
|
||||
extern tree get_function_template_decl (const_tree);
|
||||
extern tree resolve_nondeduced_context (tree, tsubst_flags_t);
|
||||
extern tree resolve_nondeduced_context_or_error (tree, tsubst_flags_t);
|
||||
extern hashval_t iterative_hash_template_arg (tree arg, hashval_t val);
|
||||
extern tree coerce_template_parms (tree, tree, tree);
|
||||
extern tree coerce_template_parms (tree, tree, tree, tsubst_flags_t);
|
||||
|
15
gcc/cp/pt.c
15
gcc/cp/pt.c
@ -21147,6 +21147,21 @@ resolve_nondeduced_context (tree orig_expr, tsubst_flags_t complain)
|
||||
return orig_expr;
|
||||
}
|
||||
|
||||
/* As above, but error out if the expression remains overloaded. */
|
||||
|
||||
tree
|
||||
resolve_nondeduced_context_or_error (tree exp, tsubst_flags_t complain)
|
||||
{
|
||||
exp = resolve_nondeduced_context (exp, complain);
|
||||
if (type_unknown_p (exp))
|
||||
{
|
||||
if (complain & tf_error)
|
||||
cxx_incomplete_type_error (exp, TREE_TYPE (exp));
|
||||
return error_mark_node;
|
||||
}
|
||||
return exp;
|
||||
}
|
||||
|
||||
/* Subroutine of resolve_overloaded_unification; does deduction for a single
|
||||
overload. Fills TARGS with any deduced arguments, or error_mark_node if
|
||||
different overloads deduce different arguments for a given parm.
|
||||
|
@ -2009,13 +2009,7 @@ decay_conversion (tree exp,
|
||||
if (type == error_mark_node)
|
||||
return error_mark_node;
|
||||
|
||||
exp = resolve_nondeduced_context (exp, complain);
|
||||
if (type_unknown_p (exp))
|
||||
{
|
||||
if (complain & tf_error)
|
||||
cxx_incomplete_type_error (exp, TREE_TYPE (exp));
|
||||
return error_mark_node;
|
||||
}
|
||||
exp = resolve_nondeduced_context_or_error (exp, complain);
|
||||
|
||||
code = TREE_CODE (type);
|
||||
|
||||
|
14
gcc/testsuite/g++.dg/cpp0x/cond2.C
Normal file
14
gcc/testsuite/g++.dg/cpp0x/cond2.C
Normal file
@ -0,0 +1,14 @@
|
||||
// PR c++/86205
|
||||
// { dg-do compile { target c++11 } }
|
||||
|
||||
bool b;
|
||||
|
||||
template < class T > int f ()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
template < class T > auto g () -> decltype (b ? f < int > : throw 0)
|
||||
{
|
||||
return b ? f<int> : throw 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user