diff options
author | Nathan Ridge | 2014-08-20 05:42:03 +0000 |
---|---|---|
committer | Sergey Prigogin | 2014-08-26 01:18:01 +0000 |
commit | 767ceb4a42721d689835e3b19047abd38bcbf5c8 (patch) | |
tree | ecc21b312cbc4ca20f1f67f32f580e4131fc3192 | |
parent | b18a54484191ac9d7cfd81d0a1e054d65bd58fea (diff) | |
download | org.eclipse.cdt-767ceb4a42721d689835e3b19047abd38bcbf5c8.tar.gz org.eclipse.cdt-767ceb4a42721d689835e3b19047abd38bcbf5c8.tar.xz org.eclipse.cdt-767ceb4a42721d689835e3b19047abd38bcbf5c8.zip |
Bug 435075 - Avoid an infinite recursion during name resolution
Change-Id: Ie9ac34b184f7b7f6b5196aad716d0fc3696c1e6e
Signed-off-by: Nathan Ridge <zeratul976@hotmail.com>
Reviewed-on: https://git.eclipse.org/r/32193
Reviewed-by: Sergey Prigogin <eclipse.sprigogin@gmail.com>
Tested-by: Sergey Prigogin <eclipse.sprigogin@gmail.com>
6 files changed, 22 insertions, 10 deletions
diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCBindingResolutionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCBindingResolutionTest.java index f7b8e5a630f..ae773353090 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCBindingResolutionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCBindingResolutionTest.java @@ -405,4 +405,11 @@ public class IndexCBindingResolutionTest extends IndexBindingResolutionTestBase assertNotNull(numericalValue); assertEquals(i, numericalValue.intValue()); } + + // extern char TableValue[10]; + + // char TableValue[sizeof TableValue]; + public void testNameLookupFromArrayModifier_435075() throws Exception { + checkBindings(); + } } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionBugs.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionBugs.java index 8f14b80600d..7f35af56cb1 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionBugs.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionBugs.java @@ -829,7 +829,8 @@ public class IndexCPPBindingResolutionBugs extends IndexBindingResolutionTestBas IType type= fn.getType().getParameterTypes()[0]; assertInstance(type, IPointerType.class); type= ((IPointerType) type).getType(); - assertSame(type, cl); + assertInstance(cl, IType.class); + assertSameType(type, (IType) cl); } // class A { diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionTest.java index 6050161bb6b..d178e546e63 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionTest.java @@ -1862,4 +1862,11 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti public void testLambdaOwnedByClass() throws Exception { checkBindings(); } + + // extern char TableValue[10]; + + // char TableValue[sizeof TableValue]; + public void testNameLookupFromArrayModifier_435075() throws Exception { + checkBindings(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CScope.java index d444b31e9ca..de23fe19352 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CScope.java @@ -291,7 +291,7 @@ public class CScope implements ICScope, IASTInternalScope { } private IBinding extractBinding(final IASTName candidate, boolean resolve, IASTName forName) { - if (!resolve || acceptDeclaredAfter(forName) || CVisitor.declaredBefore(candidate, forName)) { + if (!resolve || acceptDeclaredAfter(forName, candidate) || CVisitor.declaredBefore(candidate, forName)) { if (resolve && candidate != forName) { return candidate.resolveBinding(); } @@ -300,7 +300,10 @@ public class CScope implements ICScope, IASTInternalScope { return null; } - private boolean acceptDeclaredAfter(IASTName name) { + private boolean acceptDeclaredAfter(IASTName name, IASTName candidate) { + // Functions may be declared after the point of use. + if (!(candidate.getParent() instanceof IASTFunctionDeclarator)) + return false; if (getKind() != EScopeKind.eGlobal) return false; final ASTNodeProperty propertyInParent = name.getPropertyInParent(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java index e9477db5a8c..f6b0ade2aea 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java @@ -1665,6 +1665,7 @@ public class CVisitor extends ASTQueries { static public boolean declaredBefore(IASTNode nodeA, IASTNode nodeB) { if (nodeB == null) return true; if (nodeB.getPropertyInParent() == STRING_LOOKUP_PROPERTY) return true; + if (nodeB.getPropertyInParent() == STRING_LOOKUP_TAGS_PROPERTY) return true; if (nodeA instanceof ASTNode) { ASTNode nd= (ASTNode) nodeA; 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 9bb27812c7c..c1b603e26c3 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 @@ -1871,13 +1871,6 @@ public class CPPSemantics { int pointOfDecl= -1; if (obj instanceof ICPPInternalBinding) { ICPPInternalBinding cpp = (ICPPInternalBinding) obj; - // For bindings in global or namespace scope we don't know whether there is a - // previous declaration in one of the skipped header files. For bindings that - // are likely to be redeclared we need to assume that there is a declaration - // in one of the headers. - if (indexBased && acceptDeclaredAfter(cpp)) { - return true; - } IASTNode[] n = cpp.getDeclarations(); if (n != null && n.length > 0) { nd = (ASTNode) n[0]; |