Clang-bugs-at-wip-clang-branch

From Qt Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
This article may require cleanup to meet the Qt Wiki's quality standards. Reason: Auto-imported from ExpressionEngine.
Please improve this article if you can. Remove the {{cleanup}} tag and add this page to Updated pages list after it's clean.

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}
 }
 ]
 }
 ]
}

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 &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;
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> &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.
#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