diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java index 39b0507b528..5813e8f400a 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java @@ -2403,6 +2403,22 @@ public class AST2CPPTests extends AST2CPPTestBase { assertSame(friends[1], B); } + // class B; + // class A { + // friend B; + // }; + // class B{}; + public void testForwardDeclaredFriend_525645() throws Exception { + final String code = getAboveComment(); + BindingAssertionHelper bh = new AST2AssertionHelper(code, true); + ICPPClassType A = bh.assertNonProblem("A", 1); + ICPPClassType B = bh.assertNonProblem("B", 1); + + IBinding[] friends = A.getFriends(); + assertEquals(1, friends.length); + assertSame(friends[0], B); + } + // class Other { // void m(); }; // class A { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java index cff9faf585d..4cf03a3d0e7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java @@ -53,6 +53,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBas import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTEnumerationSpecifier; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDeclaration; @@ -115,8 +116,12 @@ public class ClassTypeHelper { ICPPASTDeclSpecifier declSpec = (ICPPASTDeclSpecifier) ((IASTSimpleDeclaration) decl).getDeclSpecifier(); if (declSpec.isFriend()) { IASTDeclarator[] dtors = ((IASTSimpleDeclaration) decl).getDeclarators(); - if (declSpec instanceof ICPPASTElaboratedTypeSpecifier && dtors.length == 0) { - resultSet.put(((ICPPASTElaboratedTypeSpecifier) declSpec).getName().resolveBinding()); + if (dtors.length == 0) { + if (declSpec instanceof ICPPASTElaboratedTypeSpecifier) { + resultSet.put(((ICPPASTElaboratedTypeSpecifier) declSpec).getName().resolveBinding()); + } else if (declSpec instanceof ICPPASTNamedTypeSpecifier) { + resultSet.put(((ICPPASTNamedTypeSpecifier) declSpec).getName().resolveBinding()); + } } else { for (IASTDeclarator dtor : dtors) { if (dtor == null) break;