Conversation
…ay of parent contexts, last one of which is nullptr. Signed-off-by: Terence Parr <parrt@antlr.org>
Signed-off-by: Terence Parr <parrt@antlr.org>
| if (lhs == nullptr && rhs == nullptr) return true; | ||
| if (lhs != nullptr || rhs != nullptr) return false; | ||
| return *lhs == *rhs; |
There was a problem hiding this comment.
It looks incorrect. Last line is never executed since it return false if any or both arguments are not null. Also, it's not optimal. I suggest fixing in the following way:
| if (lhs == nullptr && rhs == nullptr) return true; | |
| if (lhs != nullptr || rhs != nullptr) return false; | |
| return *lhs == *rhs; | |
| if (lhs == nullptr) | |
| return rhs == nullptr; | |
| else | |
| return rhs != nullptr; | |
| return *lhs == *rhs; |
There was a problem hiding this comment.
dang! you're right. I tried to get too clever. grrr...will fix. thanks.
There was a problem hiding this comment.
is your line 32 dead code?
There was a problem hiding this comment.
maybe this?
if ( lhs == nullptr ) return rhs == nullptr;
if ( rhs == nullptr ) return false; // lhs!=null and rhs==null
return *lhs == *rhs; // both nonnull
There was a problem hiding this comment.
Not dead, it's comparison by dereference (if I remember and understand C++ correctly).
There was a problem hiding this comment.
meaning your line 32 is never reached.
There was a problem hiding this comment.
Sorry, my first suggestion is also incorrect. The fixed version:
if (lhs == nullptr)
return rhs == nullptr;
else if (rhs == nullptr)
return false;
return *lhs == *rhs;There was a problem hiding this comment.
yep trying similar now. seems to work. this one still fails though, but this time with a SEGV #3959 rather than infinite loop.
There was a problem hiding this comment.
Yes, it's correct. Didn't get update in time.
There was a problem hiding this comment.
pushed the fix. thanks for finding! I updated trace diff for failing test: #3959
Fixed while doing #3817 Also see @kaby76's fix that I implemented: antlr/grammars-v4#2909