diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java index c1f6682d955..ab85fbab7e3 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java @@ -2741,4 +2741,33 @@ public class AST2Tests extends AST2BaseTest { assertSame( s_ref, s_decl ); } + + public void testBug84267() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append( "typedef struct { int a; } S; \n"); //$NON-NLS-1$ + buffer.append( "void g( S* (*funcp) (void) ) { \n"); //$NON-NLS-1$ + buffer.append( " (*funcp)()->a; \n"); //$NON-NLS-1$ + buffer.append( " funcp()->a; \n"); //$NON-NLS-1$ + buffer.append( "} \n"); //$NON-NLS-1$ + + IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.C); + CNameCollector col = new CNameCollector(); + CVisitor.visitTranslationUnit(tu, col); + + assertEquals(col.size(), 11); + + ITypedef S = (ITypedef) col.getName(2).resolveBinding(); + IField a = (IField) col.getName( 10 ).resolveBinding(); + IParameter funcp = (IParameter) col.getName(7).resolveBinding(); + assertNotNull( funcp ); + assertInstances( col, funcp, 3 ); + assertInstances( col, a, 3 ); + + assertTrue( funcp.getType() instanceof IPointerType ); + IType t = ((IPointerType) funcp.getType()).getType(); + assertTrue( t instanceof IFunctionType ); + IFunctionType ft = (IFunctionType) t; + assertTrue( ft.getReturnType() instanceof IPointerType ); + assertSame( ((IPointerType)ft.getReturnType()).getType(), S ); + } } \ No newline at end of file diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CArrayType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CArrayType.java index 9bee97581c8..8bb84e75cf1 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CArrayType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CArrayType.java @@ -91,4 +91,11 @@ public class CArrayType implements ICArrayType, ITypeContainer { } return t; } + + /** + * @return + */ + public ICASTArrayModifier getModifier() { + return mod; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CFunction.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CFunction.java index fc334465733..84503250e0f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CFunction.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CFunction.java @@ -94,7 +94,7 @@ public class CFunction implements IFunction, ICBinding { if( names.length > 0 ){ // ensures that the List of parameters is created in the same order as the K&R C parameter names for( int i=0; i