aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2018-03-31 03:44:12 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2018-03-31 03:44:12 +0000
commitfc8b67411812f81151b4fa3dfcc0bd378e2d5cf8 (patch)
treeaa2d7f2777c76281bd8764c9a564d0ce67a0b79f
parentec8d8a5b5c1cf75cd62b908e2ace053ed2b05ec2 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/class.c10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/pr85027.C8
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" }