diff options
author | Leandro Melo <leandro.melo@nokia.com> | 2011-08-09 13:46:28 +0200 |
---|---|---|
committer | Leandro T. C. Melo <leandro.melo@nokia.com> | 2011-08-09 14:11:28 +0200 |
commit | fb550c4ff1d29126fcc3c0390d7768c41b33c573 (patch) | |
tree | 8cfc2c258732dd5e41e74542de97bb32032f179e | |
parent | a9c0d4453e07c8d8c1d85209109501f644f6fc89 (diff) |
C++: Fix crash when typing illegal class names
Such as class ~A {} or class operator+ {}.
Done by Roberto Raggi
Change-Id: I4fdad6d27aaa997e651f2d08de36fe675fc78814
Reviewed-on: http://codereview.qt.nokia.com/2778
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com>
-rw-r--r-- | src/libs/3rdparty/cplusplus/Bind.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/libs/3rdparty/cplusplus/Bind.cpp b/src/libs/3rdparty/cplusplus/Bind.cpp index e018b40e55..12f42a6d05 100644 --- a/src/libs/3rdparty/cplusplus/Bind.cpp +++ b/src/libs/3rdparty/cplusplus/Bind.cpp @@ -2771,6 +2771,21 @@ bool Bind::visit(ClassSpecifierAST *ast) startScopeOffset = tokenAt(q->unqualified_name->lastToken() - 1).end(); // at the end of the unqualified name } } + + // get the unqualified class name + const QualifiedNameId *q = className->asQualifiedNameId(); + const Name *unqualifiedClassName = q ? q->name() : className; + + if (! unqualifiedClassName) // paranoia check + className = 0; + else if (! (unqualifiedClassName->isNameId() || unqualifiedClassName->isTemplateNameId())) { + translationUnit()->error(sourceLocation, "expected a class-name"); + + className = unqualifiedClassName->identifier(); + + if (q && className) + className = control()->qualifiedNameId(q->base(), className); + } } Class *klass = control()->newClass(sourceLocation, className); |