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 b052acba455..22eac693164 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 @@ -41,6 +41,7 @@ import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression; import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.IASTIdExpression; +import org.eclipse.cdt.core.dom.ast.IASTImplicitNameOwner; import org.eclipse.cdt.core.dom.ast.IASTInitializerExpression; import org.eclipse.cdt.core.dom.ast.IASTLabelStatement; import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression; @@ -7432,5 +7433,24 @@ public class AST2CPPTests extends AST2BaseTest { T= bh.assertNonProblem("T* m2", 1); assertSame(X, T.getOwner()); } + + // class ULONGLONG { + // public : + // ULONGLONG (unsigned long long val) {} + // friend ULONGLONG operator ~ ( const ULONGLONG & ) { return 0; } + // }; + // + // int main() { + // return ~0; + // } + public void testNonUserdefinedOperator_Bug291409_2() throws Exception { + final String code = getAboveComment(); + IASTTranslationUnit tu= parseAndCheckBindings(code, ParserLanguage.CPP); + IASTFunctionDefinition def= getDeclaration(tu, 1); + IASTReturnStatement rstmt= getStatement(def, 0); + IASTImplicitNameOwner expr= (IASTImplicitNameOwner) rstmt.getReturnValue(); + assertEquals(0, expr.getImplicitNames().length); + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTUnaryExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTUnaryExpression.java index 9f9c5af837b..9c2cb79cd61 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTUnaryExpression.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTUnaryExpression.java @@ -161,7 +161,7 @@ public class CPPASTUnaryExpression extends ASTNode implements ICPPASTUnaryExpres return overload; overload = CPPSemantics.findOverloadedOperator(this); - if(operand != null && op == op_amper && computePointerToMemberType() instanceof CPPPointerToMemberType) + if(overload != null && op == op_amper && computePointerToMemberType() instanceof CPPPointerToMemberType) overload = null; return overload; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java index c6a69a41fd9..ae9d6e09d1d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java @@ -2642,7 +2642,9 @@ public class CPPSemantics { IType type = exp.getOperand().getExpressionType(); type = SemanticUtil.getNestedType(type, TDEF | REF | CVQ); - + if (!isUserDefined(type)) + return null; + return findOverloadedOperator(exp, args, type, op.toCharArray(), true); } @@ -2659,8 +2661,10 @@ public class CPPSemantics { IType op2type = SemanticUtil.getUltimateTypeUptoPointers(exp.getOperand2().getExpressionType()); if (op2type instanceof IProblemBinding) return null; - if (isUserDefined(op1type) || isUserDefined(op2type)) - lookupNonMember = true; + if (!isUserDefined(op1type) && !isUserDefined(op2type)) + return null; + + lookupNonMember= true; } return findOverloadedOperator(exp, args, op1type, op.toCharArray(), lookupNonMember);