Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNathan Ridge2014-08-20 05:42:03 +0000
committerSergey Prigogin2014-08-26 01:18:01 +0000
commit767ceb4a42721d689835e3b19047abd38bcbf5c8 (patch)
treeecc21b312cbc4ca20f1f67f32f580e4131fc3192
parentb18a54484191ac9d7cfd81d0a1e054d65bd58fea (diff)
downloadorg.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>
-rw-r--r--core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCBindingResolutionTest.java7
-rw-r--r--core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionBugs.java3
-rw-r--r--core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionTest.java7
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CScope.java7
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java1
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java7
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];

Back to the top