Clang-bugs-at-wip-clang-branch

From Qt Wiki
Revision as of 11:03, 25 February 2015 by Maintenance script (talk | contribs)
Jump to navigation Jump to 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:
#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}
 }
 ]
 }
 ]
}

h2. 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: http://llvm.org/bugs/show_bug.cgi?id=15085 See example, completion requested in point marked with '#' sign

void UnitConsumer::visitChildren()
{
 visitChildren(cursor, [this](const CXCursor &amp;cursor, const CXCursor &amp; /*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;
public:
 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::,
 CPlusPlus::ProjectPart::QtVersion qtVersion,
 const QList<QByteArray> &amp;defines,
 const QStringList &amp;includePaths,
 const QStringList &amp;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.
#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