From fbdff2bc387d09f5b4d7c7f6969ee650dc63963d Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Sat, 9 Jan 2021 17:57:32 +0100 Subject: [PATCH] glr2.cc: fix memory leak * data/skeletons/glr2.cc (glr_stack_item::setState): Free the previous state before installing the new one. --- data/skeletons/glr2.cc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/data/skeletons/glr2.cc b/data/skeletons/glr2.cc index 77c64641..19773cd2 100644 --- a/data/skeletons/glr2.cc +++ b/data/skeletons/glr2.cc @@ -1374,10 +1374,10 @@ public: ~glr_stack_item () {]b4_parse_assert_if([[ check_ ();]])[ - if (is_state()) - getState().~glr_state(); + if (is_state ()) + getState ().~glr_state (); else - getOption().~semantic_option(); + getOption ().~semantic_option (); } void setState (const glr_state &state) @@ -1386,12 +1386,12 @@ public: state.check_ ();]])[ if (this != state.asItem ()) { - is_state_ = true; - // FIXME: What about the previous content? Shouldn't it be - // freed? It might be useful to have an explicit "void" state - // when this item is in unused state (in the list of free - // items), when parse.assert is set. + if (is_state_) + getState ().~glr_state (); + else + getOption ().~semantic_option (); new (&raw_) glr_state (state); + is_state_ = true; } }