RIscRIpt added inline comments.
================ Comment at: clang/lib/Sema/Sema.cpp:1495-1499 + DeclContext *DC = CurContext; + while (DC && !isa<BlockDecl>(DC) && !isa<CapturedDecl>(DC) && + !isa<FunctionDecl>(DC) && !isa<ObjCMethodDecl>(DC)) + DC = DC->getParent(); + return dyn_cast_or_null<Decl>(DC); ---------------- RIscRIpt wrote: > cor3ntin wrote: > > RIscRIpt wrote: > > > cor3ntin wrote: > > > > I think this is reimplementing `getCurFunctionOrMethodDecl` > > > > maybe we want to do > > > > > > > > ``` > > > > if(Decl* DC = getCurFunctionOrMethodDecl()) > > > > return DC; > > > > return dyn_cast_or_null<Decl>(CurrentContext); > > > > ``` > > > > > > > > Or something like that > > > Well, unfortunately, not really. > > > > > > The previous implementation did call `getCurFunctionOrMethodDecl()`, but > > > it returned nullptr when we were inside a RecordDecl. > > > If you examine the implementation of `getFunctionLevelDeclContext(bool > > > AllowLambda)`, it halts if `isa<RecordDecl>(DC)`. I tried patching > > > `getFunctionLevelDeclContext()` to skip RecordDecl, but this triggered > > > around 70 clang/tests. I didn't want to delve into understanding the > > > failure of each test. If you believe there's an issue with our current > > > code, I can allocate time to investigate each specific test case. > > You are right, i missed that. > > I wish we had a better name for this function but I can't think of anything > A perfect name would be `getFunctionLevelDeclContext`, but it's taken. > Welp... I'll try to dig-into related functions, and update when I find > something. An alternative solution would be to parameterize (in some way) > `getFunctionLevelDeclContext` (e.g. add bool flags, or list of skippable > types, etc.). > A perfect name would be getFunctionLevelDeclContext, but it's taken. No, it's not. I found a better one, which was hiding in a plain sight. Regarding using a common implementation: with a new function name it's clear that we cannot do that - they serve different purposes. For example, this function may return `BlockDecl` or `CapturedDecl` (which is accepted by `PredefinedExpr::ComputeName`) whereas `getFunctionLevelDeclContext` cannot. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D158591/new/ https://reviews.llvm.org/D158591 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits