diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java index a9404b9f3c7..d4c650977cd 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java @@ -58,6 +58,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPReferenceType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; @@ -3039,4 +3040,57 @@ public class AST2TemplateTests extends AST2BaseTest { BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true); ba.assertNonProblem("foo();", 3); } + + // namespace result_of { + // template + // struct find; + // + // template + // struct find { + // typedef + // detail::static_seq_find_if< + // typename result_of::begin::type + // , typename result_of::end::type + // , is_same + // > + // filter; + // }; + // + // template + // struct find { + // typedef detail::assoc_find filter; + // }; + // } + public void testBug238180_ArrayOutOfBounds() throws Exception { + // the code above used to trigger an ArrayOutOfBoundsException + parse(getAboveComment(), ParserLanguage.CPP); + } + + // namespace detail { + // template + // struct str; + // template + // struct str { + // typedef + // detail::return_type_deduction_failure type; + // // ambiguous type in conditional expression + // }; + // template + // struct str { + // typedef A type; + // }; + // } // detail + public void testBug238180_ClassCast() throws Exception { + // the code above used to trigger a ClassCastException + BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true); + String tmplId= "str"; + ICPPClassType p= ba.assertNonProblem(tmplId, tmplId.length(), ICPPClassType.class); + ICPPConstructor con= p.getConstructors()[1]; + ICPPReferenceType reftype= (ICPPReferenceType) con.getType().getParameterTypes()[0]; + IQualifierType qt= (IQualifierType) reftype.getType(); + ICPPDeferredClassInstance dcl= (ICPPDeferredClassInstance) qt.getType(); + ICPPClassTemplatePartialSpecialization spec= (ICPPClassTemplatePartialSpecialization) dcl.getSpecializedBinding(); + ICPPTemplateTypeParameter tp= (ICPPTemplateTypeParameter) spec.getTemplateParameters()[0]; + assertNull(tp.getDefault()); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplatePartialSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplatePartialSpecialization.java index e34b00991c8..feea318e68b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplatePartialSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplatePartialSpecialization.java @@ -67,6 +67,9 @@ public class CPPClassTemplatePartialSpecialization extends CPPClassTemplate impl } ObjectMap argMap= CPPTemplates.deduceTemplateArguments(getArguments(), args, true); + if (argMap == null) + return null; + if (CPPTemplates.containsDependentArg(argMap)) { return deferredInstance(argMap, args); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java index 4029991dd8b..e7a9dda0bab 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java @@ -136,7 +136,7 @@ abstract public class CPPScope implements ICPPScope, IASTInternalScope { IBinding binding= getBindingInAST(name, forceResolve); if (binding == null && forceResolve) { final IASTTranslationUnit tu = name.getTranslationUnit(); - IIndex index = tu.getIndex(); + IIndex index = tu == null ? null : tu.getIndex(); if (index != null) { // Try looking this up in the PDOM if (physicalNode instanceof IASTTranslationUnit) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateDefinition.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateDefinition.java index 18f8b0f6eec..d56d10d43b0 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateDefinition.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateDefinition.java @@ -356,7 +356,8 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC ICPPASTTemplateParameter[] ops = origTemplate.getTemplateParameters(); ICPPASTTemplateParameter[] nps = newTemplate.getTemplateParameters(); ICPPInternalBinding temp = null; - for (int i = 0; i < nps.length; i++) { + int end= Math.min(ops.length, nps.length); + for (int i = 0; i < end; i++) { temp = (ICPPInternalBinding) CPPTemplates.getTemplateParameterName(ops[i]).getBinding(); if (temp != null) { IASTName n = CPPTemplates.getTemplateParameterName(nps[i]); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java index 16e1e7868b4..2ee72a16306 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java @@ -95,6 +95,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBlockScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance; @@ -1508,23 +1509,25 @@ public class CPPSemantics { if (bindings == null || bindings.length == 0) { return null; } else if (bindings.length == 1) { -// if (bindings[0] instanceof IBinding) -// return (IBinding) bindings[0]; -// else if (bindings[0] instanceof IASTName && ((IASTName) bindings[0]).getBinding() != null) -// return ((IASTName) bindings[0]).getBinding(); - IBinding candidate= null; if (bindings[0] instanceof IBinding) { candidate= (IBinding) bindings[0]; } else if (bindings[0] instanceof IASTName) { candidate= ((IASTName) bindings[0]).getBinding(); + } else { + return null; } if (candidate != null) { - if (candidate instanceof IType == false && candidate instanceof ICPPNamespace == false - && LookupData.typesOnly(name)) { + if (candidate instanceof IType == false && candidate instanceof ICPPNamespace == false + && LookupData.typesOnly(name)) { return null; - } - return candidate; + } + + // bug 238180 + if (candidate instanceof ICPPClassTemplatePartialSpecialization) + return null; + + return candidate; } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/AbstractIndexerTask.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/AbstractIndexerTask.java index 009456437a2..7af23d4cde9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/AbstractIndexerTask.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/AbstractIndexerTask.java @@ -606,6 +606,11 @@ public abstract class AbstractIndexerTask extends PDOMWriter { th= e; } catch (StackOverflowError e) { th= e; + } catch (Error e) { + try { + swallowError(path, e); + } catch (Throwable ignore) {} + throw e; } if (th != null) { swallowError(path, th); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecialization.java index 3b006228097..71a3846eb50 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecialization.java @@ -177,6 +177,8 @@ class PDOMCPPClassTemplatePartialSpecialization extends } ObjectMap argMap= CPPTemplates.deduceTemplateArguments(getArguments(), args, true); + if (argMap == null) + return null; if (CPPTemplates.containsDependentArg(argMap)) { return deferredInstance(argMap, args); }