re PR debug/55541 (unable to see local variables due extra lexical block was generated)
authorJakub Jelinek <jakub@redhat.com>
Thu, 12 Feb 2015 18:09:59 +0000 (19:09 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 12 Feb 2015 18:09:59 +0000 (19:09 +0100)
PR debug/55541
* cp-tree.h (BLOCK_OUTER_CURLY_BRACE_P): Define.
* decl.c (poplevel): If functionbody, try not to create an extra
BLOCK for function body and use subblocks as that, if it is non-NULL
and doesn't have siblings.  Set BLOCK_OUTER_CURLY_BRACE_P flag.
(outer_curly_brace_block): Use BLOCK_OUTER_CURLY_BRACE_P flag.

* g++.dg/debug/dwarf2/localclass3.C: Adjust for the extraneous
DW_TAG_lexical_block removal.
* g++.dg/debug/dwarf2/redeclaration-1.C: Likewise.
* g++.dg/guality/pr55541.C: New test.

From-SVN: r220650

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/debug/dwarf2/localclass3.C
gcc/testsuite/g++.dg/debug/dwarf2/redeclaration-1.C
gcc/testsuite/g++.dg/guality/pr55541.C [new file with mode: 0644]

index b66231d2febdf122e5b93808e40357d52e36f331..722e92684bf92b0e8f008a6294eed078ed3ae575 100644 (file)
@@ -1,5 +1,12 @@
 2015-02-12  Jakub Jelinek  <jakub@redhat.com>
 
+       PR debug/55541
+       * cp-tree.h (BLOCK_OUTER_CURLY_BRACE_P): Define.
+       * decl.c (poplevel): If functionbody, try not to create an extra
+       BLOCK for function body and use subblocks as that, if it is non-NULL
+       and doesn't have siblings.  Set BLOCK_OUTER_CURLY_BRACE_P flag.
+       (outer_curly_brace_block): Use BLOCK_OUTER_CURLY_BRACE_P flag.
+
        PR sanitizer/64984
        * except.c (check_noexcept_r): Return NULL for internal
        calls.
index 1176583cef77f42b5553b11d5631474b74376b77..65219f159e326a77d20bceb9b85750a30c639b12 100644 (file)
@@ -84,6 +84,7 @@ c-common.h, not after.
       PACK_EXPANSION_LOCAL_P (in *_PACK_EXPANSION)
       TINFO_HAS_ACCESS_ERRORS (in TEMPLATE_INFO)
       SIZEOF_EXPR_TYPE_P (in SIZEOF_EXPR)
+      BLOCK_OUTER_CURLY_BRACE_P (in BLOCK)
    1: IDENTIFIER_VIRTUAL_P (in IDENTIFIER_NODE)
       TI_PENDING_TEMPLATE_FLAG.
       TEMPLATE_PARMS_FOR_INLINE.
@@ -326,6 +327,9 @@ typedef struct ptrmem_cst * ptrmem_cst_t;
 #define STATEMENT_LIST_TRY_BLOCK(NODE) \
   TREE_LANG_FLAG_2 (STATEMENT_LIST_CHECK (NODE))
 
+/* Mark the outer curly brace BLOCK.  */
+#define BLOCK_OUTER_CURLY_BRACE_P(NODE)        TREE_LANG_FLAG_0 (BLOCK_CHECK (NODE))
+
 /* Nonzero if this statement should be considered a full-expression,
    i.e., if temporaries created during this statement should have
    their destructors run at the end of this statement.  */
index d2b0814543d561c85eee81633d1d002dea50784e..50b062497fa875fb1c3d531278c8db76e56b860e 100644 (file)
@@ -610,7 +610,10 @@ poplevel (int keep, int reverse, int functionbody)
      or if this level is a function body,
      create a BLOCK to record them for the life of this function.  */
   block = NULL_TREE;
-  if (keep == 1 || functionbody)
+  /* Avoid function body block if possible.  */
+  if (functionbody && subblocks && BLOCK_CHAIN (subblocks) == NULL_TREE)
+    keep = 0;
+  else if (keep == 1 || functionbody)
     block = make_node (BLOCK);
   if (block != NULL_TREE)
     {
@@ -793,11 +796,16 @@ poplevel (int keep, int reverse, int functionbody)
      check over all the labels.  */
   if (functionbody)
     {
-      /* Since this is the top level block of a function, the vars are
-        the function's parameters.  Don't leave them in the BLOCK
-        because they are found in the FUNCTION_DECL instead.  */
-      BLOCK_VARS (block) = 0;
-      pop_labels (block);
+      if (block)
+       {
+         /* Since this is the top level block of a function, the vars are
+            the function's parameters.  Don't leave them in the BLOCK
+            because they are found in the FUNCTION_DECL instead.  */
+         BLOCK_VARS (block) = 0;
+         pop_labels (block);
+       }
+      else
+       pop_labels (subblocks);
     }
 
   kind = current_binding_level->kind;
@@ -819,7 +827,17 @@ poplevel (int keep, int reverse, int functionbody)
       /* The current function is being defined, so its DECL_INITIAL
         should be error_mark_node.  */
       gcc_assert (DECL_INITIAL (current_function_decl) == error_mark_node);
-      DECL_INITIAL (current_function_decl) = block;
+      DECL_INITIAL (current_function_decl) = block ? block : subblocks;
+      if (subblocks)
+       {
+         if (FUNCTION_NEEDS_BODY_BLOCK (current_function_decl))
+           {
+             if (BLOCK_SUBBLOCKS (subblocks))
+               BLOCK_OUTER_CURLY_BRACE_P (BLOCK_SUBBLOCKS (subblocks)) = 1;
+           }
+         else
+           BLOCK_OUTER_CURLY_BRACE_P (subblocks) = 1;
+       }
     }
   else if (block)
     current_binding_level->blocks
@@ -14053,10 +14071,14 @@ finish_function_body (tree compstmt)
 tree
 outer_curly_brace_block (tree fndecl)
 {
-  tree block = BLOCK_SUBBLOCKS (DECL_INITIAL (fndecl));
-  if (FUNCTION_NEEDS_BODY_BLOCK (current_function_decl))
-    /* Skip the artificial function body block.  */
-    block = BLOCK_SUBBLOCKS (block);
+  tree block = DECL_INITIAL (fndecl);
+  if (BLOCK_OUTER_CURLY_BRACE_P (block))
+    return block;
+  block = BLOCK_SUBBLOCKS (block);
+  if (BLOCK_OUTER_CURLY_BRACE_P (block))
+    return block;
+  block = BLOCK_SUBBLOCKS (block);
+  gcc_assert (BLOCK_OUTER_CURLY_BRACE_P (block));
   return block;
 }
 
index 276d6e17d4eabe507afca5d4d96ab07c5eefb0e8..3cb5af0c8ac636297b30a1c1c7e39737bb30884e 100644 (file)
@@ -1,5 +1,11 @@
 2015-02-12  Jakub Jelinek  <jakub@redhat.com>
 
+       PR debug/55541
+       * g++.dg/debug/dwarf2/localclass3.C: Adjust for the extraneous
+       DW_TAG_lexical_block removal.
+       * g++.dg/debug/dwarf2/redeclaration-1.C: Likewise.
+       * g++.dg/guality/pr55541.C: New test.
+
        PR sanitizer/64984
        * g++.dg/ubsan/pr64984.C: New test.
 
index be28a19716872c20535f5a82b296d6af5a0edd14..b4baaa1f7e048f544f863db5ba3351a9023abc81 100644 (file)
@@ -4,8 +4,11 @@
 
 void f()
 {
-  struct A { int i; } *ap;
-  ap->i = 42;
+  int j = 5;
+  {
+    struct A { int i; } *ap;
+    ap->i = 42;
+  }
 }
 
 // { dg-final { scan-assembler "DW_TAG_pointer_type.\[^)\]*. DW_TAG_structure_type" } }
index 8aaff8ef2ea04321cb93bd83da2d537f77b8df86..325647e13fee0c01c350e2aaa3affcd1c6395a48 100644 (file)
@@ -9,10 +9,12 @@ namespace S
   int
   f()
   {
-    int i = 42;
     {
-      extern int i;
-      return i;
+      int i = 42;
+      {
+       extern int i;
+       return i;
+      }
     }
   }
 }
diff --git a/gcc/testsuite/g++.dg/guality/pr55541.C b/gcc/testsuite/g++.dg/guality/pr55541.C
new file mode 100644 (file)
index 0000000..c8ec193
--- /dev/null
@@ -0,0 +1,11 @@
+// PR debug/55541
+// { dg-do run }
+// { dg-options "-g" }
+
+int
+main ()
+{
+  int vari;
+  vari = 10;
+  vari = vari + 5;
+} // { dg-final { gdb-test 11 "vari" "15" } }