From 936d9e6b75edb95aa8df5801b87f7bc8aaa05707 Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Mon, 10 Aug 2009 00:42:14 +0000 Subject: [PATCH] Resolution of inline friend functions. Bug 284690. --- .../cdt/core/parser/tests/ast2/AST2CPPTests.java | 4 ++-- .../core/dom/parser/cpp/semantics/CPPVisitor.java | 6 +++++- .../core/dom/parser/cpp/semantics/FriendCollector.java | 10 ++++++++++ 3 files changed, 17 insertions(+), 3 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 079df976f6a..67a9f5d3bcd 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 @@ -7294,7 +7294,7 @@ public class AST2CPPTests extends AST2BaseTest { // void test(A a) { // m(a); // } - public void _testInlineFriendFunction_284690() throws Exception { + public void testInlineFriendFunction_284690() throws Exception { final String code = getAboveComment(); parseAndCheckBindings(code, ParserLanguage.CPP); } @@ -7330,7 +7330,7 @@ public class AST2CPPTests extends AST2BaseTest { assertEquals(IBasicType.t_int, ((ICPPBasicType) t3).getType()); assertEquals(ICPPBasicType.IS_LONG, ((ICPPBasicType) t3).getQualifierBits()); } - + // typedef enum enum_name enum_name; public void testTypedefRecursion_285457() throws Exception { BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java index b4b9415eb78..0f7d555e64e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java @@ -759,7 +759,7 @@ public class CPPVisitor extends ASTQueries { while (node != null) { if (node instanceof IASTName && !(node instanceof ICPPASTQualifiedName)) { return getContainingScope((IASTName) node); - } + } if (node instanceof IASTDeclaration) { IASTNode parent = node.getParent(); if (parent instanceof IASTTranslationUnit) { @@ -769,6 +769,10 @@ public class CPPVisitor extends ASTQueries { } else if (parent instanceof IASTForStatement) { return ((IASTForStatement) parent).getScope(); } else if (parent instanceof IASTCompositeTypeSpecifier) { + if (node instanceof IASTFunctionDefinition && + ((ICPPASTDeclSpecifier) ((IASTFunctionDefinition) node).getDeclSpecifier()).isFriend()) { + return getContainingScope(parent); + } return ((IASTCompositeTypeSpecifier) parent).getScope(); } else if (parent instanceof ICPPASTNamespaceDefinition) { return ((ICPPASTNamespaceDefinition) parent).getScope(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/FriendCollector.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/FriendCollector.java index 49a5f5f94b0..8f4ed033472 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/FriendCollector.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/FriendCollector.java @@ -7,12 +7,15 @@ * * Contributors: * Markus Schorn - initial API and implementation + * Sergey Prigogin (Google) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp.semantics; import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTDeclarator; +import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator; +import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; @@ -61,6 +64,13 @@ class FriendCollector extends ASTVisitor { if (declSpec instanceof ICPPASTCompositeTypeSpecifier) { return PROCESS_CONTINUE; } + } else if (declaration instanceof IASTFunctionDefinition) { + IASTFunctionDefinition funcDefinition = (IASTFunctionDefinition) declaration; + ICPPASTDeclSpecifier declSpec = (ICPPASTDeclSpecifier) funcDefinition.getDeclSpecifier(); + if (declSpec.isFriend()) { + IASTFunctionDeclarator declarator = funcDefinition.getDeclarator(); + ASTInternal.addName(fScope, declarator.getName()); + } } return PROCESS_SKIP; }