steakhal added a comment.

I'm really sorry about being sooo picky about this patch.
It's not my expertise and the change seems to address a corner-case, so we have 
to especially careful not introducing bugs.

My concern is that I still don't understand why do we want to do anything with 
reinterpret casts, besides remembering what the original type was.
AFAIK the resulting pointer can not be safely dereferenced unless it's 
reinterpreted back to the original type.
But for example, you are expecting this:

  void testMultiple() {
    int F::*f = &F::field;
    int A::*a = reinterpret_cast<int A::*>(f); // Dereferencing 'a' is UB, AFAIK
    int C::*c = reinterpret_cast<int C::*>(f); // Same here!
    A aobj;
    C cobj;
    aobj.*a = 13; // Now an airplane suddenly crashes.
    cobj.field = 29;
    clang_analyzer_eval(aobj.*a == 13); // expected-warning{{UNKNOWN}} // Same 
here!
    clang_analyzer_eval(cobj.*c == 29); // expected-warning{{TRUE}} // Same 
here!
  }

IMO if an expression results in UB, the symbolic value associated with that 
expression should be `Undef`.
`Unknown` would be also fine, but nothing else.

I could spam a couple of nits, but I think it's better to sort this question 
out.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D96976/new/

https://reviews.llvm.org/D96976

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to