From adfdb51660f3d4251101283efa46b6617cbe43d4 Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Mon, 12 Jul 2010 13:41:54 +0200 Subject: Recursive definition of CPlusPlus::QualifiedNameId. Done-with: Erik Verbruggen --- src/shared/cplusplus/CheckDeclaration.cpp | 46 ++++++++++++++----------------- 1 file changed, 21 insertions(+), 25 deletions(-) (limited to 'src/shared/cplusplus/CheckDeclaration.cpp') diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp index d38aa0eeee..f320296d28 100644 --- a/src/shared/cplusplus/CheckDeclaration.cpp +++ b/src/shared/cplusplus/CheckDeclaration.cpp @@ -870,35 +870,31 @@ bool CheckDeclaration::visit(QtPropertyDeclarationAST *ast) return false; } -void CheckDeclaration::checkQEnumsQFlagsNames(NameListAST *nameListAst, - const char *declName) +static bool checkEnumName(const Name *name) { - for (NameListAST *iter = nameListAst; iter; iter = iter->next) { + if (! name) + return false; - const Name *name = semantic()->check(iter->value, _scope); - if (!name) - continue; + else if (name->asNameId() != 0) + return true; - if (name->isNameId()) - continue; + else if (const QualifiedNameId *q = name->asQualifiedNameId()) { + if (! q->base()) + return false; // global qualified name - const QualifiedNameId *qName = name->asQualifiedNameId(); - if (!qName) - translationUnit()->error(iter->firstToken(), "invalid name in %s", - declName); - else if (qName->isGlobal()) - translationUnit()->error(iter->firstToken(), - "invalid name '%s' in %s", - qName->identifier()->chars(), declName); - else { - for (unsigned i = 0; i < qName->nameCount(); ++i) { - const Name *namePart = qName->nameAt(i); - if (!namePart || !namePart->isNameId()) { - translationUnit()->error(iter->firstToken(), - "invalid name '%s' in %s", - qName->identifier()->chars(), declName); - } - } + if (checkEnumName(q->base()) && checkEnumName(q->name())) + return true; + } + + return false; +} + +void CheckDeclaration::checkQEnumsQFlagsNames(NameListAST *nameListAst, const char *declName) +{ + for (NameListAST *iter = nameListAst; iter; iter = iter->next) { + if (const Name *name = semantic()->check(iter->value, _scope)) { + if (! checkEnumName(name)) + translationUnit()->error(iter->firstToken(), "invalid name in %s", declName); } } } -- cgit v1.2.1