diff options
author | Sergey Prigogin | 2013-12-18 03:33:27 +0000 |
---|---|---|
committer | Sergey Prigogin | 2013-12-18 03:36:44 +0000 |
commit | bb6d85dbd0c98ac8d9115fc785246cd1ade29be5 (patch) | |
tree | cde5ee70a0a8526d652b309b415409223fb11832 | |
parent | a7e2467ba59e4dd383f8d03484f9ab8c4439628d (diff) | |
download | org.eclipse.cdt-bb6d85dbd0c98ac8d9115fc785246cd1ade29be5.tar.gz org.eclipse.cdt-bb6d85dbd0c98ac8d9115fc785246cd1ade29be5.tar.xz org.eclipse.cdt-bb6d85dbd0c98ac8d9115fc785246cd1ade29be5.zip |
Bug 419301 - Operator overloading confuses CDT (with boost)
This restores commit ebc858ec44b4ad8f58c15403a7d098b4b9f4f5d0.
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 <class T, class U> + // struct multipliable2 + // { + // friend T operator *(const U& lhs, const T& rhs); + // }; + // + // template <class T> + // struct multipliable1 + // { + // friend T operator *(const T& lhs, const T& rhs); + // }; + + // #include "header.h" + // struct overloaded : multipliable1<overloaded> {}; + // + // int foo(overloaded); + // + // int main() + // { + // overloaded c, d; + // foo(c * d); + // } + public void testFriendFunctionOfClassSpecialization_419301a() throws Exception { + checkBindings(); + } + + // template <class T, class U> + // struct multipliable2 + // { + // friend T operator *(const U& lhs, const T& rhs); + // }; + // + // template <class T> + // struct multipliable1 + // { + // friend T operator *(const T& lhs, const T& rhs) {} + // }; + + // #include "header.h" + // struct overloaded : multipliable1 <overloaded> {}; + // + // 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)); } } } |