================
@@ -701,6 +703,80 @@ void Parser::ParseLexedAttributeList(LateParsedAttrList
&LAs, Decl *D,
LAs.clear();
}
+/// Collect the references to parameters in \p Attrs' arguments.
+static void collectParamRefs(const ParsedAttributes &Attrs,
+ SmallVectorImpl<const DeclRefExpr *> &Refs) {
+ SmallVector<const Stmt *, 8> Worklist;
+ for (const ParsedAttr &AL : Attrs)
+ for (unsigned I = 0, E = AL.getNumArgs(); I != E; ++I)
+ if (AL.isArgExpr(I))
+ Worklist.push_back(AL.getArgAsExpr(I));
+ while (!Worklist.empty()) {
+ const Stmt *S = Worklist.pop_back_val();
+ if (!S)
+ continue;
+ if (const auto *DRE = dyn_cast<DeclRefExpr>(S);
+ DRE && isa<ParmVarDecl>(DRE->getDecl()))
+ Refs.push_back(DRE);
+ llvm::append_range(Worklist, S->children());
+ }
+}
+
+bool Parser::checkLateAttributeParamRefs(
+ const LateParsedAttribute &LPA, const Decl *D,
+ ArrayRef<const DeclRefExpr *> ParamRefs, bool ReenteredProtoParams) {
+ auto IsPointeeParam = [&](const ParmVarDecl *PVD) {
+ return ReenteredProtoParams && llvm::is_contained(LPA.ProtoParams, PVD);
+ };
+
+ // In a C++ class, attributes were always late parsed and a pointee's
+ // parameters were not in scope, so a name that now binds to one used to bind
+ // to whatever else it names outside the prototype. Rather than silently
+ // change its meaning, reject the attribute as ambiguous.
----------------
aaronpuchert wrote:
Support for function pointer attributes is recent enough that we should be OK
with changing the meaning. Preferring parameters over members would also match
the usual scope rules, so I'd say we don't need such an exception. (As a side
note, naming collisions between parameters and members are pretty rare anyway.
So I don't expect that a lot of code would have to be fixed if you change this
to be more consistent, to put it mildly.)
https://github.com/llvm/llvm-project/pull/212615
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits