re PR c++/27666 (ICE with volatile in conditional expression)
PR c++/27666 * call.c (build_conditional_expr): Robustify. PR c++/27666 * g++.dg/expr/cond9.C: New test. From-SVN: r114702
This commit is contained in:
parent
a95799ec5f
commit
2954333afc
|
@ -1,5 +1,8 @@
|
|||
2006-06-15 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
PR c++/27666
|
||||
* call.c (build_conditional_expr): Robustify.
|
||||
|
||||
PR c++/27640
|
||||
* pt.c (instantiate_template): Set processing_template_decl to
|
||||
zero while performing substitutions.
|
||||
|
|
|
@ -3322,12 +3322,21 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3)
|
|||
arg2 = convert_like (conv2, arg2);
|
||||
arg2 = convert_from_reference (arg2);
|
||||
arg2_type = TREE_TYPE (arg2);
|
||||
/* Even if CONV2 is a valid conversion, the result of the
|
||||
conversion may be invalid. For example, if ARG3 has type
|
||||
"volatile X", and X does not have a copy constructor
|
||||
accepting a "volatile X&", then even if ARG2 can be
|
||||
converted to X, the conversion will fail. */
|
||||
if (error_operand_p (arg2))
|
||||
result = error_mark_node;
|
||||
}
|
||||
else if (conv3 && (!conv3->bad_p || !conv2))
|
||||
{
|
||||
arg3 = convert_like (conv3, arg3);
|
||||
arg3 = convert_from_reference (arg3);
|
||||
arg3_type = TREE_TYPE (arg3);
|
||||
if (error_operand_p (arg3))
|
||||
result = error_mark_node;
|
||||
}
|
||||
|
||||
/* Free all the conversions we allocated. */
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
2006-06-15 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
PR c++/27666
|
||||
* g++.dg/expr/cond9.C: New test.
|
||||
|
||||
PR c++/27640
|
||||
* g++.dg/template/ctor7.C: New test.
|
||||
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
// PR c++/27666
|
||||
|
||||
struct A { // { dg-error "A" }
|
||||
A(int); // { dg-error "A" }
|
||||
};
|
||||
|
||||
void foo(volatile A a) {
|
||||
1 ? a : 0; // { dg-error "match|temporary" }
|
||||
1 ? 0 : a; // { dg-error "match|temporary" }
|
||||
}
|
Loading…
Reference in New Issue