1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-08 08:45:44 +02:00

fixing bug 84186

This commit is contained in:
Andrew Niefer 2005-02-02 22:18:42 +00:00
parent ec6276d5dd
commit 10a5054abe
3 changed files with 57 additions and 4 deletions

View file

@ -2718,4 +2718,27 @@ public class AST2Tests extends AST2BaseTest {
public void testBug84250() throws Exception {
assertTrue( ((IASTDeclarationStatement) ((IASTCompoundStatement) ((IASTFunctionDefinition) parse( "void f() { int (*p) [2]; }", ParserLanguage.C ).getDeclarations()[0]).getBody()).getStatements()[0]).getDeclaration() instanceof IASTSimpleDeclaration ); //$NON-NLS-1$
}
public void testBug84186() throws Exception {
StringBuffer buffer = new StringBuffer();
buffer.append( "struct s1 { struct s2 *s2p; /* ... */ }; // D1 \n"); //$NON-NLS-1$
buffer.append( "struct s2 { struct s1 *s1p; /* ... */ }; // D2 \n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.C);
CNameCollector col = new CNameCollector();
CVisitor.visitTranslationUnit(tu, col);
assertEquals(col.size(), 6);
ICompositeType s_ref = (ICompositeType) col.getName(1).resolveBinding();
ICompositeType s_decl = (ICompositeType) col.getName(3).resolveBinding();
assertSame( s_ref, s_decl );
CVisitor.clearBindings( tu );
s_decl = (ICompositeType) col.getName(3).resolveBinding();
s_ref = (ICompositeType) col.getName(1).resolveBinding();
assertSame( s_ref, s_decl );
}
}

View file

@ -11,6 +11,7 @@
**********************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.c;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
@ -26,6 +27,7 @@ import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.c.ICASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.c.ICASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.c.ICCompositeTypeScope;
/**
* Created on Nov 8, 2004
@ -75,9 +77,13 @@ public class CStructure implements ICompositeType, ICBinding {
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IBinding#getScope()
*/
public IScope getScope() {
public IScope getScope() throws DOMException {
IASTDeclSpecifier declSpec = (IASTDeclSpecifier) ( ( definition != null ) ? (IASTNode)definition : declarations[0] );
return CVisitor.getContainingScope( declSpec );
IScope scope = CVisitor.getContainingScope( declSpec );
while( scope instanceof ICCompositeTypeScope ){
scope = scope.getParent();
}
return scope;
}
/* (non-Javadoc)
@ -168,4 +174,12 @@ public class CStructure implements ICompositeType, ICBinding {
}
return t;
}
/**
* @param compositeTypeSpec
*/
public void addDefinition(ICASTCompositeTypeSpecifier compositeTypeSpec) {
definition = compositeTypeSpec;
((CASTName)compositeTypeSpec.getName()).setBinding( this );
}
}

View file

@ -92,6 +92,7 @@ import org.eclipse.cdt.core.dom.ast.c.ICASTPointer;
import org.eclipse.cdt.core.dom.ast.c.ICASTSimpleDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.c.ICASTTypeIdInitializerExpression;
import org.eclipse.cdt.core.dom.ast.c.ICASTTypedefNameSpecifier;
import org.eclipse.cdt.core.dom.ast.c.ICCompositeTypeScope;
import org.eclipse.cdt.core.dom.ast.c.ICFunctionScope;
import org.eclipse.cdt.core.dom.ast.c.ICScope;
import org.eclipse.cdt.core.dom.ast.gnu.IGNUASTCompoundStatementExpression;
@ -770,8 +771,23 @@ public class CVisitor {
private static IBinding createBinding( ICASTCompositeTypeSpecifier compositeTypeSpec ){
ICompositeType binding = new CStructure( compositeTypeSpec );
ICScope scope;
ICScope scope = null;
IBinding binding = null;
try {
scope = (ICScope) getContainingScope( compositeTypeSpec );
while( scope instanceof ICCompositeTypeScope )
scope = (ICScope) scope.getParent();
binding = scope.getBinding( ICScope.NAMESPACE_TYPE_TAG, compositeTypeSpec.getName().toCharArray() );
if( binding != null ){
((CStructure)binding).addDefinition( compositeTypeSpec );
return binding;
}
} catch (DOMException e2) {
}
binding = new CStructure( compositeTypeSpec );
try {
scope = (ICScope) binding.getScope();
scope.addBinding( binding );