summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2015-02-12 18:09:59 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2015-02-12 18:09:59 +0000
commit5308e3271fda858ebf8bc1c9e8bdb4cbdaa4ae6a (patch)
tree643380c28cfaa4e5d03935806d8323e6c7214b68
parenta5a520294191da394b276e6dc3296fe90f7ec63e (diff)
downloadgcc-5308e3271fda858ebf8bc1c9e8bdb4cbdaa4ae6a.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@220650 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/cp-tree.h4
-rw-r--r--gcc/cp/decl.c44
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/localclass3.C7
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/redeclaration-1.C8
-rw-r--r--gcc/testsuite/g++.dg/guality/pr55541.C11
7 files changed, 71 insertions, 16 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index b66231d2feb..722e92684bf 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 1176583cef7..65219f159e3 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -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. */
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index d2b0814543d..50b062497fa 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -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;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 276d6e17d4e..3cb5af0c8ac 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/localclass3.C b/gcc/testsuite/g++.dg/debug/dwarf2/localclass3.C
index be28a197168..b4baaa1f7e0 100644
--- a/gcc/testsuite/g++.dg/debug/dwarf2/localclass3.C
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/localclass3.C
@@ -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" } }
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/redeclaration-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/redeclaration-1.C
index 8aaff8ef2ea..325647e13fe 100644
--- a/gcc/testsuite/g++.dg/debug/dwarf2/redeclaration-1.C
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/redeclaration-1.C
@@ -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
index 00000000000..c8ec19365dc
--- /dev/null
+++ b/gcc/testsuite/g++.dg/guality/pr55541.C
@@ -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" } }