forked from qt-creator/qt-creator
Merge remote-tracking branch 'origin/2.5'
This commit is contained in:
35
src/libs/3rdparty/cplusplus/Bind.cpp
vendored
35
src/libs/3rdparty/cplusplus/Bind.cpp
vendored
@@ -1851,6 +1851,8 @@ bool Bind::visit(SimpleDeclarationAST *ast)
|
||||
name = elabTypeSpec->name->name;
|
||||
}
|
||||
|
||||
ensureValidClassName(&name, sourceLocation);
|
||||
|
||||
ForwardClassDeclaration *decl = control()->newForwardClassDeclaration(sourceLocation, name);
|
||||
setDeclSpecifiers(decl, type);
|
||||
_scope->addMember(decl);
|
||||
@@ -2894,20 +2896,7 @@ bool Bind::visit(ClassSpecifierAST *ast)
|
||||
}
|
||||
}
|
||||
|
||||
// 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);
|
||||
}
|
||||
ensureValidClassName(&className, sourceLocation);
|
||||
}
|
||||
|
||||
Class *klass = control()->newClass(sourceLocation, className);
|
||||
@@ -3136,6 +3125,24 @@ bool Bind::visit(ArrayDeclaratorAST *ast)
|
||||
return false;
|
||||
}
|
||||
|
||||
void Bind::ensureValidClassName(const Name **name, unsigned sourceLocation)
|
||||
{
|
||||
if (!*name)
|
||||
return;
|
||||
|
||||
const QualifiedNameId *qName = (*name)->asQualifiedNameId();
|
||||
if (qName)
|
||||
*name = qName->name();
|
||||
|
||||
if (!(*name)->isNameId() && !(*name)->isTemplateNameId()) {
|
||||
translationUnit()->error(sourceLocation, "expected a class-name");
|
||||
|
||||
*name = (*name)->identifier();
|
||||
if (qName)
|
||||
*name = control()->qualifiedNameId(qName->base(), *name);
|
||||
}
|
||||
}
|
||||
|
||||
int Bind::visibilityForAccessSpecifier(int tokenKind)
|
||||
{
|
||||
switch (tokenKind) {
|
||||
|
2
src/libs/3rdparty/cplusplus/Bind.h
vendored
2
src/libs/3rdparty/cplusplus/Bind.h
vendored
@@ -274,6 +274,8 @@ protected:
|
||||
private:
|
||||
static const int kMaxDepth;
|
||||
|
||||
void ensureValidClassName(const Name **name, unsigned sourceLocation);
|
||||
|
||||
Scope *_scope;
|
||||
ExpressionTy _expression;
|
||||
const Name *_name;
|
||||
|
Reference in New Issue
Block a user