Charusso added inline comments.

================
Comment at: clang/lib/StaticAnalyzer/Checkers/CastValueChecker.cpp:126
+
+  // If the casts have a common anchestor it could not be a succeeded downcast.
+  for (const auto &PreviousBase : PreviousRD->bases())
----------------
NoQ wrote:
> Charusso wrote:
> > NoQ wrote:
> > > Counterexample:
> > > 
> > > ```
> > > struct A {};
> > > struct B : A {};
> > > struct C : A, B {};
> > > ```
> > > 
> > > Downcast from `C` to `B` should succeed, even though they have a common 
> > > ancestor `A` (which has the same `CXXRecordDecl` but currently isn't the 
> > > same object within `C`, but can be, if `B` declares `A` as a virtual 
> > > base).
> > So, even it is some kind of anti-pattern as a warning arrive immediately, 
> > now I allow `B` to `C` downcasts. Could you explain me more about that 
> > virtual idea, please? Based on this possible use-case in my mind two 
> > classes are on the same level as every of their bases/vbases are equals.
> > Could you explain me more about that virtual idea, please?
> 
> In the following variation:
> ```
> struct A {};
> struct B : virtual A {};
> struct C : A, B {};
> ```
> we have `C` contain only one instance of `A`: the layout of `B` within `C` 
> would merely refer to the instance of `A` within `C` instead of making its 
> own copy. In particular, the constructor of `B` within the constructor of `C` 
> would not initialize `C`'s instance of `A` because the constructor of `C` 
> will invoke the constructor of `A` directly (cf. D61816).
That is a cool example, thanks you!


================
Comment at: clang/lib/StaticAnalyzer/Checkers/CastValueChecker.cpp:174
+
+constexpr llvm::StringLiteral Vowels = "aeiou";
+
----------------
NoQ wrote:
> Charusso wrote:
> > NoQ wrote:
> > > Omg lol nice. Did you try to figure out how do other people normally do 
> > > it?
> > There is no function for that in `ADT/StringExtras.h` + `grep` did not 
> > help, so I realized it is a common way to match vowels. Do you know a 
> > better solution?
> I just realized that this is actually incorrect and the correct solution is 
> pretty hard to implement because the actual "//a// vs. //an//" rule deals 
> with sounds, not letters. Eg.: 
> 
> > Clang is an "LLVM native" C/C++/Objective-C compiler
> 
> has an "an" because it's read as "an //**e**//l-el-vee-am".
That is a cool idea, I will adjust `StringExtras.h` after that patch, for now 
please let us use that simple heuristic.


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

https://reviews.llvm.org/D67079



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

Reply via email to