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 581a80d4a2a..5c61f54be2b 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 @@ -1748,6 +1748,21 @@ public class AST2CPPTests extends AST2TestBase { // This assertion fails because conv is the copy ctor A(const A&), not the conversion operator B::operator A() assertSame(oper, conv); } + + // struct S { + // operator int() &; + // operator int() &&; + // }; + // + // void waldo(int); + // + // int main() { + // S s; + // waldo(s); // ERROR + // } + public void testOverloadedRefQualifiedConversionOperators_506728() throws Exception { + parseAndCheckBindings(); + } // namespace A { int x; } // namespace B = A; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/Conversions.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/Conversions.java index c6f2d956779..8379a771290 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/Conversions.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/Conversions.java @@ -856,7 +856,8 @@ public class Conversions { if (isExplicitConversion /** && !direct **/) continue; - final IType returnType = op.getType().getReturnType(); + ICPPFunctionType functionType = op.getType(); + final IType returnType = functionType.getReturnType(); IType uqReturnType= getNestedType(returnType, TDEF | ALLCVQ); Cost c2= checkImplicitConversionSequence(target, uqReturnType, valueCategoryFromReturnType(uqReturnType), UDCMode.FORBIDDEN, Context.ORDINARY, point); if (c2.converts()) { @@ -866,7 +867,11 @@ public class Conversions { final Cost udcCost = isReferenceCompatible(getNestedType(implicitType, TDEF | REF), source, true, point); if (udcCost != null) { // Make sure top-level cv-qualifiers are compared - udcCost.setReferenceBinding(ReferenceBinding.LVALUE_REF); + if (functionType.hasRefQualifier() && functionType.isRValueReference()) { + udcCost.setReferenceBinding(ReferenceBinding.RVALUE_REF_BINDS_RVALUE); + } else { + udcCost.setReferenceBinding(ReferenceBinding.LVALUE_REF); + } FunctionCost c1= new FunctionCost(op, udcCost, point); int cmp= c1.compareTo(null, cost1); if (cmp <= 0) {