From 9c35d9bc4a914b012d202bf5e924379c6d097170 Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Tue, 7 Oct 2014 14:35:35 -0700 Subject: [PATCH] Bug 446225 - Captured variables not recognized as usages --- .../eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java | 9 +++++++++ .../core/dom/parser/cpp/semantics/CPPVisitor.java | 8 +++++--- 2 files changed, 14 insertions(+), 3 deletions(-) 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 d48d0276caf..6673e302ee4 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 @@ -8329,6 +8329,15 @@ public class AST2CPPTests extends AST2TestBase { parseAndCheckBindings(); } + // int foo = 0; + // auto bar = [foo] { return foo; }; + public void testLambdaWithCapture_446225() throws Exception { + BindingAssertionHelper bh = getAssertionHelper(); + ICPPVariable foo1= bh.assertNonProblemOnFirstIdentifier("foo =", ICPPVariable.class); + ICPPVariable foo2= bh.assertNonProblemOnFirstIdentifier("foo]", ICPPVariable.class); + assertTrue(foo1 == foo2); + } + // typedef int TInt; // void test() { // int a1= {}, a2{}; // Initializer for declarator 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 db7878dfa59..3b7d56922a2 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 @@ -99,6 +99,7 @@ import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.IValue; import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTAliasDeclaration; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCapture; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCatchHandler; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; @@ -256,7 +257,7 @@ public class CPPVisitor extends ASTQueries { new ThreadLocal>() { @Override protected Set initialValue() { - return new HashSet(); + return new HashSet<>(); } }; @@ -266,6 +267,7 @@ public class CPPVisitor extends ASTQueries { if (parent instanceof IASTNamedTypeSpecifier || parent instanceof ICPPASTBaseSpecifier || parent instanceof ICPPASTConstructorChainInitializer || + parent instanceof ICPPASTCapture || name.getPropertyInParent() == ICPPASTNamespaceAlias.MAPPING_NAME) { if (name.getLookupKey().length == 0) return null; @@ -284,7 +286,7 @@ public class CPPVisitor extends ASTQueries { binding = CPPSemantics.resolveBinding(name); if (parent instanceof IASTCompositeTypeSpecifier) { if (binding instanceof IIndexBinding) { - // Need to create an AST binding + // Need to create an AST binding. } else { ASTInternal.addDefinition(binding, parent); return binding; @@ -298,7 +300,7 @@ public class CPPVisitor extends ASTQueries { if (CPPTemplates.isClassTemplate(id)) return CPPSemantics.resolveBinding(name); - // function templates/instances/specializations must be resolved via the id + // Function templates/instances/specializations must be resolved via the id. id.resolveBinding(); return name.getBinding(); }