[cfe-dev] Help with APValue comparisons

Andy Gibbs andyg1001 at hotmail.co.uk
Fri Jun 15 07:01:37 PDT 2012


On Friday, June 15, 2012 9:38 AM, Andy Gibbs wrote:

> Hi Jordan,
>
> Thanks for your pointers.  I've implemented an "isEqual" function as 
> below. If you have time, would you mind having a quick skim through please 
> to see if I've caught the right idea.  At the moment, it holds up to the 
> testing I have performed so far, but I'm always working on more 
> test-cases!
>
> At this point, my concern is not that isEqual may not fully distinguish 
> two APValues that *are* equal, more that it should never say two APValues 
> are equal when they aren't.  False negatives are much less of an issue 
> than false positives!

Ok, so please ignore my implementation for LValue in my previous post: I'm 
not sure exactly what I was thinking, but it was garbage!

Here is a simplified and more correct implementation:

case LValue: {
  LValueBase BaseA = A.getLValueBase();
  LValueBase BaseB = B.getLValueBase();

  // null pointers on either side are not comparable
  if (!BaseA || !BaseB || BaseA.isNull() || BaseB.isNull()) return false;

  // simple comparison checks
  if ((A.getLValueOffset()       != B.getLValueOffset())       ||
      (A.getLValueCallIndex()    != B.getLValueCallIndex())    ||
      (A.isLValueOnePastTheEnd() != B.isLValueOnePastTheEnd()) ||
      (A.hasLValuePath()         != B.hasLValuePath())         ||
      (BaseA.getOpaqueValue()    != BaseB.getOpaqueValue()))
    return false;

  // walk the path
  if (A.hasLValuePath()) {
    assert(B.hasLValuePath() && "this should not happen"); // checked above

    ArrayRef<LValuePathEntry> PathA = A.getLValuePath();
    ArrayRef<LValuePathEntry> PathB = B.getLValuePath();
    if (PathA.size() != PathB.size()) return false;

    for (unsigned I = 0, N = PathA.size(); I != N; ++I) {
      if ((PathA[I].BaseOrMember != PathB[I].BaseOrMember) ||
          (PathA[I].ArrayIndex   != PathB[I].ArrayIndex))
        return false;
    }
  }

  return true;
}






More information about the cfe-dev mailing list