diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/SelectionParseTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/SelectionParseTest.java index 419220ca730..b4aad1f0213 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/SelectionParseTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/SelectionParseTest.java @@ -478,5 +478,25 @@ public class SelectionParseTest extends SelectionParseBaseTest { assertTrue( node instanceof IASTClassSpecifier ); assertEquals( ((IASTClassSpecifier)node).getName(), "A" ); //$NON-NLS-1$ } + + public void testBug72814() throws Exception{ + Writer writer = new StringWriter(); + writer.write( "namespace N{ \n"); //$NON-NLS-1$ + writer.write( " template < class T > class AAA { T _t };\n"); //$NON-NLS-1$ + writer.write( "} \n"); //$NON-NLS-1$ + writer.write( "N::AAA a; \n"); //$NON-NLS-1$ + + String code = writer.toString(); + int startIndex = code.indexOf( "AAA" ); //$NON-NLS-1$ + IASTNode node = parse( code, startIndex, startIndex + 3 ); + + assertTrue( node instanceof IASTClassSpecifier ); + assertEquals( ((IASTClassSpecifier)node).getName(), "AAA" ); //$NON-NLS-1$ + + node = parse( code, startIndex, startIndex + 8 ); + + assertTrue( node instanceof IASTClassSpecifier ); + assertEquals( ((IASTClassSpecifier)node).getName(), "AAA" ); //$NON-NLS-1$ + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java index fd6e66d8b08..0039a0d1844 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java @@ -6607,7 +6607,7 @@ public class Parser implements IParserData, IParser // duple is a sub-duple of greaterContextDuple if( duple.getFirstToken().equals( greaterContextDuple.getFirstToken() )) finalDuple = duple; // => do not use greaterContextDuple - else if( duple.getLastToken().equals( greaterContextDuple.getLastToken() )) + else if( duple.getLastSegment().getFirstToken().equals( greaterContextDuple.getLastSegment().getFirstToken() )) finalDuple = greaterContextDuple; // => use greaterContextDuple else throw new ParseError( ParseError.ParseErrorKind.OFFSET_RANGE_NOT_NAME ); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/BasicTokenDuple.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/BasicTokenDuple.java index 025b34c1861..e6caac27111 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/BasicTokenDuple.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/BasicTokenDuple.java @@ -355,6 +355,16 @@ public class BasicTokenDuple implements ITokenDuple { IToken iter = firstToken; while( iter != lastToken) { + if( iter.getType() == IToken.tLT ){ + iter = TokenFactory.consumeTemplateIdArguments( iter, lastToken ); + if( iter.getType() == IToken.tGT ){ + if( iter == lastToken ) break; + iter = iter.getNext(); + continue; + } + continue; + } + if( iter.isOperator() ) { iter = iter.getNext();