diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseProblemTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseProblemTest.java index a53f240a79d..9836c51b4ce 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseProblemTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseProblemTest.java @@ -115,4 +115,25 @@ public class CompleteParseProblemTest extends CompleteParseBaseTest { IASTFunction f = (IASTFunction) i.next(); IASTVariable varI = (IASTVariable) i.next(); } + + public void testBug69745() throws Exception + { + StringBuffer buffer = new StringBuffer(); + buffer.append( "namespace NS{ template < class T > int foo(){}; } \n" ); //$NON-NLS-1$ + buffer.append( "void f() { using NS::foo; using NS::foo; } \n" ); //$NON-NLS-1$ + + String code = buffer.toString(); + + parse( code, false ); + + int start = code.indexOf( "using NS::foo;" ); //$NON-NLS-1$ + int end = start + "using NS::foo;".length(); //$NON-NLS-1$ + + assertEquals( callback.problems.size(), 1 ); + IProblem p = (IProblem) callback.problems.get( 0 ); + + assertEquals( p.getSourceStart(), start ); + assertEquals( p.getSourceEnd(), end ); + assertEquals( p.getID(), IProblem.SEMANTIC_INVALID_USING ); + } } 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 bafd3eb810e..8d1fb25d917 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 @@ -367,7 +367,10 @@ public abstract class Parser extends ExpressionParser implements IParser catch (Exception e1) { logException( "usingClause:createUsingDeclaration", e1 ); //$NON-NLS-1$ - throwBacktrack(firstToken.getOffset(), last.getEndOffset(), firstToken.getLineNumber()); + if( e1 instanceof ASTSemanticException && ((ASTSemanticException)e1).getProblem() != null ) + throwBacktrack(((ASTSemanticException)e1).getProblem()); + else + throwBacktrack(firstToken.getOffset(), last.getEndOffset(), firstToken.getLineNumber()); } declaration.acceptElement( requestor, astFactory.getReferenceManager() ); setCompletionValues(scope, getCompletionKindForDeclaration(scope, null), KeywordSetKey.DECLARATION ); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java index d998b5ec73a..8988d6b1a11 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java @@ -1547,7 +1547,7 @@ public class ParserSymbolTable { boolean okToAdd = false; //7.3.3-5 A using-declaration shall not name a template-id - if( obj.isTemplateMember() && obj.getContainingSymbol().isType( ITypeInfo.t_template ) ){ + if( obj.isTemplateInstance() && obj.getInstantiatedSymbol().getContainingSymbol().isType( ITypeInfo.t_template ) ){ okToAdd = false; } //7.3.3-4