diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2018-03-31 03:44:12 +0000 |
---|---|---|
committer | Alexandre Oliva <aoliva@gcc.gnu.org> | 2018-03-31 03:44:12 +0000 |
commit | fc8b67411812f81151b4fa3dfcc0bd378e2d5cf8 (patch) | |
tree | aa2d7f2777c76281bd8764c9a564d0ce67a0b79f | |
parent | ec8d8a5b5c1cf75cd62b908e2ace053ed2b05ec2 (diff) | |
download | gcc-fc8b67411812f81151b4fa3dfcc0bd378e2d5cf8.zip gcc-fc8b67411812f81151b4fa3dfcc0bd378e2d5cf8.tar.gz gcc-fc8b67411812f81151b4fa3dfcc0bd378e2d5cf8.tar.bz2 |
[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
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/class.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/pr85027.C | 8 |
4 files changed, 24 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3ea9faa..d52a0dc 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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 diff --git a/gcc/cp/class.c b/gcc/cp/class.c index debcaf2..0427d12 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 16ffbd6..d3044ea 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 diff --git a/gcc/testsuite/g++.dg/pr85027.C b/gcc/testsuite/g++.dg/pr85027.C new file mode 100644 index 0000000..01b1b29 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr85027.C @@ -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" } |