aaron.ballman added inline comments.

================
Comment at: clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp:316-317
     return nullptr;
+  if (!Member->getMemberDecl()->getDeclName().isIdentifier())
+    return nullptr;
   StringRef Name = Member->getMemberDecl()->getName();
----------------
njames93 wrote:
> njames93 wrote:
> > aaron.ballman wrote:
> > > It's really strange to me that we're even getting to this point in the 
> > > check -- the only way for the assertion to fail is for the member call 
> > > expression to be on something without a name. The cases I can think of 
> > > for that would be something like `foo.operator+(RHS)` or something 
> > > similarly nonsensical within this context (we're looking for things named 
> > > `begin` or `end`). I think it'd make more sense to handle this at the 
> > > matcher level (or early in the call chain) so that we never get here.
> > > 
> > > I think having a test case would be really useful to trying to understand 
> > > what changes are appropriate. I don't think these changes are wrong so 
> > > much as I wonder if we're in the wrong place to make them (and we'll hit 
> > > other confused code elsewhere).
> > It is very strange. At the matcher level we are looking for calls to 
> > methods named `begin` or `end` or (c/r) variants. 
> > I'm gonna try and put some debug prints and see if I can figure out the 
> > code actually causing the assert in the first place.
> > 
> > In the mean time, I have a patch in the works that moves a lot of the logic 
> > into the matchers and this whole function is removed in there, however a 
> > few creases still need to be ironed out in there.
> So I put some debugprints in there and managed to find the cause of the crash
> ```
>   // llvm/lib/Option/OptTable.cpp:150
>   for (StringSet<>::const_iterator I = PrefixesUnion.begin(),
>                                    E = PrefixesUnion.end(); I != E; ++I) {
>     StringRef Prefix = I->getKey();
>     for (StringRef::const_iterator C = Prefix.begin(), CE = Prefix.end();
>                                    C != CE; ++C)
>       if (!is_contained(PrefixChars, *C))
>         PrefixChars.push_back(*C);
>   }```
> However I'm still not 100% sure of the cause of the crash. Its nothing to do 
> with `begin()` being a member of the bast class StringMap. I tried testing 
> with inherited begin/end methods and no crash.
> My best guess is Prefix.begin() returns `StringMapIterator<>`, that class 
> contains a conversion operator to `StringMapConstIterator<>`. Conversion 
> operators names aren't Identifiers so that would explain the assert.
> If that is the case, the actual issue is in `digThroughConstructors` being 
> fooled by the `CXXMemberCallExpr` that's just a conversion operator.
> 
> The other patch in the works doesn't use that function so the bug is not 
> present there, maybe its easier to just get that ready. WDYT?
> The other patch in the works doesn't use that function so the bug is not 
> present there, maybe its easier to just get that ready. WDYT?

I think that makes sense. 


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D97889

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

Reply via email to