From 47a208f1d467026f5f0217703c0209b71bf24306 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Tue, 20 May 2008 16:14:35 +0000 Subject: [PATCH] Fix potential NPE. --- .../core/dom/parser/ASTAmbiguousNode.java | 5 +++-- .../dom/parser/cpp/CPPDeferredClassInstance.java | 6 +++--- .../dom/parser/cpp/semantics/CPPTemplates.java | 16 +++++++++++----- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTAmbiguousNode.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTAmbiguousNode.java index d13e58ccca2..b7102197929 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTAmbiguousNode.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTAmbiguousNode.java @@ -70,8 +70,9 @@ public abstract class ASTAmbiguousNode extends ASTNode { int minIssues = Integer.MAX_VALUE; for (IASTNode alternative : alternatives) { - // flush scope, if this is not the first alternative - if (nodeToReplace != this && scope instanceof IASTInternalScope) { + // flush scope, even if this is the first alternative. The ambiguous node may have contributed an + // invalid binding to the scope during the resolution of other ambiguous nodes. + if (scope instanceof IASTInternalScope) { try { ((IASTInternalScope) scope).flushCache(); } catch (DOMException e) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java index b87f9cb5308..40fd7b30665 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java @@ -31,9 +31,9 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; */ public class CPPDeferredClassInstance extends CPPUnknownClass implements ICPPDeferredClassInstance { - private IType[] fArguments; - private ObjectMap fArgmap; - private ICPPClassTemplate fClassTemplate; + private final IType[] fArguments; + private final ObjectMap fArgmap; + private final ICPPClassTemplate fClassTemplate; public CPPDeferredClassInstance(ICPPClassTemplate orig, ObjectMap argMap, IType[] arguments) { super(orig); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java index 05c62e9dd1d..4fe8c51e5cb 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java @@ -1086,15 +1086,21 @@ public class CPPTemplates { IType[] result = new IType[params.length]; for (int i = 0; i < params.length; i++) { - if (params[i] instanceof IASTNode) { - result[i] = CPPVisitor.createType((IASTNode) params[i]); - } else if (params[i] instanceof IParameter) { + IType type= null; + final Object param = params[i]; + if (param instanceof IASTNode) { + type= CPPVisitor.createType((IASTNode) param); + } else if (param instanceof IParameter) { try { - result[i] = ((IParameter) params[i]).getType(); + type= ((IParameter) param).getType(); } catch (DOMException e) { - result[i] = e.getProblem(); + type= e.getProblem(); } } + // prevent null pointer exception when the type cannot be determined + // happens when templates with still ambiguous template-ids are accessed during + // resolution of other ambiguities. + result[i]= type == null ? new CPPBasicType(-1, 0) : type; } return result; }