diff options
author | Martin Jambor <mjambor@suse.cz> | 2016-04-28 16:35:04 +0200 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2016-04-28 16:35:04 +0200 |
commit | a6bf99f00f8e86c98bdc797c18b171d8958ddb9a (patch) | |
tree | 346c86e56b2716b7dcadf2398ff8a34b23eafcfe /gcc/tree-cfg.c | |
parent | 208b85bb9135f1e59ed79855001439948a2b5a74 (diff) | |
download | gcc-a6bf99f00f8e86c98bdc797c18b171d8958ddb9a.zip gcc-a6bf99f00f8e86c98bdc797c18b171d8958ddb9a.tar.gz gcc-a6bf99f00f8e86c98bdc797c18b171d8958ddb9a.tar.bz2 |
Verify that context of local DECLs is the current function
2016-04-28 Martin Jambor <mjambor@suse.cz>
* tree-cfg.c (verify_expr): Verify that local declarations belong to
this function. Call verify_expr on MEM_REFs and bases of other
handled_components.
From-SVN: r235570
Diffstat (limited to 'gcc/tree-cfg.c')
-rw-r--r-- | gcc/tree-cfg.c | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index e1fdc9e..4ce1eaa 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -2834,6 +2834,22 @@ verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED) } break; + case PARM_DECL: + case VAR_DECL: + case RESULT_DECL: + { + tree context = decl_function_context (t); + if (context != cfun->decl + && !SCOPE_FILE_SCOPE_P (context) + && !TREE_STATIC (t) + && !DECL_EXTERNAL (t)) + { + error ("Local declaration from a different function"); + return t; + } + } + break; + case INDIRECT_REF: error ("INDIRECT_REF in gimple IL"); return t; @@ -2852,9 +2868,14 @@ verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED) error ("invalid offset operand of MEM_REF"); return TREE_OPERAND (t, 1); } - if (TREE_CODE (x) == ADDR_EXPR - && (x = verify_address (x, TREE_OPERAND (x, 0)))) - return x; + if (TREE_CODE (x) == ADDR_EXPR) + { + tree va = verify_address (x, TREE_OPERAND (x, 0)); + if (va) + return va; + x = TREE_OPERAND (x, 0); + } + walk_tree (&x, verify_expr, data, NULL); *walk_subtrees = 0; break; @@ -3016,6 +3037,7 @@ verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED) error ("invalid reference prefix"); return t; } + walk_tree (&t, verify_expr, data, NULL); *walk_subtrees = 0; break; case PLUS_EXPR: |