From 6aa77b925c626fe95106d7ea2c0b69ee6e283c0f Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Sat, 27 Sep 2008 00:07:18 +0000 Subject: [PATCH] Resolution of overloaded operators. Bug 248803. --- .../core/parser/tests/ast2/AST2CPPTests.java | 20 +++++++++++++++++++ .../dom/parser/cpp/semantics/CPPVisitor.java | 6 +++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java index e7d22b0aeda..cd95d776b5c 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java @@ -123,6 +123,7 @@ import org.eclipse.cdt.internal.core.parser.ParserException; public class AST2CPPTests extends AST2BaseTest { + public AST2CPPTests() { } @@ -6026,4 +6027,23 @@ public class AST2CPPTests extends AST2BaseTest { ICPPFunction func2= helper.assertNonProblem("func(y)", 4, ICPPFunction.class); assertNotSame(func1, func2); } + + // struct A { + // const char& operator[](int pos) const; + // char& operator[](int pos); + // }; + // + // void func(const char& c); + // void func(char& c); + // + // void test(const A& x, A& y) { + // func(x[0]); + // func(y[0]); + // } + public void testOverloadedOperator_248803() throws Exception { + BindingAssertionHelper helper= new BindingAssertionHelper(getAboveComment(), true); + ICPPFunction func1= helper.assertNonProblem("func(x[0])", 4, ICPPFunction.class); + ICPPFunction func2= helper.assertNonProblem("func(y[0])", 4, ICPPFunction.class); + assertNotSame(func1, func2); + } } 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 5cd2ee68814..07ca9339ed2 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 @@ -2026,8 +2026,12 @@ public class CPPVisitor { } else if (expression instanceof IASTArraySubscriptExpression) { IType t = getExpressionType(((IASTArraySubscriptExpression) expression).getArrayExpression()); try { - if (t instanceof ICPPReferenceType) + if (t instanceof ICPPReferenceType) { t = ((ICPPReferenceType)t).getType(); + } + if (t instanceof IQualifierType) { + t = ((IQualifierType) t).getType(); + } while (t instanceof ITypedef) { t = ((ITypedef)t).getType(); }