<div dir="ltr">I'm adding a custom attribute followed by this <a href="http://clang.llvm.org/docs/InternalsManual.html#how-to-add-an-attribute">http://clang.llvm.org/docs/InternalsManual.html#how-to-add-an-attribute</a>, here's my def:<div><br></div><div>def MEItem : InheritableParamAttr {<br>  let Spellings = [CXX11<"me", "type">, C2x<"me", "type">];<br>  let Args = [StringArgument<"Type", 1>, StringArgument<"Getter", 1>, StringArgument<"Setter", 1>];<br>  let Subjects = SubjectList<[Field]>;<br>  let Documentation = [Undocumented];<br>}<br></div><div><br></div><div>I just copied what ExternalSourceSymbol does, so the handling code is like this:</div><div><br></div><div>static void handleMEItemAttr(Sema &S, Decl *D, const ParsedAttr &AL) {<br>  if (!checkAttributeAtLeastNumArgs(S, AL, 1))<br>    return;<br>  assert(checkAttributeAtMostNumArgs(S, AL, 3) &&<br>         "Invalid number of arguments in an item attribute");<br><br>  StringRef Type;<br>  if (const auto *SE = dyn_cast_or_null<StringLiteral>(AL.getArgAsExpr(0)))<br>    Type = SE->getString();<br><br>  StringRef Getter;<br>  if (const auto *SE = dyn_cast_or_null<StringLiteral>(AL.getArgAsExpr(1)))<br>    Getter = SE->getString();<br><br>  StringRef Setter;<br>  if (const auto *SE = dyn_cast_or_null<StringLiteral>(AL.getArgAsExpr(2)))<br>    Setter = SE->getString();<br><br>  D->addAttr(::new (S.Context) MEItemAttr(S.Context, AL, Type, Getter, Setter));<br>}<br></div><div><br></div><div>but if I use this attribute in my code, for example [[me::type("int")]], the code crashed at AL.getArgAsExpr(1): </div><div><br></div><div>clang::ArgsUnion clang::ParsedAttr::getArg(unsigned int) const: Assertion `Arg < NumArgs && "Arg access out of range!"' failed.</div><div><br></div><div>then I tried this: [[me::type(Type="int", Getter="xxx", Setter="xxx")]]</div><div>error: use of undeclared identifier 'Type' [[me::type(Type="int", Getter="xxx", Setter="xxx")]]<br></div><div><br></div><div>So what did I miss?</div></div>