From 4dfe0944bc6a1ef309c72ae14c8d91f29179f292 Mon Sep 17 00:00:00 2001 From: Andrew Niefer Date: Tue, 21 Jun 2005 15:41:49 +0000 Subject: [PATCH] fix ClassCastExceptions found with bug 90678 --- .../parser/tests/ast2/AST2TemplateTests.java | 33 +++++++++++++++++++ .../core/dom/parser/cpp/CPPClassTemplate.java | 10 +++++- .../dom/parser/cpp/CPPTemplateDefinition.java | 3 ++ 3 files changed, 45 insertions(+), 1 deletion(-) 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 58564d0aa21..35908507e7b 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 @@ -1763,4 +1763,37 @@ public class AST2TemplateTests extends AST2BaseTest { assertTrue( ns[1] instanceof ICPPASTTemplateId ); assertEquals( ((ICPPASTTemplateId)ns[1]).toString(), "B" ); } + + public void testBug90678() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append("template struct A{ \n"); + buffer.append(" class C { \n"); + buffer.append(" template struct B {}; \n"); + buffer.append(" }; \n"); + buffer.append("}; \n"); + buffer.append("template template \n"); + buffer.append("struct A::C::B{}; \n"); + buffer.append("A::C::B ab; \n"); + + IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + CPPNameCollector col = new CPPNameCollector(); + tu.accept( col ); + + ICPPTemplateParameter T = (ICPPTemplateParameter) col.getName(0).resolveBinding(); + ICPPTemplateParameter T2 = (ICPPTemplateParameter) col.getName(3).resolveBinding(); + + ICPPClassTemplate B = (ICPPClassTemplate) col.getName(4).resolveBinding(); + + assertSame( T, col.getName(5).resolveBinding() ); + assertSame( T2, col.getName(6).resolveBinding() ); + assertSame( T, col.getName(10).resolveBinding() ); + assertSame( T2, col.getName(14).resolveBinding() ); + + ICPPClassTemplatePartialSpecialization spec = (ICPPClassTemplatePartialSpecialization) col.getName(12).resolveBinding(); + assertSame( spec.getPrimaryClassTemplate(), B ); + + ICPPClassType BI = (ICPPClassType) col.getName(19).resolveBinding(); + assertTrue( BI instanceof ICPPTemplateInstance ); + assertSame( ((ICPPTemplateInstance)BI).getSpecializedBinding(), spec ); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java index 0295cd386be..475269e167d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java @@ -109,6 +109,10 @@ public class CPPClassTemplate extends CPPTemplateDefinition implements { IBinding binding = name.resolveBinding(); if( binding == CPPClassTemplate.this ){ + if( name instanceof ICPPASTQualifiedName ){ + IASTName [] ns = ((ICPPASTQualifiedName)name).getNames(); + name = ns[ ns.length - 1 ]; + } result = name; return PROCESS_ABORT; } @@ -164,7 +168,11 @@ public class CPPClassTemplate extends CPPTemplateDefinition implements private ICPPASTCompositeTypeSpecifier getCompositeTypeSpecifier(){ if( definition != null ){ - return (ICPPASTCompositeTypeSpecifier) definition.getParent(); + IASTNode node = definition.getParent(); + if( node instanceof ICPPASTQualifiedName ) + node = node.getParent(); + if( node instanceof ICPPASTCompositeTypeSpecifier ) + return (ICPPASTCompositeTypeSpecifier) node; } return null; } 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 ab840a479a2..253b1d4e4a0 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 @@ -78,6 +78,9 @@ public abstract class CPPTemplateDefinition implements ICPPTemplateDefinition, I public CPPTemplateDefinition( IASTName name ) { if( name != null ){ ASTNodeProperty prop = name.getPropertyInParent(); + if( prop == ICPPASTQualifiedName.SEGMENT_NAME ){ + prop = name.getParent().getPropertyInParent(); + } if( prop == IASTCompositeTypeSpecifier.TYPE_NAME ){ definition = name; } else if( prop == IASTElaboratedTypeSpecifier.TYPE_NAME ) {