aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLeandro Melo <leandro.melo@nokia.com>2011-08-09 13:46:28 +0200
committerLeandro T. C. Melo <leandro.melo@nokia.com>2011-08-09 14:11:28 +0200
commitfb550c4ff1d29126fcc3c0390d7768c41b33c573 (patch)
tree8cfc2c258732dd5e41e74542de97bb32032f179e
parenta9c0d4453e07c8d8c1d85209109501f644f6fc89 (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.cpp15
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);