From Qt Wiki
Jump to: navigation, search

See also

  • ClangCodeModel plugin has class CXPrettyPrinter that prints clang-c types in JSON-like format. Use it to debug and feel free to improve this class.
  • Clang hacking notes

Clang bugs with known workarounds

  • Sometimes diagnostic message have one empty SourceRange, which breaks SourceLocation-based euristic. Example:

  1. include <vector>

int main() {

std::vector<> a;
return 0;

} CXPrettyPrinter reports: CXDiagnostic: {

'error: too few template arguments for class template 'vector
severity: Error
location: {
file: '/home/sergey/Документы/wip-clang/test_projects/objc_test/main.cpp',
line: 5,
column: 10
category: 'Semantic Issue';
ranges: [
file: ,
from: {0, 0},to: {0, 0}
children: [
'note: template is declared here'
severity: Note
location: {
file: '/usr/include/c+/4.6/bits/stl_vector.h',
line: 180,
column: 11
category: 'Semantic Issue';
ranges: [
file: '/usr/include/c/4.6/bits/stl_vector.h',
from: {179, 3},to: {179, 65}


Clang bugs

Links to reported bugs will be attached in future

  • inside lambda, clang doesn't include mutable (non-const) methods of current class even if 'this' was captured by lambda

Bug: See example, completion requested in point marked with '#' sign

void UnitConsumer::visitChildren() {

visitChildren(cursor, [this](const CXCursor &cursor, const CXCursor & /*parent*/) {
if (cursor.kind == CXCursor_FieldDecl) {


  • Clang does not add virtual functions to proposals list

class Base { public:

virtual void overrideMe(int a);


class Derived : public Base { public:

void #


class Foo { public:

void declarable(int a, float b);


void Foo::declarable(int a, float b) {

if (a != 1)
Foo::declarable(1, 2.0);


Poor diagnostic for such code if C11 disabled enum class EnumScoped { };

  • clang does not add classes to completion proposals when completing 'foreach'
  • when declaring variable, variable itself proposed with highest priority. It's error.
  • Macro completions not added after class keyword

class CLANG_EXPORT CodeCompletionResult { };

class Class {

int a;
int c;


Class(int b) try : a(b), c(new int)
catch (…)
// no "delete" proposed


Completion with nested names lookup not performed for comparison with enum value

if (lexer.tokenKind() == Token::LeftBrace) {

  • Value types completions added where thay shouldn't be

QStringList createClangOptions(CPlusPlus::ProjectFile::Kind language,

CPlusPlus::ProjectPart::CXXExtensions extensions,
CPlusPlus::ProjectPart::QtVersion qtVersion,
const QList<QByteArray> &defines,
const QStringList &includePaths,
const QStringList &frameworkPaths);

  • C+11 'override' pseudo-keyword breaks clang_annotateTokens()

bool init() override;

  • Poor completion context recognition in template params

std::vector<#> myVector;

  • Clang doesn't add Informative completion chunk to macro. It better to add macro definition text to informative.

  1. define MACRO std::min(left, right)

// Completion proposal "MACRO" doesn't have chunk of kind Informative with text "std::min(left, right)"

  • Completion stops after asterisk:

ButtonsFactory ButtonsFactory::ms_instance = 0; ButtonsFactory*// completion requested here