1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-30 20:35:38 +02:00

Bug 419301 - Operator overloading confuses CDT (with boost)

This restores commit ebc858ec44.
This commit is contained in:
Sergey Prigogin 2013-12-17 19:33:27 -08:00
parent a7e2467ba5
commit bb6d85dbd0
3 changed files with 69 additions and 11 deletions

View file

@ -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();
}
}

View file

@ -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;
}

View file

@ -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));
}
}
}