Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSergey Prigogin2013-12-18 03:33:27 +0000
committerSergey Prigogin2013-12-18 03:36:44 +0000
commitbb6d85dbd0c98ac8d9115fc785246cd1ade29be5 (patch)
treecde5ee70a0a8526d652b309b415409223fb11832
parenta7e2467ba59e4dd383f8d03484f9ab8c4439628d (diff)
downloadorg.eclipse.cdt-bb6d85dbd0c98ac8d9115fc785246cd1ade29be5.tar.gz
org.eclipse.cdt-bb6d85dbd0c98ac8d9115fc785246cd1ade29be5.tar.xz
org.eclipse.cdt-bb6d85dbd0c98ac8d9115fc785246cd1ade29be5.zip
Bug 419301 - Operator overloading confuses CDT (with boost)
-rw-r--r--core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java51
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java4
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java25
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));
}
}
}

Back to the top