[PR c++/85027] deal with baselink in save_expr in instantiate_type
We use SAVE_EXPRs in conditional expressions without the middle operand, to evaluate the first operand only once. When the conversion of the first operand fails, we may call instantiate_type get a better error message. We have code to peel off the SAVE_EXPR there, but then we may end up with a BASELINK, and we're past the code that deals with BASELINKs. Reorder the tests so that we expose the saved expr first, and then deal with BASELINKs. for gcc/cp/ChangeLog PR c++/85027 * class.c (instantiate_type): Peel off SAVE_EXPR before BASELINK. for gcc/testsuite/ChangeLog PR c++/85027 * g++.dg/pr85027.C: New. From-SVN: r258989
This commit is contained in:
parent
ec8d8a5b5c
commit
fc8b674118
4 changed files with 24 additions and 5 deletions
|
@ -1,3 +1,9 @@
|
|||
2018-03-31 Alexandre Oliva <aoliva@redhat.com>
|
||||
|
||||
PR c++/85027
|
||||
* class.c (instantiate_type): Peel off SAVE_EXPR before
|
||||
BASELINK.
|
||||
|
||||
2018-03-30 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* typeck2.c (process_init_constructor_record): Use
|
||||
|
|
|
@ -7971,6 +7971,11 @@ instantiate_type (tree lhstype, tree rhs, tsubst_flags_t complain)
|
|||
}
|
||||
}
|
||||
|
||||
/* If we instantiate a template, and it is a A ?: C expression
|
||||
with omitted B, look through the SAVE_EXPR. */
|
||||
if (TREE_CODE (rhs) == SAVE_EXPR)
|
||||
rhs = TREE_OPERAND (rhs, 0);
|
||||
|
||||
if (BASELINK_P (rhs))
|
||||
{
|
||||
access_path = BASELINK_ACCESS_BINFO (rhs);
|
||||
|
@ -7986,11 +7991,6 @@ instantiate_type (tree lhstype, tree rhs, tsubst_flags_t complain)
|
|||
return error_mark_node;
|
||||
}
|
||||
|
||||
/* If we instantiate a template, and it is a A ?: C expression
|
||||
with omitted B, look through the SAVE_EXPR. */
|
||||
if (TREE_CODE (rhs) == SAVE_EXPR)
|
||||
rhs = TREE_OPERAND (rhs, 0);
|
||||
|
||||
/* There are only a few kinds of expressions that may have a type
|
||||
dependent on overload resolution. */
|
||||
gcc_assert (TREE_CODE (rhs) == ADDR_EXPR
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2018-03-31 Alexandre Oliva <aoliva@redhat.com>
|
||||
|
||||
PR c++/85027
|
||||
* g++.dg/pr85027.C: New.
|
||||
|
||||
2018-03-31 Segher Boessenkool <segher@kernel.crashing.org>
|
||||
|
||||
PR target/83315
|
||||
|
|
8
gcc/testsuite/g++.dg/pr85027.C
Normal file
8
gcc/testsuite/g++.dg/pr85027.C
Normal file
|
@ -0,0 +1,8 @@
|
|||
// { dg-do compile }
|
||||
|
||||
// Avoid -pedantic-error default
|
||||
// { dg-options "" }
|
||||
|
||||
struct A { static int a; };
|
||||
|
||||
int t = A::A ? : 0; // { dg-error "cannot resolve" }
|
Loading…
Add table
Reference in a new issue