From c1ca5aeef0c2a1928259d9e625d2e366d1df7de8 Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Fri, 14 Mar 2014 19:09:46 -0700 Subject: [PATCH] Bug 430428 - Function resolution problem with lambda and typedef. --- .../parser/tests/ast2/AST2TemplateTests.java | 14 ++++++++++++++ .../core/dom/parser/cpp/CPPClosureType.java | 4 +++- .../parser/scanner/ASTPreprocessorNode.java | 17 +++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java index 15a79313732..bfbe8a763a1 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java @@ -3218,6 +3218,20 @@ public class AST2TemplateTests extends AST2TestBase { ba.assertNonProblem("A(other", 1); } + // template + // struct A {}; + // + // template + // A waldo(U p); + // + // void test() { + // typedef int INT; + // A x = waldo([](int data) { return false; }); + // } + public void testLambda_430428() throws Exception { + parseAndCheckBindings(); + } + // class A {}; // // class B { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClosureType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClosureType.java index cd6605d79b1..a3d3cca204c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClosureType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClosureType.java @@ -226,7 +226,9 @@ public class CPPClosureType extends PlatformObject implements ICPPClassType, ICP return true; if (type instanceof ITypedef || type instanceof IIndexBinding) return type.isSameType(this); - return false; + if (!getClass().equals(type.getClass())) + return false; + return fLambdaExpression.getFileLocation().equals(((CPPClosureType) type).fLambdaExpression.getFileLocation()); } @Override diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ASTPreprocessorNode.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ASTPreprocessorNode.java index 3fbce02a8c8..869f18c9774 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ASTPreprocessorNode.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ASTPreprocessorNode.java @@ -12,6 +12,7 @@ package org.eclipse.cdt.internal.core.parser.scanner; import java.util.ArrayList; +import java.util.Objects; import org.eclipse.cdt.core.dom.IName; import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; @@ -786,6 +787,22 @@ class ASTFileLocation implements IASTFileLocation { public IASTPreprocessorIncludeStatement getContextInclusionStatement() { return fLocationCtx.getInclusionStatement(); } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ASTFileLocation other = (ASTFileLocation) obj; + if (fOffset != other.fOffset) + return false; + if (fLength != other.fLength) + return false; + return Objects.equals(fLocationCtx, fLocationCtx); + } } class ASTMacroExpansion extends ASTPreprocessorNode implements IASTPreprocessorMacroExpansion {