From 61132f260c029c868e1971771424c62f36cef638 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Tue, 16 Mar 2010 16:38:02 +0100 Subject: Fixed Q_ENUMS/Q_FLAGS parsing of enum names. --- src/shared/cplusplus/CheckDeclaration.cpp | 41 ++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 4 deletions(-) (limited to 'src/shared/cplusplus/CheckDeclaration.cpp') diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp index efd87f7cc0..828ec6d381 100644 --- a/src/shared/cplusplus/CheckDeclaration.cpp +++ b/src/shared/cplusplus/CheckDeclaration.cpp @@ -805,15 +805,13 @@ bool CheckDeclaration::visit(ObjCPropertyDeclarationAST *ast) bool CheckDeclaration::visit(QtEnumDeclarationAST *ast) { - for (NameListAST *iter = ast->enumerator_list; iter; iter = iter->next) - semantic()->check(iter->value, _scope); + checkQEnumsQFlagsNames(ast->enumerator_list, "Q_ENUMS"); return false; } bool CheckDeclaration::visit(QtFlagsDeclarationAST *ast) { - for (NameListAST *iter = ast->flag_enums_list; iter; iter = iter->next) - semantic()->check(iter->value, _scope); + checkQEnumsQFlagsNames(ast->flag_enums_list, "Q_FLAGS"); return false; } @@ -830,3 +828,38 @@ bool CheckDeclaration::visit(QtPropertyDeclarationAST *ast) } return false; } + +void CheckDeclaration::checkQEnumsQFlagsNames(NameListAST *nameListAst, + const char *declName) +{ + for (NameListAST *iter = nameListAst; iter; iter = iter->next) { + if (!iter) + continue; + + const Name *name = semantic()->check(iter->value, _scope); + if (!name) + continue; + + if (name->isNameId()) + continue; + + 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); + } + } + } + } +} -- cgit v1.2.1