From 9016a57d56dee959e2dd3ea11e2d8dfadde71ce2 Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Mon, 5 Nov 2012 14:55:59 -0800 Subject: [PATCH] Bug 393513. Graceful handling of ambiguous template arguments. --- .../core/dom/parser/cpp/CPPASTFieldReference.java | 7 ++++++- .../core/dom/parser/cpp/semantics/CPPTemplates.java | 6 +++++- .../core/dom/parser/cpp/semantics/EvalID.java | 6 +++++- .../core/dom/parser/cpp/semantics/LookupData.java | 12 +++++++++--- 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFieldReference.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFieldReference.java index c2fb4dcb4b2..827e8d992c7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFieldReference.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFieldReference.java @@ -19,6 +19,7 @@ import java.util.ArrayList; import java.util.List; import org.eclipse.cdt.core.dom.ast.ASTVisitor; +import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTImplicitName; import org.eclipse.cdt.core.dom.ast.IASTName; @@ -276,7 +277,11 @@ public class CPPASTFieldReference extends ASTNode n= ns[ns.length - 1]; } if (n instanceof ICPPASTTemplateId) { - args= CPPTemplates.createTemplateArgumentArray((ICPPASTTemplateId) n); + try { + args= CPPTemplates.createTemplateArgumentArray((ICPPASTTemplateId) n); + } catch (DOMException e) { + return EvalFixed.INCOMPLETE; + } } return new EvalID(ownerEval, qualifier, name.getSimpleID(), false, true, args); } 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 878ca093ec2..bbb9dba7141 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 @@ -50,6 +50,7 @@ import org.eclipse.cdt.core.dom.ast.ISemanticProblem; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.IValue; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTAmbiguousTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeclSpecifier; @@ -1669,7 +1670,7 @@ public class CPPTemplates { * @return an array of template arguments, currently modeled as IType objects. * The empty ICPPTemplateArgument array is returned if id is {@code null} */ - public static ICPPTemplateArgument[] createTemplateArgumentArray(ICPPASTTemplateId id) { + public static ICPPTemplateArgument[] createTemplateArgumentArray(ICPPASTTemplateId id) throws DOMException { ICPPTemplateArgument[] result= ICPPTemplateArgument.EMPTY_ARGUMENTS; if (id != null) { IASTNode[] args= id.getTemplateArguments(); @@ -1681,6 +1682,9 @@ public class CPPTemplates { } else if (arg instanceof ICPPASTExpression) { ICPPASTExpression expr= (ICPPASTExpression) arg; result[i]= new CPPTemplateNonTypeArgument(expr.getEvaluation(), expr); + } else if (arg instanceof ICPPASTAmbiguousTemplateArgument) { + IProblemBinding problem = new ProblemBinding(id, IProblemBinding.SEMANTIC_INVALID_TEMPLATE_ARGUMENTS); + throw new DOMException(problem); } else { throw new IllegalArgumentException("Unexpected type: " + arg.getClass().getName()); //$NON-NLS-1$ } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalID.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalID.java index d47fbbb1270..2c3cc53bf77 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalID.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalID.java @@ -196,7 +196,11 @@ public class EvalID extends CPPEvaluation { ICPPTemplateArgument[] templateArgs = null; final IASTName lastName = name.getLastName(); if (lastName instanceof ICPPASTTemplateId) { - templateArgs= CPPTemplates.createTemplateArgumentArray((ICPPASTTemplateId) lastName); + try { + templateArgs= CPPTemplates.createTemplateArgumentArray((ICPPASTTemplateId) lastName); + } catch (DOMException e) { + return EvalFixed.INCOMPLETE; + } } return new EvalID(fieldOwner, owner, name.getSimpleID(), isAddressOf(expr), name instanceof ICPPASTQualifiedName, templateArgs); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java index fd7005e882b..abf0cde7259 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java @@ -20,7 +20,9 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; +import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.IASTDeclaration; @@ -116,11 +118,15 @@ public class LookupData extends ScopeLookupData { if (n == null) throw new IllegalArgumentException(); + ICPPTemplateArgument[] args = null; if (n instanceof ICPPASTTemplateId) { - fTemplateArguments= CPPTemplates.createTemplateArgumentArray((ICPPASTTemplateId) n); - } else { - fTemplateArguments= null; + try { + args= CPPTemplates.createTemplateArgumentArray((ICPPASTTemplateId) n); + } catch (DOMException e) { + CCorePlugin.log(e); + } } + fTemplateArguments= args; configureWith(n); }