[PR c++/85027] deal with baselink in save_expr in instantiate_type
authorAlexandre Oliva <aoliva@redhat.com>
Sat, 31 Mar 2018 03:44:12 +0000 (03:44 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Sat, 31 Mar 2018 03:44:12 +0000 (03:44 +0000)
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

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/pr85027.C [new file with mode: 0644]

index 3ea9faa74fb3a7a57cd193d95214547730c6c20e..d52a0dc33a3138e5e0e55021e5e9f463fc1b471b 100644 (file)
@@ -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
index debcaf21cf76393dd92f2122111beff672339f8c..0427d1224f74d2d3448a6c4f066bb5dbe70ab801 100644 (file)
@@ -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
index 16ffbd6d963a228a109a0b3fa608f9e5ac3cb2df..d3044eac963d2830cbfeb9fa4793dd8cb2a5202e 100644 (file)
@@ -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 (file)
index 0000000..01b1b29
--- /dev/null
@@ -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" }