From 7bbba2e9ec3669b2cf3213eaee4b3e799319141a Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Mon, 17 Aug 2009 04:11:35 +0000 Subject: [PATCH] Bug 286741. --- .../core/parser/tests/ast2/AST2TemplateTests.java | 14 ++++++++++++++ .../core/dom/parser/cpp/semantics/CPPVisitor.java | 15 ++++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java index a6a1d25e70b..ccae454a521 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java @@ -4114,4 +4114,18 @@ public class AST2TemplateTests extends AST2BaseTest { final String code= getAboveComment(); parseAndCheckBindings(code, ParserLanguage.CPP); } + + // template + // struct A { + // typedef A Self; + // friend Self f(Self p) { return Self(); } + // }; + // + // void test(A x) { + // f(x); + // } + public void testInlineFriendFunction_286741() throws Exception { + final String code = getAboveComment(); + parseAndCheckBindings(code, ParserLanguage.CPP); + } } 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 db7393cd396..9fa86e63c11 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 @@ -806,10 +806,19 @@ public class CPPVisitor extends ASTQueries { while (parent.getParent() instanceof IASTDeclarator) parent = parent.getParent(); ASTNodeProperty prop = parent.getPropertyInParent(); - if (prop == IASTSimpleDeclaration.DECLARATOR) + if (prop == IASTSimpleDeclaration.DECLARATOR) { return dtor.getFunctionScope(); - else if (prop == IASTFunctionDefinition.DECLARATOR) - return ((IASTCompoundStatement) ((IASTFunctionDefinition) parent.getParent()).getBody()).getScope(); + } else if (prop == IASTFunctionDefinition.DECLARATOR) { + IASTFunctionDefinition funcDef = (IASTFunctionDefinition) parent.getParent(); + ICPPASTDeclSpecifier declSpec = (ICPPASTDeclSpecifier) funcDef.getDeclSpecifier(); + if (declSpec.isFriend()) { + parent = funcDef.getParent(); + if (parent instanceof IASTCompositeTypeSpecifier) { + return ((IASTCompositeTypeSpecifier) parent).getScope(); + } + } + return ((IASTCompoundStatement) funcDef.getBody()).getScope(); + } } } else if (parent instanceof ICPPASTTemplateDeclaration) { return CPPTemplates.getContainingScope(node);