diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2BaseTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2BaseTest.java index 6e635b90e98..9822fb9c391 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2BaseTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2BaseTest.java @@ -28,7 +28,6 @@ import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement; import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.IASTIdExpression; import org.eclipse.cdt.core.dom.ast.IASTName; -import org.eclipse.cdt.core.dom.ast.IASTProblem; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression; import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression; @@ -122,13 +121,13 @@ public class AST2BaseTest extends TestCase { if( lang == ParserLanguage.C && expectNoProblems ) { - IASTProblem [] problems = CVisitor.getProblems(tu); - assertEquals( problems.length, 0 ); + assertEquals( CVisitor.getProblems(tu).length, 0 ); + assertEquals( tu.getPreprocesorProblems().length, 0 ); } else if ( lang == ParserLanguage.CPP && expectNoProblems ) { - IASTProblem [] problems = CPPVisitor.getProblems(tu); - assertEquals( problems.length, 0 ); + assertEquals( CPPVisitor.getProblems(tu).length, 0 ); + assertEquals( tu.getPreprocesorProblems().length, 0 ); } return tu; 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 c21edd01ff2..8b82d39aff4 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 @@ -2619,4 +2619,17 @@ public class AST2Tests extends AST2BaseTest { assertInstances( col, e, 2 ); } + + public void testBug84176() throws Exception { + StringBuffer buffer = new StringBuffer( "// example from: C99 6.5.2.5-16\n" ); //$NON-NLS-1$ + buffer.append( "struct s { int i; };\n"); //$NON-NLS-1$ + buffer.append("void f (void)\n"); //$NON-NLS-1$ + buffer.append("{\n"); //$NON-NLS-1$ + buffer.append(" struct s *p = 0, *q;\n"); //$NON-NLS-1$ + buffer.append("int j = 0;\n"); //$NON-NLS-1$ + buffer.append("q = p;\n"); //$NON-NLS-1$ + buffer.append("p = &((struct s){ j++ }); \n"); //$NON-NLS-1$ + buffer.append("}\n"); //$NON-NLS-1$ + parse( buffer.toString(), ParserLanguage.C ); + } } \ No newline at end of file diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTNode.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTNode.java index 35340928ce6..32ad742bf33 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTNode.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTNode.java @@ -32,16 +32,19 @@ public abstract class ASTNode implements IASTNode { public void setOffset( int offset ) { this.offset = offset; + this.locations = null; } public void setLength( int length ) { this.length = length; + this.locations = null; } public void setOffsetAndLength(int offset, int length) { this.offset = offset; this.length = length; + this.locations = null; } public void setOffsetAndLength( ASTNode node ) @@ -49,12 +52,15 @@ public abstract class ASTNode implements IASTNode { setOffsetAndLength( node.getOffset(), node.getLength() ); } + private IASTNodeLocation [] locations = null; /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.IASTNode#getNodeLocations() */ public IASTNodeLocation[] getNodeLocations() { + if( locations != null ) return locations; if( length == 0 ) return EMPTY_LOCATION_ARRAY; - return getTranslationUnit().getLocationInfo( offset, length ); + locations = getTranslationUnit().getLocationInfo( offset, length ); + return locations; } /* (non-Javadoc) 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 f1b76603bd1..30c8a9b61bf 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 @@ -34,6 +34,7 @@ import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier; import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTExpressionList; import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement; +import org.eclipse.cdt.core.dom.ast.IASTFieldDeclarator; import org.eclipse.cdt.core.dom.ast.IASTFieldReference; import org.eclipse.cdt.core.dom.ast.IASTForStatement; import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression; @@ -1385,6 +1386,9 @@ public class CVisitor { if( mods[i].getConstantExpression() != null && !visitExpression( mods[i].getConstantExpression(), action ) ) return false; } + else if( declarator instanceof IASTFieldDeclarator ) + if( ! visitExpression( ((IASTFieldDeclarator) declarator).getBitFieldSize(), action ) ) return false; + return true; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java index b04fc179415..c24315e6758 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java @@ -1938,6 +1938,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { } else if (bitField != null) { IASTFieldDeclarator fl = createFieldDeclarator(); fl.setBitFieldSize(bitField); + bitField.setParent( fl ); + bitField.setPropertyInParent( IASTFieldDeclarator.FIELD_SIZE ); d = fl; } else { d = createDeclarator(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java index e99bf30534b..71296f124f8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java @@ -36,6 +36,7 @@ import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier; import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTExpressionList; import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement; +import org.eclipse.cdt.core.dom.ast.IASTFieldDeclarator; import org.eclipse.cdt.core.dom.ast.IASTFieldReference; import org.eclipse.cdt.core.dom.ast.IASTForStatement; import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression; @@ -938,6 +939,9 @@ public class CPPVisitor { if( declarator.getInitializer() != null ) if( !visitInitializer( declarator.getInitializer(), action ) ) return false; + if( declarator instanceof IASTFieldDeclarator ) + if( ! visitExpression( ((IASTFieldDeclarator) declarator).getBitFieldSize(), action ) ) return false; + return true; } diff --git a/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/CPopulateASTViewAction.java b/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/CPopulateASTViewAction.java index 5a29943a679..769bc0d9677 100644 --- a/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/CPopulateASTViewAction.java +++ b/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/CPopulateASTViewAction.java @@ -19,6 +19,7 @@ import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTInitializer; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; +import org.eclipse.cdt.core.dom.ast.IASTNodeLocation; import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration; import org.eclipse.cdt.core.dom.ast.IASTPointerOperator; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement; @@ -30,7 +31,6 @@ import org.eclipse.cdt.core.dom.ast.IASTTypeId; import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator; import org.eclipse.cdt.core.dom.ast.c.ICASTDesignatedInitializer; import org.eclipse.cdt.core.dom.ast.c.ICASTDesignator; -import org.eclipse.cdt.core.parser.ast.IASTDesignator; import org.eclipse.cdt.internal.core.dom.parser.ASTNode; import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction; @@ -59,9 +59,10 @@ public class CPopulateASTViewAction extends CBaseVisitorAction implements IPopul } private void addRoot(IASTNode node) { - if (!(node.getNodeLocations().length > 0 && - node.getNodeLocations()[0].getNodeOffset() >= 0 && - node.getNodeLocations()[0].getNodeLength() > 0)) + IASTNodeLocation[] nodeLocations = node.getNodeLocations(); + if (!(nodeLocations.length > 0 && + nodeLocations[0].getNodeOffset() >= 0 && + nodeLocations[0].getNodeLength() > 0)) return; TreeParent parent = root.findParentOfNode(node);