From 07e8917eb59d183c4442182b49d55dcb43bebf56 Mon Sep 17 00:00:00 2001 From: Thomas Corbat Date: Thu, 5 Oct 2017 21:35:37 +0200 Subject: [PATCH] Bug 525645 - Named type specifiers in friend declarations Change-Id: Ia67fb35ef3d20cde97322c07e697e3437c6c769d Signed-off-by: Thomas Corbat --- .../cdt/core/parser/tests/ast2/AST2CPPTests.java | 16 ++++++++++++++++ .../core/dom/parser/cpp/ClassTypeHelper.java | 9 +++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) 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;