diff --git a/core/org.eclipse.cdt.core.tests/ChangeLog b/core/org.eclipse.cdt.core.tests/ChangeLog index b99fe9da7d0..506dcf94e28 100644 --- a/core/org.eclipse.cdt.core.tests/ChangeLog +++ b/core/org.eclipse.cdt.core.tests/ChangeLog @@ -1,3 +1,6 @@ +2004-04-20 Andrew Niefer + added parser/CompleteParseASTTest.testBug59302() + 2004-04-20 Andrew Niefer -added parser/CompleteParseASTTemplateTest.test_14_7_3__11_ExplicitSpecializationArgumentDeduction() -added parser/CompleteParseASTTemplateTest.test_14_8_1__2_ExplicitArgumentSpecification() diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java index af971ec866e..c471f192a0a 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java @@ -1580,4 +1580,22 @@ public class CompleteParseASTTest extends CompleteParseBaseTest IASTSimpleTypeSpecifier simpleTypeSpec = ((IASTSimpleTypeSpecifier)bar.getReturnType().getTypeSpecifier()); assertEquals( simpleTypeSpec.getType(), IASTGCCSimpleTypeSpecifier.Type.TYPEOF ); } + + public void testBug59302() throws Exception + { + Writer writer = new StringWriter(); + writer.write("class A { class N{}; }; "); + writer.write("class B { friend class A::N; }; "); + + Iterator i = parse( writer.toString() ).getDeclarations(); + IASTClassSpecifier A = (IASTClassSpecifier) ((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier(); + IASTClassSpecifier B = (IASTClassSpecifier) ((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier(); + + i = getDeclarations( A ); + IASTClassSpecifier N = (IASTClassSpecifier) ((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier(); + + assertFalse( A.getFriends().hasNext() ); + assertEquals( B.getFriends().next(), N ); + } + } diff --git a/core/org.eclipse.cdt.core/parser/ChangeLog-parser b/core/org.eclipse.cdt.core/parser/ChangeLog-parser index a7fbbe58b49..b7e175ebf7e 100644 --- a/core/org.eclipse.cdt.core/parser/ChangeLog-parser +++ b/core/org.eclipse.cdt.core/parser/ChangeLog-parser @@ -1,3 +1,6 @@ +2004-04-20 Andrew Niefer + fixed https://bugs.eclipse.org/bugs/show_bug.cgi?id=59302 - Nested friend mishandled + 2004-04-20 Andrew Niefer - implement IContainerSymbol.lookupFunctionTemplateId - handle explicit template argument specification diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java index 01f2fc61abf..b15ce6682a6 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java @@ -2863,6 +2863,8 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto public IASTElaboratedTypeSpecifier createElaboratedTypeSpecifier(IASTScope scope, ASTClassKind kind, ITokenDuple name, int startingOffset, int startingLine, int endOffset, int endingLine, boolean isForewardDecl, boolean isFriend) throws ASTSemanticException { IContainerSymbol currentScopeSymbol = scopeToSymbol(scope); + IContainerSymbol originalScope = currentScopeSymbol; + TypeInfo.eType pstType = classKindToTypeInfo(kind); List references = new ArrayList(); IToken nameToken = name.getFirstToken(); @@ -2932,8 +2934,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto checkSymbol.setIsForwardDeclaration(true); try { if (isFriend) { - ((IDerivableContainerSymbol) currentScopeSymbol) - .addFriend(checkSymbol); + ((IDerivableContainerSymbol) originalScope).addFriend(checkSymbol); } else { if (!isTemplateId) currentScopeSymbol.addSymbol(checkSymbol); @@ -2953,8 +2954,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto references, isForewardDecl); attachSymbolExtension(checkSymbol, elab, !isForewardDecl); } else if (isFriend) { - ((IDerivableContainerSymbol) currentScopeSymbol) - .addFriend(checkSymbol); + ((IDerivableContainerSymbol) originalScope).addFriend(checkSymbol); } if (checkSymbol != null) { if (scope instanceof IASTTemplateInstantiation) {