Я пытаюсь использовать Clang C ++ API для некоторого анализа кода, и я обнаружил, что иногда clang::index::generateUSRForDecl
падает.
Например, учитывая этот код:
template<typename T>
struct foo { enum { val = T::val }; };
генерирование USR для объявления, ссылающегося на DeclRefExpr, представляющего T::val
, приведет к сбою (похоже на доступ к несуществующему контексту AST).
Аналогичным образом, приведенный (несколько более сложный) пример
struct base
{
template<typename T>
static int helper(const T&);
static double helper(...);
};
template<typename T>
struct derived : base
{
using type = decltype(helper(T{}));
};
попытка сгенерировать USR для объявления, ссылающегося на DeclRefExpr, представляющего вызов helper
в следующей за последней строкой, также приведет к сбою.
Оба эти типа имеют смысл для меня:не имеет смысла ссылаться на объект, пока не будет создан экземпляр рассматриваемого шаблона, но мне было просто любопытно, есть ли достаточно разумное предварительное условие, которое я мог бы проверить в своем коде, чтобы избежать попытки сгенерировать USR для объектов, которые не будут работать (в этом случаесбой libclang)?