diff options
author | Iain Buclaw <ibuclaw@gdcproject.org> | 2020-07-21 19:59:00 +0200 |
---|---|---|
committer | Iain Buclaw <ibuclaw@gdcproject.org> | 2020-08-03 11:18:46 +0200 |
commit | 2b1c2a4bd9fb555dccde5d67d6da64547064e0e6 (patch) | |
tree | 5da49e400890cbbb33d45ca68f9c47e323bf2baf /gcc/d/decl.cc | |
parent | 58cfec3a6e756b534b33787e51c52f5fc63b53ab (diff) | |
download | gcc-2b1c2a4bd9fb555dccde5d67d6da64547064e0e6.zip gcc-2b1c2a4bd9fb555dccde5d67d6da64547064e0e6.tar.gz gcc-2b1c2a4bd9fb555dccde5d67d6da64547064e0e6.tar.bz2 |
d: Fix ICE using non-local variable: internal compiler error: Segmentation fault
Moves no frame access error to own function, adding use of it for both
when get_framedecl() cannot find a path to the outer function frame, and
guarding get_decl_tree() from recursively calling itself.
gcc/d/ChangeLog:
PR d/96254
* d-codegen.cc (error_no_frame_access): New.
(get_frame_for_symbol): Use fdparent name in error message.
(get_framedecl): Replace call to assert with error.
* d-tree.h (error_no_frame_access): Declare.
* decl.cc (get_decl_tree): Detect recursion and error.
gcc/testsuite/ChangeLog:
PR d/96254
* gdc.dg/pr96254a.d: New test.
* gdc.dg/pr96254b.d: New test.
Diffstat (limited to 'gcc/d/decl.cc')
-rw-r--r-- | gcc/d/decl.cc | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/gcc/d/decl.cc b/gcc/d/decl.cc index 15eb9a4..72c8a8c 100644 --- a/gcc/d/decl.cc +++ b/gcc/d/decl.cc @@ -1480,6 +1480,11 @@ get_decl_tree (Declaration *decl) AggregateDeclaration *ad = fd->isThis (); gcc_assert (ad != NULL); + /* The parent function is for the same `this' declaration we are + building a chain to. Non-local declaration is inaccessible. */ + if (fd->vthis == vd) + return error_no_frame_access (fd); + t = get_decl_tree (fd->vthis); Dsymbol *outer = fd; |