From ca93e4ae7ecba6d2be10da3a30216c0aa73c088e Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Tue, 20 Jul 2010 09:18:54 +0000 Subject: [PATCH] Bug 319498: Comparison of unknown bindings. --- .../index/tests/IndexCPPTemplateResolutionTest.java | 2 +- .../internal/core/dom/parser/cpp/semantics/CPPVisitor.java | 4 +++- .../core/pdom/dom/cpp/PDOMCPPUnknownClassInstance.java | 6 ++++-- .../internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java | 6 ++++-- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java index ad37f5f5173..4e15f7cef25 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java @@ -975,7 +975,7 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa // int b; // func(a, b); // } - public void _testFunctionTemplate_319498() throws Exception { + public void testFunctionTemplate_319498() throws Exception { ICPPFunction f= getBindingFromASTName("func(a, b)", 4, ICPPFunction.class); assertInstance(f, ICPPTemplateInstance.class); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java index 0451e72fb04..6efcb99c90d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java @@ -1052,7 +1052,9 @@ public class CPPVisitor extends ASTQueries { if (data != null) { data.usesEnclosingScope= false; } - IBinding binding = names[i - 1].resolveBinding(); + // For template functions we may need to resolve a template parameter + // as a parent of an unknown type used as parameter type. + IBinding binding = names[i - 1].resolvePreBinding(); while (binding instanceof ITypedef) { IType t = ((ITypedef) binding).getType(); if (t instanceof IBinding) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassInstance.java index 8fb6a0baa87..a3f45a15ccc 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassInstance.java @@ -80,8 +80,10 @@ class PDOMCPPUnknownClassInstance extends PDOMCPPUnknownClassType implements ICP if (type instanceof PDOMNode) { PDOMNode node= (PDOMNode) type; - if (node.getPDOM() == getPDOM()) { - return node.getRecord() == getRecord(); + // Different PDOM bindings may result in equal types if a parent + // turns out to be a template parameter. + if (node.getPDOM() == getPDOM() && node.getRecord() == getRecord()) { + return true; } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java index 6ca74fbd2e2..9990e0d030c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java @@ -235,8 +235,10 @@ class PDOMCPPUnknownClassType extends PDOMCPPUnknownBinding implements ICPPClass if (type instanceof PDOMNode) { PDOMNode node= (PDOMNode) type; - if (node.getPDOM() == getPDOM()) { - return node.getRecord() == getRecord(); + // Different PDOM bindings may result in equal types if a parent + // turns out to be a template parameter. + if (node.getPDOM() == getPDOM() && node.getRecord() == getRecord()) { + return true; } }