[cfe-dev] custom attribute crashed due to "Arg access out of range"
Yafei Liu via cfe-dev
cfe-dev at lists.llvm.org
Mon Aug 10 18:53:29 PDT 2020
Hi Erich, do you mean that ExternalSourceSymbol has extra parsing moves to
handle the syntax key="value"?
On Mon, Aug 10, 2020 at 8:57 PM Keane, Erich <erich.keane at intel.com> wrote:
> checkAttributeAtLeastNumArgs /checkAttributeAtMostNumArgs returns false on
> error. In your code, you are ensuring that there is at least 1, but no
> more than 3 arguments.
>
>
>
> SO, you have only made sure that you have 1, 2, OR 3 arguments.
>
>
>
> When you attempt to get the 2nd argument (AL.getArgAsExpr(1), BUT only
> have a single argument, you get an assertion, because there IS NOT a 2nd
> argument.
>
>
>
> In your attempt to use a designated initializer type signature
> (Type=”int”), you get the error because your argument list in the MEItem
> Attr.td entry you’ve said that you take only strings. You’d likely have to
> do some custom parsing to make that syntax work.
>
>
>
> *From:* cfe-dev <cfe-dev-bounces at lists.llvm.org> *On Behalf Of *Yafei Liu
> via cfe-dev
> *Sent:* Monday, August 10, 2020 5:23 AM
> *To:* Clang Dev <cfe-dev at lists.llvm.org>
> *Subject:* [cfe-dev] custom attribute crashed due to "Arg access out of
> range"
>
>
>
> I'm adding a custom attribute followed by this
> http://clang.llvm.org/docs/InternalsManual.html#how-to-add-an-attribute,
> here's my def:
>
>
>
> def MEItem : InheritableParamAttr {
> let Spellings = [CXX11<"me", "type">, C2x<"me", "type">];
> let Args = [StringArgument<"Type", 1>, StringArgument<"Getter", 1>,
> StringArgument<"Setter", 1>];
> let Subjects = SubjectList<[Field]>;
> let Documentation = [Undocumented];
> }
>
>
>
> I just copied what ExternalSourceSymbol does, so the handling code is like
> this:
>
>
>
> static void handleMEItemAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
> if (!checkAttributeAtLeastNumArgs(S, AL, 1))
> return;
> assert(checkAttributeAtMostNumArgs(S, AL, 3) &&
> "Invalid number of arguments in an item attribute");
>
> StringRef Type;
> if (const auto *SE = dyn_cast_or_null<StringLiteral>(AL.getArgAsExpr(0)))
> Type = SE->getString();
>
> StringRef Getter;
> if (const auto *SE = dyn_cast_or_null<StringLiteral>(AL.getArgAsExpr(1)))
> Getter = SE->getString();
>
> StringRef Setter;
> if (const auto *SE = dyn_cast_or_null<StringLiteral>(AL.getArgAsExpr(2)))
> Setter = SE->getString();
>
> D->addAttr(::new (S.Context) MEItemAttr(S.Context, AL, Type, Getter,
> Setter));
> }
>
>
>
> but if I use this attribute in my code, for example [[me::type("int")]],
> the code crashed at AL.getArgAsExpr(1):
>
>
>
> clang::ArgsUnion clang::ParsedAttr::getArg(unsigned int) const: Assertion
> `Arg < NumArgs && "Arg access out of range!"' failed.
>
>
>
> then I tried this: [[me::type(Type="int", Getter="xxx", Setter="xxx")]]
>
> error: use of undeclared identifier 'Type' [[me::type(Type="int",
> Getter="xxx", Setter="xxx")]]
>
>
>
> So what did I miss?
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20200811/b005b7d6/attachment-0001.html>
More information about the cfe-dev
mailing list