diff options
author | Andrew Niefer | 2005-11-25 02:02:01 +0000 |
---|---|---|
committer | Andrew Niefer | 2005-11-25 02:02:01 +0000 |
commit | 4fa15e42ed6103a0001d2289f3bf4591bfb8a0cf (patch) | |
tree | 5cb2a697a8d6093e969913132026c2a455228cfc | |
parent | bdd3de47b72d83b7e01c4f5968ebc0497fdba872 (diff) | |
download | org.eclipse.cdt-4fa15e42ed6103a0001d2289f3bf4591bfb8a0cf.tar.gz org.eclipse.cdt-4fa15e42ed6103a0001d2289f3bf4591bfb8a0cf.tar.xz org.eclipse.cdt-4fa15e42ed6103a0001d2289f3bf4591bfb8a0cf.zip |
fix bug 105769
3 files changed, 23 insertions, 1 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 966ab3f9599..6114abc7f99 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 @@ -1924,4 +1924,22 @@ public class AST2TemplateTests extends AST2BaseTest { assertTrue( A instanceof ICPPTemplateInstance ); assertSame( ((ICPPTemplateInstance)A).getTemplateDefinition(), Aspec); } + + public void testBug105769() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append("template< class T > class A : public T {}; \n"); //$NON-NLS-1$ + buffer.append("class C { public: int c; }; \n"); //$NON-NLS-1$ + buffer.append("class B : public A<C> { }; \n"); //$NON-NLS-1$ + buffer.append("void main(){ \n"); //$NON-NLS-1$ + buffer.append(" B k; \n"); //$NON-NLS-1$ + buffer.append(" k.c; \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 ); + + ICPPVariable c = (ICPPVariable) col.getName(13).resolveBinding(); + assertSame( c, col.getName(4).resolveBinding() ); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java index 5cd9fcb37ff..6e6b1c52079 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java @@ -26,6 +26,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.parser.util.ObjectMap; /** @@ -173,6 +174,8 @@ public class CPPDeferredClassInstance extends CPPInstance implements ICPPClassTy return (typeClass == classTemplate ); } else if( type instanceof ICPPClassTemplate && classTemplate == type ){ return true; + } else if( type instanceof ICPPTemplateInstance && ((ICPPTemplateInstance)type).getTemplateDefinition() == classTemplate ){ + return true; } return false; } 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 ef1ddf750d6..3870f225d41 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 @@ -74,6 +74,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.ObjectMap; @@ -228,7 +229,7 @@ public class CPPTemplates { //a reference: class or function template? IBinding template = null; - if( parent instanceof ICPPASTNamedTypeSpecifier || segment == 0 ){ + if( parent instanceof ICPPASTNamedTypeSpecifier || parent instanceof ICPPASTBaseSpecifier || segment == 0 ){ //class template IASTName templateName = id.getTemplateName(); template = templateName.resolveBinding(); |