Commit fc8b6741 by Alexandre Oliva Committed by Alexandre Oliva

[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
parent ec8d8a5b
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> 2018-03-30 Jason Merrill <jason@redhat.com>
* typeck2.c (process_init_constructor_record): Use * typeck2.c (process_init_constructor_record): Use
......
...@@ -7971,6 +7971,11 @@ instantiate_type (tree lhstype, tree rhs, tsubst_flags_t complain) ...@@ -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)) if (BASELINK_P (rhs))
{ {
access_path = BASELINK_ACCESS_BINFO (rhs); access_path = BASELINK_ACCESS_BINFO (rhs);
...@@ -7986,11 +7991,6 @@ instantiate_type (tree lhstype, tree rhs, tsubst_flags_t complain) ...@@ -7986,11 +7991,6 @@ instantiate_type (tree lhstype, tree rhs, tsubst_flags_t complain)
return error_mark_node; 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 /* There are only a few kinds of expressions that may have a type
dependent on overload resolution. */ dependent on overload resolution. */
gcc_assert (TREE_CODE (rhs) == ADDR_EXPR gcc_assert (TREE_CODE (rhs) == ADDR_EXPR
......
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> 2018-03-31 Segher Boessenkool <segher@kernel.crashing.org>
PR target/83315 PR target/83315
......
// { dg-do compile }
// Avoid -pedantic-error default
// { dg-options "" }
struct A { static int a; };
int t = A::A ? : 0; // { dg-error "cannot resolve" }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment