aboutsummaryrefslogtreecommitdiff
path: root/gcc/d/decl.cc
diff options
context:
space:
mode:
authorIain Buclaw <ibuclaw@gdcproject.org>2020-07-21 19:59:00 +0200
committerIain Buclaw <ibuclaw@gdcproject.org>2020-08-03 11:18:46 +0200
commit2b1c2a4bd9fb555dccde5d67d6da64547064e0e6 (patch)
tree5da49e400890cbbb33d45ca68f9c47e323bf2baf /gcc/d/decl.cc
parent58cfec3a6e756b534b33787e51c52f5fc63b53ab (diff)
downloadgcc-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.cc5
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;