From ebc858ec44b4ad8f58c15403a7d098b4b9f4f5d0 Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Sat, 14 Dec 2013 22:08:04 -0500 Subject: [PATCH] Bug 419301 - Operator overloading confuses CDT (with boost) Change-Id: I9f136577e8e64227d024ba6544017439f1ed2260 Signed-off-by: Nathan Ridge Reviewed-on: https://git.eclipse.org/r/19833 Reviewed-by: Sergey Prigogin IP-Clean: Sergey Prigogin Tested-by: Sergey Prigogin --- .../tests/IndexCPPTemplateResolutionTest.java | 51 +++++++++++++++++++ .../dom/cpp/PDOMCPPClassSpecialization.java | 4 +- .../core/pdom/dom/cpp/PDOMCPPLinkage.java | 25 +++++---- 3 files changed, 69 insertions(+), 11 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java index 304299688ec..1209dfc9783 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java @@ -2403,4 +2403,55 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa IType T = getBindingFromASTName("T", 1); assertEquals("int", ASTTypeUtil.getType(T)); } + + // template + // struct multipliable2 + // { + // friend T operator *(const U& lhs, const T& rhs); + // }; + // + // template + // struct multipliable1 + // { + // friend T operator *(const T& lhs, const T& rhs); + // }; + + // #include "header.h" + // struct overloaded : multipliable1 {}; + // + // int foo(overloaded); + // + // int main() + // { + // overloaded c, d; + // foo(c * d); + // } + public void testFriendFunctionOfClassSpecialization_419301a() throws Exception { + checkBindings(); + } + + // template + // struct multipliable2 + // { + // friend T operator *(const U& lhs, const T& rhs); + // }; + // + // template + // struct multipliable1 + // { + // friend T operator *(const T& lhs, const T& rhs) {} + // }; + + // #include "header.h" + // struct overloaded : multipliable1 {}; + // + // int foo(overloaded); + // + // int main() { + // overloaded c, d; + // foo(c * d); + // } + public void testFriendFunctionOfClassSpecialization_419301b() throws Exception { + checkBindings(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java index e27d0f3fcb5..7f49e5773a4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java @@ -367,7 +367,9 @@ class PDOMCPPClassSpecialization extends PDOMCPPSpecialization implements @Override public IBinding[] getFriends(IASTNode point) { - // Not yet supported. + ICPPClassScope scope= getCompositeScope(); + if (scope instanceof ICPPClassSpecializationScope) + return ((ICPPClassSpecializationScope) scope).getFriends(point); return IBinding.EMPTY_BINDING_ARRAY; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java index 266ba2dfbed..6d7ae1ed05a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java @@ -21,6 +21,8 @@ import java.util.List; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier; +import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier; +import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; @@ -1041,17 +1043,20 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { } } } else if (parentNode instanceof ICPPASTFunctionDeclarator) { + IASTDeclSpecifier declSpec = null; if (parentNode.getParent() instanceof IASTSimpleDeclaration) { - IASTSimpleDeclaration grandparentNode = (IASTSimpleDeclaration) parentNode.getParent(); - if (grandparentNode.getDeclSpecifier() instanceof ICPPASTDeclSpecifier) { - if (((ICPPASTDeclSpecifier) grandparentNode.getDeclSpecifier()).isFriend()) { - pdomName.setIsFriendSpecifier(); - PDOMName enclClassName = (PDOMName) pdomName.getEnclosingDefinition(); - if (enclClassName != null) { - PDOMBinding enclClassBinding = enclClassName.getBinding(); - if (enclClassBinding instanceof PDOMCPPClassType) { - ((PDOMCPPClassType) enclClassBinding).addFriend(new PDOMCPPFriend(this, pdomName)); - } + declSpec = ((IASTSimpleDeclaration) parentNode.getParent()).getDeclSpecifier(); + } else if (parentNode.getParent() instanceof IASTFunctionDefinition) { + declSpec = ((IASTFunctionDefinition) parentNode.getParent()).getDeclSpecifier(); + } + if (declSpec instanceof ICPPASTDeclSpecifier) { + if (((ICPPASTDeclSpecifier) declSpec).isFriend()) { + pdomName.setIsFriendSpecifier(); + PDOMName enclClassName = (PDOMName) pdomName.getEnclosingDefinition(); + if (enclClassName != null) { + PDOMBinding enclClassBinding = enclClassName.getBinding(); + if (enclClassBinding instanceof PDOMCPPClassType) { + ((PDOMCPPClassType) enclClassBinding).addFriend(new PDOMCPPFriend(this, pdomName)); } } }