Merge remote-tracking branch 'origin/2.5'

This commit is contained in:
Eike Ziller
2012-06-11 16:39:38 +02:00
13 changed files with 35 additions and 51 deletions

View File

@@ -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) {

View File

@@ -274,6 +274,8 @@ protected:
private:
static const int kMaxDepth;
void ensureValidClassName(const Name **name, unsigned sourceLocation);
Scope *_scope;
ExpressionTy _expression;
const Name *_name;