Генерация USR с помощью Clang C ++ API - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь использовать 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)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...