From 00ebcad32560f1f4ce5dc1e5149ad14999d09b0e Mon Sep 17 00:00:00 2001 From: Andrew Ferguson Date: Mon, 19 Mar 2007 12:08:51 +0000 Subject: [PATCH] fix handling of particular type of problem binding in KnR style function declarations --- .../cdt/internal/pdom/tests/CFunctionTests.java | 12 ++++++++++++ .../pdomtests/functionTests/declarations.c | 11 ++++++++++- .../internal/core/pdom/dom/c/PDOMCParameter.java | 15 +++++++++------ 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CFunctionTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CFunctionTests.java index 016ba03728a..db4e4b44513 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CFunctionTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CFunctionTests.java @@ -15,6 +15,8 @@ import junit.framework.Test; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IFunction; +import org.eclipse.cdt.core.dom.ast.IParameter; +import org.eclipse.cdt.core.dom.ast.c.ICBasicType; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.internal.core.CCoreInternals; import org.eclipse.cdt.internal.core.pdom.PDOM; @@ -72,4 +74,14 @@ public class CFunctionTests extends PDOMTestBase { assertTrue(((IFunction) bindings[0]).takesVarArgs()); } + public void testKnRStyleFunctionWithProblemParameters() throws Exception { + IBinding[] bindings = findQualifiedName(pdom, "KnRfunctionWithProblemParameters"); + assertEquals(1, bindings.length); + IFunction f= (IFunction) bindings[0]; + IParameter[] params= f.getParameters(); + assertEquals(3, params.length); + assertNull(params[0].getType()); // its a problem binding in the DOM + assertTrue(params[1].getType() instanceof ICBasicType); + assertTrue(params[2].getType() instanceof ICBasicType); + } } diff --git a/core/org.eclipse.cdt.core.tests/resources/pdomtests/functionTests/declarations.c b/core/org.eclipse.cdt.core.tests/resources/pdomtests/functionTests/declarations.c index a5da131066c..0875ffaa478 100644 --- a/core/org.eclipse.cdt.core.tests/resources/pdomtests/functionTests/declarations.c +++ b/core/org.eclipse.cdt.core.tests/resources/pdomtests/functionTests/declarations.c @@ -18,4 +18,13 @@ void spin() { normalCDeclaration2(); forwardCDeclaration(); } - + +// p1 is a particular type of problem binding as it +// has no corresponding declarator +void KnRfunctionWithProblemParameters(p1,p2,c) + long p2; + int c; +{ + +} + diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCParameter.java index 038c00ab165..7fe73b1f991 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCParameter.java @@ -16,6 +16,7 @@ import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTInitializer; import org.eclipse.cdt.core.dom.ast.IParameter; +import org.eclipse.cdt.core.dom.ast.IProblemBinding; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; @@ -52,12 +53,14 @@ class PDOMCParameter extends PDOMNamedNode implements IParameter { db.putInt(record + NEXT_PARAM, 0); try { - IType type = param.getType(); - while(type instanceof ITypedef) - type = ((ITypedef)type).getType(); - if (type != null) { - PDOMNode typeNode = getLinkageImpl().addType(this, type); - db.putInt(record + TYPE, typeNode != null ? typeNode.getRecord() : 0); + if(!(param instanceof IProblemBinding)) { + IType type = param.getType(); + while(type instanceof ITypedef) + type = ((ITypedef)type).getType(); + if (type != null) { + PDOMNode typeNode = getLinkageImpl().addType(this, type); + db.putInt(record + TYPE, typeNode != null ? typeNode.getRecord() : 0); + } } } catch(DOMException e) { throw new CoreException(Util.createStatus(e));