[Bug debug/77931] PASS->FAIL: gdb.cp/namespace.exp: print ina

2016-10-12 Thread rguenth at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77931

Richard Biener  changed:

   What|Removed |Added

 Status|ASSIGNED|RESOLVED
 Resolution|--- |FIXED

--- Comment #5 from Richard Biener  ---
Fixed.

[Bug debug/77931] PASS->FAIL: gdb.cp/namespace.exp: print ina

2016-10-11 Thread rguenth at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77931

--- Comment #4 from Richard Biener  ---
Author: rguenth
Date: Tue Oct 11 12:52:44 2016
New Revision: 240991

URL: https://gcc.gnu.org/viewcvs?rev=240991&root=gcc&view=rev
Log:
2016-10-11  Richard Biener  

PR debug/77931
* gimple-low.c (lower_gimple_bind): Handle arbitrary common
sub-chains of BLOCK_VARS and gimple_bind_vars.

Modified:
trunk/gcc/ChangeLog
trunk/gcc/gimple-low.c

[Bug debug/77931] PASS->FAIL: gdb.cp/namespace.exp: print ina

2016-10-11 Thread thopre01 at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77931

--- Comment #3 from Thomas Preud'homme  ---
Confirmed, this patch fixes the issue. Thanks!

[Bug debug/77931] PASS->FAIL: gdb.cp/namespace.exp: print ina

2016-10-11 Thread rguenth at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77931

--- Comment #2 from Richard Biener  ---
It's that way in the original BIND_EXPR already.  So it looks like we need to
handle this gracefully :/

Index: gcc/gimple-low.c
===
--- gcc/gimple-low.c(revision 240964)
+++ gcc/gimple-low.c(working copy)
@@ -420,18 +420,24 @@ lower_gimple_bind (gimple_stmt_iterator
   /* Scrap DECL_CHAIN up to BLOCK_VARS to ease GC after we no longer
  need gimple_bind_vars.  */
   tree next;
-  tree end = NULL_TREE;
+  /* BLOCK_VARS and gimple_bind_vars share a common sub-chain.  Find
+ it by marking all BLOCK_VARS.  */
   if (gimple_bind_block (stmt))
-end = BLOCK_VARS (gimple_bind_block (stmt));
-  for (tree var = gimple_bind_vars (stmt); var != end; var = next)
+for (tree t = BLOCK_VARS (gimple_bind_block (stmt)); t; t = DECL_CHAIN
(t))
+  {
+   gcc_checking_assert (! TREE_VISITED (t));
+   TREE_VISITED (t) = 1;
+  }
+  for (tree var = gimple_bind_vars (stmt);
+   var && ! TREE_VISITED (var); var = next)
 {
-  /* Ugh, something is violating the constraint that BLOCK_VARS
- is a sub-chain of gimple_bind_vars.  */
-  if (! var)
-   break;
   next = DECL_CHAIN (var);
   DECL_CHAIN (var) = NULL_TREE;
 }
+  /* Unmark BLOCK_VARS.  */
+  if (gimple_bind_block (stmt))
+for (tree t = BLOCK_VARS (gimple_bind_block (stmt)); t; t = DECL_CHAIN
(t))
+  TREE_VISITED (t) = 0;

   lower_sequence (gimple_bind_body_ptr (stmt), data);


fixes it.

[Bug debug/77931] PASS->FAIL: gdb.cp/namespace.exp: print ina

2016-10-11 Thread rguenth at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77931

Richard Biener  changed:

   What|Removed |Added

 Status|UNCONFIRMED |ASSIGNED
   Last reconfirmed||2016-10-11
   Assignee|unassigned at gcc dot gnu.org  |rguenth at gcc dot 
gnu.org
 Ever confirmed|0   |1

--- Comment #1 from Richard Biener  ---
Ok, we're hitting /* Ugh */ which shouldn't really happen.  BLOCK_VARS should
be a sub-chain of gimple_bind_vars.  It looks like BLOCK_VARS in this case
has a common sub-chain with gimple_bind_vars instead...

  /* Scrap DECL_CHAIN up to BLOCK_VARS to ease GC after we no longer
 need gimple_bind_vars.  */
  tree next;
  tree end = NULL_TREE;
  if (gimple_bind_block (stmt))
end = BLOCK_VARS (gimple_bind_block (stmt));
  for (tree var = gimple_bind_vars (stmt); var != end; var = next)
{
  /* Ugh, something is violating the constraint that BLOCK_VARS
 is a sub-chain of gimple_bind_vars.  */
  if (! var)
break;
  next = DECL_CHAIN (var);
  DECL_CHAIN (var) = NULL_TREE;
}

and we have

gimple_bind_vars: c1D.2424 varD.2425 inaD.2426 yD.2460 clD.2462 
BLOCK_VARS: <<< Unknown tree: imported_decl >>> <<< Unknown tree: imported_decl
>>> c1D.2424 varD.2425 inaD.2426 yD.2460 clD.2462