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 7a70c5a3079..b9c6f1415e3 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 @@ -30,6 +30,7 @@ import org.eclipse.cdt.core.dom.ast.IProblemBinding; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; +import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; @@ -1824,4 +1825,25 @@ public class AST2TemplateTests extends AST2BaseTest { f1 = (ICPPFunctionTemplate) col.getName(1).resolveBinding(); assertSame( f1, col.getName(10).resolveBinding() ); } + + public void testBug103578() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append("template class A {}; \n"); //$NON-NLS-1$ + buffer.append("int f() { \n"); //$NON-NLS-1$ + buffer.append(" const int local = 10; \n"); //$NON-NLS-1$ + buffer.append(" A broken; \n"); //$NON-NLS-1$ + buffer.append("}; \n"); //$NON-NLS-1$ + + IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP, true, true ); + CPPNameCollector col = new CPPNameCollector(); + tu.accept( col ); + + ICPPClassTemplate A = (ICPPClassTemplate) col.getName(2).resolveBinding(); + IVariable local = (IVariable) col.getName(4).resolveBinding(); + + ICPPClassType a = (ICPPClassType) col.getName(5).resolveBinding(); + assertTrue( a instanceof ICPPTemplateInstance ); + assertSame( ((ICPPTemplateInstance)a).getTemplateDefinition(), A ); + assertSame( local, col.getName(7).resolveBinding() ); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java index 86f37235a40..12485835daf 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java @@ -1606,6 +1606,13 @@ public class CPPVisitor { } catch (DOMException e) { type = e.getProblem(); } + } else if( binding instanceof IVariable ){ + //this is to help with the ambiguity between typeid & idexpression in template arguments + try { + type = ((IVariable)binding).getType(); + } catch (DOMException e) { + type = e.getProblem(); + } } } return type; diff --git a/core/org.eclipse.cdt.ui/plugin.xml b/core/org.eclipse.cdt.ui/plugin.xml index 1f9524fac7c..3966c002ef1 100644 --- a/core/org.eclipse.cdt.ui/plugin.xml +++ b/core/org.eclipse.cdt.ui/plugin.xml @@ -1339,13 +1339,13 @@ - + +