C++: Check for Function::name() before using it

Lambdas do not have a name.

Change-Id: Ifda4816c62dcfe19bdbb1649dc1caf408e056b37
Task-number: QTCREATORBUG-12686
Reviewed-by: Daniel Teske <daniel.teske@digia.com>
This commit is contained in:
Nikolai Kosjar
2014-07-17 11:39:16 +02:00
parent 67a7696e60
commit dc59d28736
5 changed files with 59 additions and 54 deletions

View File

@@ -721,7 +721,7 @@ void CreateBindings::lookupInScope(const Name *name, Scope *scope,
continue; // skip using namespace directives continue; // skip using namespace directives
else if (! id->match(s->identifier())) else if (! id->match(s->identifier()))
continue; continue;
else if (s->name()->isQualifiedNameId()) else if (s->name() && s->name()->isQualifiedNameId())
continue; // skip qualified ids. continue; // skip qualified ids.
if (Q_UNLIKELY(debug)) { if (Q_UNLIKELY(debug)) {

View File

@@ -350,7 +350,8 @@ void ResolveExpression::thisObject()
FullySpecifiedType ptrTy(control()->pointerType(classTy)); FullySpecifiedType ptrTy(control()->pointerType(classTy));
addResult(ptrTy, fun->enclosingScope()); addResult(ptrTy, fun->enclosingScope());
break; break;
} else if (const QualifiedNameId *q = fun->name()->asQualifiedNameId()) { } else if (const Name *name = fun->name()) {
if (const QualifiedNameId *q = name->asQualifiedNameId()) {
if (q->base()) { if (q->base()) {
FullySpecifiedType classTy(control()->namedType(q->base())); FullySpecifiedType classTy(control()->namedType(q->base()));
FullySpecifiedType ptrTy(control()->pointerType(classTy)); FullySpecifiedType ptrTy(control()->pointerType(classTy));
@@ -360,6 +361,7 @@ void ResolveExpression::thisObject()
} }
} }
} }
}
} }
bool ResolveExpression::visit(CompoundExpressionAST *ast) bool ResolveExpression::visit(CompoundExpressionAST *ast)

View File

@@ -193,7 +193,7 @@ Class *isMemberFunction(const LookupContext &context, Function *function)
const Name *functionName = function->name(); const Name *functionName = function->name();
if (!functionName) if (!functionName)
return 0; // anonymous function names are not valid c++ return 0;
if (!functionName->isQualifiedNameId()) if (!functionName->isQualifiedNameId())
return 0; // trying to add a declaration for a global function return 0; // trying to add a declaration for a global function
@@ -225,7 +225,7 @@ Namespace *isNamespaceFunction(const LookupContext &context, Function *function)
const Name *functionName = function->name(); const Name *functionName = function->name();
if (!functionName) if (!functionName)
return 0; // anonymous function names are not valid c++ return 0;
// global namespace // global namespace
if (!functionName->isQualifiedNameId()) { if (!functionName->isQualifiedNameId()) {
@@ -4148,7 +4148,7 @@ QString definitionSignature(const CppQuickFixAssistInterface *assist,
oo.showReturnTypes = true; oo.showReturnTypes = true;
oo.showArgumentNames = true; oo.showArgumentNames = true;
const Name *name = func->name(); const Name *name = func->name();
if (nameIncludesOperatorName(name)) { if (name && nameIncludesOperatorName(name)) {
CoreDeclaratorAST *coreDeclarator = functionDefinitionAST->declarator->core_declarator; CoreDeclaratorAST *coreDeclarator = functionDefinitionAST->declarator->core_declarator;
const QString operatorNameText = baseFile->textOf(coreDeclarator); const QString operatorNameText = baseFile->textOf(coreDeclarator);
oo.includeWhiteSpaceInOperatorName = operatorNameText.contains(QLatin1Char(' ')); oo.includeWhiteSpaceInOperatorName = operatorNameText.contains(QLatin1Char(' '));

View File

@@ -278,7 +278,7 @@ void SymbolFinder::findMatchingDeclaration(const LookupContext &context,
const Name *functionName = functionType->name(); const Name *functionName = functionType->name();
if (!functionName) if (!functionName)
return; // anonymous function names are not valid c++ return;
ClassOrNamespace *binding = 0; ClassOrNamespace *binding = 0;
const QualifiedNameId *qName = functionName->asQualifiedNameId(); const QualifiedNameId *qName = functionName->asQualifiedNameId();

View File

@@ -1122,7 +1122,8 @@ void generateAST_cpp(const Snapshot &snapshot, const QDir &cplusplusDir)
TranslationUnitAST *xUnit = AST_cpp_document->translationUnit()->ast()->asTranslationUnit(); TranslationUnitAST *xUnit = AST_cpp_document->translationUnit()->ast()->asTranslationUnit();
for (DeclarationListAST *iter = xUnit->declaration_list; iter; iter = iter->next) { for (DeclarationListAST *iter = xUnit->declaration_list; iter; iter = iter->next) {
if (FunctionDefinitionAST *funDef = iter->value->asFunctionDefinition()) { if (FunctionDefinitionAST *funDef = iter->value->asFunctionDefinition()) {
if (const QualifiedNameId *qName = funDef->symbol->name()->asQualifiedNameId()) { if (const Name *name = funDef->symbol->name()) {
if (const QualifiedNameId *qName = name->asQualifiedNameId()) {
const QString className = oo(qName->base()); const QString className = oo(qName->base());
const QString methodName = oo(qName->name()); const QString methodName = oo(qName->name());
@@ -1173,6 +1174,8 @@ void generateAST_cpp(const Snapshot &snapshot, const QDir &cplusplusDir)
todo.append(info); todo.append(info);
} }
} }
}
} }
} }