Я реализовал пользовательский атрибут в Clang, как описано в официальном руководстве:
http://clang.llvm.org/docs/InternalsManual.html#how-to-add-an-attribute
Поэтому я добавил следующий код в Attr.td:
def MyAttr: InheritableAttr {
let Spellings = [GNU<"my_attr">, CXX11<"me", "my_attr">, GCC<"my_attr">, Declspec<"my_attr">];
let Subjects = SubjectList<[Var, Function, CXXRecord]>;
let Documentation = [MyAttrDocs];
}
и документация для AttrDocs.td. После восстановления Clang, он, очевидно, знает атрибут, потому что я не получаю предупреждение о неизвестном атрибуте при его использовании. Я даже могу получить доступ к новому классу атрибутов с libtooling, но атрибут не отображается в AST, даже если я добавлю строку let ASTNode = 1
к определению атрибута.
Есть ли что-то еще, что мне нужно рассмотреть, или в чем может быть проблема?
К сожалению, это была моя ошибка, пропущенный шаг описан в руководстве в разделе «Boilerplate»: мне просто пришлось реализовать семантическую обработку атрибута в SemaDeclAttr.cpp, добавив новый случай:
case AttributeList::AT_MyAttr:
handleSimpleAttribute<MyAttrAttr>(S, D, Attr);
break;
Так что теперь работает нормально.
Других решений пока нет …