From fdf3bd41469efaa66a5a3adadfa41eafee60f17a Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Mon, 22 Dec 2008 04:40:18 +0000 Subject: [PATCH] Bug 259460. --- .../cdt/core/parser/tests/ast2/AST2CPPTests.java | 16 +++++++++++++--- .../dom/parser/cpp/semantics/CPPSemantics.java | 2 +- .../dom/parser/cpp/semantics/LookupData.java | 7 +++++++ 3 files changed, 21 insertions(+), 4 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 473a5f1a868..39bdcef9e6b 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 @@ -6279,12 +6279,22 @@ public class AST2CPPTests extends AST2BaseTest { } // struct A { - // void method() { + // B method(B p, int& a = y) { // B is not defined // B b; + // int x = y + 1; + // return b; // } // struct B {}; + // int& x = y; // y is not defined + // int y; // }; - public void _testScopeOfClassMember_259460() throws Exception { - parseAndCheckBindings(getAboveComment(), ParserLanguage.CPP); + public void testScopeOfClassMember_259460() throws Exception { + BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true); + ba.assertNonProblem("B b", 1, ICPPClassType.class); + ba.assertProblem("B p", 1); + ba.assertProblem("B method", 1); + ba.assertNonProblem("y + 1;", 1, ICPPField.class); + ba.assertNonProblem("y) {", 1, ICPPField.class); + ba.assertProblem("y; // y is not defined", 1); } } 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 5a53a38c16a..fad97ee4705 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 @@ -1739,7 +1739,7 @@ public class CPPSemantics { if (temp instanceof IProblemBinding) continue; - if (!(temp instanceof ICPPMember) && !declaredBefore) + if (!(temp instanceof ICPPMember) && !(temp instanceof IType) && !declaredBefore) continue; if (temp instanceof ICPPUsingDeclaration) { IBinding[] bindings = ((ICPPUsingDeclaration) temp).getDelegates(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java index d753a30a250..6ce91392a6f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java @@ -10,6 +10,7 @@ * Markus Schorn (Wind River Systems) * Bryan Wilkinson (QNX) * Andrew Ferguson (Symbian) + * Sergey Prigogin (Google) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp.semantics; @@ -31,6 +32,7 @@ import org.eclipse.cdt.core.dom.ast.IASTIdExpression; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTNode; +import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; import org.eclipse.cdt.core.dom.ast.IASTTypeId; import org.eclipse.cdt.core.dom.ast.IPointerType; @@ -292,6 +294,11 @@ class LookupData { IASTNode parent = astName.getParent(); while (parent != null && !(parent instanceof IASTFunctionDefinition)) { + ASTNodeProperty prop = parent.getPropertyInParent(); + if (prop == IASTParameterDeclaration.DECL_SPECIFIER || + prop == IASTFunctionDefinition.DECL_SPECIFIER) { + return false; + } parent = parent.getParent(); } if (parent instanceof IASTFunctionDefinition) {