From 3d06ebc729dbae7f8bf0e9359e1176b7c12e4faa Mon Sep 17 00:00:00 2001 From: Andrew Niefer Date: Thu, 11 Jan 2007 03:22:56 +0000 Subject: [PATCH] bug 169628 --- .../core/parser/tests/ast2/AST2TemplateTests.java | 12 ++++++++++++ .../internal/core/dom/parser/cpp/CPPTemplates.java | 11 ++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) 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 3839c63e6fb..f867aba675c 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 @@ -1986,4 +1986,16 @@ public class AST2TemplateTests extends AST2BaseTest { assertSame(blah, col.getName(15).resolveBinding()); assertSame(c2, col.getName(16).resolveBinding()); } + + public void testBug169628() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append("template< class T > class C {}; \n"); //$NON-NLS-1$ + buffer.append("typedef struct C CInt; \n"); //$NON-NLS-1$ + + IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP, true, true ); + CPPNameCollector col = new CPPNameCollector(); + tu.accept( col ); + + assertTrue( col.getName(2).resolveBinding() instanceof ICPPSpecialization ); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplates.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplates.java index e24f9b71e9c..d133f515765 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplates.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplates.java @@ -220,8 +220,9 @@ public class CPPTemplates { parent instanceof ICPPASTElaboratedTypeSpecifier && segment != 0 ) { return createClassExplicitInstantiation( (ICPPASTElaboratedTypeSpecifier) parent ); - } else if( (parent instanceof ICPPASTElaboratedTypeSpecifier || - parent instanceof ICPPASTCompositeTypeSpecifier ) && segment != 0 ){ + } else if( ( (parent instanceof ICPPASTElaboratedTypeSpecifier && decl instanceof ICPPASTTemplateDeclaration) || + parent instanceof ICPPASTCompositeTypeSpecifier ) + && segment != 0 ){ return createClassSpecialization( (ICPPASTDeclSpecifier) parent ); } else if( parent instanceof ICPPASTFunctionDeclarator && segment != 0 ){ return createFunctionSpecialization( id ); @@ -229,7 +230,11 @@ public class CPPTemplates { //a reference: class or function template? IBinding template = null; - if( parent instanceof ICPPASTNamedTypeSpecifier || parent instanceof ICPPASTBaseSpecifier || segment == 0 ){ + if( parent instanceof ICPPASTNamedTypeSpecifier || + parent instanceof ICPPASTElaboratedTypeSpecifier || + parent instanceof ICPPASTBaseSpecifier || + segment == 0 ) + { //class template IASTName templateName = id.getTemplateName(); template = templateName.resolveBinding();