diff --git a/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/BitField.java b/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/BitField.java new file mode 100644 index 00000000000..d53cabe2c7c --- /dev/null +++ b/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/BitField.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (c) 2001 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v0.5 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v05.html + * + * Contributors: + * IBM Corp. - Rational Software - initial implementation + ******************************************************************************/ +package org.eclipse.cdt.internal.core.dom; + +/** + * @author jcamelon + * + */ +public class BitField implements IExpressionOwner { + + + public BitField( Declarator owner ) + { + ownerDeclarator= owner; + } + private final Declarator ownerDeclarator; + private Expression expression = null; + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.dom.IExpressionOwner#getExpression() + */ + public Expression getExpression() { + return expression; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.dom.IExpressionOwner#setExpression(org.eclipse.cdt.internal.core.dom.Expression) + */ + public void setExpression(Expression exp) { + expression = exp; + } + + /** + * @return + */ + public Declarator getOwnerDeclarator() { + return ownerDeclarator; + } + +} diff --git a/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/DOMBuilder.java b/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/DOMBuilder.java index fedd29f53e9..7ace71992e3 100644 --- a/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/DOMBuilder.java +++ b/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/DOMBuilder.java @@ -918,5 +918,20 @@ public class DOMBuilder implements IParserCallback public void expressionName(Object expression) { Expression e = (Expression)expression; e.add( currName ); } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.parser.IParserCallback#startBitfield(java.lang.Object) + */ + public Object startBitfield(Object declarator) { + return new BitField((Declarator)declarator); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.parser.IParserCallback#endBitfield(java.lang.Object) + */ + public void endBitfield(Object bitfield) { + BitField b = (BitField)bitfield; + b.getOwnerDeclarator().setBitField( b ); + } } \ No newline at end of file diff --git a/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/Declarator.java b/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/Declarator.java index 46f971a7a27..abb944d0d25 100644 --- a/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/Declarator.java +++ b/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/Declarator.java @@ -207,5 +207,21 @@ public class Declarator implements IExpressionOwner, IDeclaratorOwner { public IDeclaratorOwner getOwnerDeclarator() { return ownerDeclarator; } + + private BitField bitField = null; + + /** + * @return + */ + public BitField getBitField() { + return bitField; + } + + /** + * @param field + */ + public void setBitField(BitField field) { + bitField = field; + } } diff --git a/core/org.eclipse.cdt.core/parser/ChangeLog b/core/org.eclipse.cdt.core/parser/ChangeLog index bab30f5755a..ba814436a38 100644 --- a/core/org.eclipse.cdt.core/parser/ChangeLog +++ b/core/org.eclipse.cdt.core/parser/ChangeLog @@ -1,3 +1,8 @@ +2003-04-25 John Camelon + Fixed bug36852 - outline window doesn't show all functions + Fixed bug36764 - Bit fields cause parse errors + Fixed bug36702 - Parser error when having function pointers as parameters + 2003-04-24 John Camelon Fixed Bug36799 STL Testing: Parser fails on Variable Definition diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionEvaluator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionEvaluator.java index 89584f3f387..27748ef74dc 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionEvaluator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionEvaluator.java @@ -716,5 +716,19 @@ public class ExpressionEvaluator implements IParserCallback { currName.setEnd(lastToken); } - Name currName = null; + Name currName = null; + + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.parser.IParserCallback#startBitfield(java.lang.Object) + */ + public Object startBitfield(Object declarator) { + return null; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.parser.IParserCallback#endBitfield(java.lang.Object) + */ + public void endBitfield(Object bitfield) { + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/IParserCallback.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/IParserCallback.java index d6c3134ac0a..51322657359 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/IParserCallback.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/IParserCallback.java @@ -138,5 +138,8 @@ public interface IParserCallback { public void templateTypeParameterAbort( Object typeParm ); public void templateTypeParameterInitialTypeId( Object typeParm ); public void templateTypeParameterEnd( Object typeParm ); + + public Object startBitfield(Object declarator); + public void endBitfield(Object bitfield); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/NullParserCallback.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/NullParserCallback.java index 96693de616e..23986fdef94 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/NullParserCallback.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/NullParserCallback.java @@ -622,4 +622,17 @@ public class NullParserCallback implements IParserCallback { public void expressionName(Object expression) { } + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.parser.IParserCallback#startBitfield(java.lang.Object) + */ + public Object startBitfield(Object declarator) { + return null; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.parser.IParserCallback#endBitfield(java.lang.Object) + */ + public void endBitfield(Object bitfield) { + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java index fd9d57c26c5..e2aec3b4d5d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java @@ -891,13 +891,15 @@ c, quick); catch( Backtrack bt ) { elaboratedTypeSpecifier(decl); - return; + flags.setEncounteredTypename(true); + break; } } else { elaboratedTypeSpecifier(decl); - return; + flags.setEncounteredTypename(true); + break; } case Token.t_enum: if( !parm ) @@ -905,19 +907,21 @@ c, quick); try { enumSpecifier(decl); - return; + break; } catch( Backtrack bt ) { // this is an elaborated class specifier elaboratedTypeSpecifier(decl); - return; + flags.setEncounteredTypename(true); + break; } } else { elaboratedTypeSpecifier(decl); - return; + flags.setEncounteredTypename(true); + break; } default: break declSpecifiers; @@ -1428,6 +1432,16 @@ c, quick); try{ callback.arrayDeclaratorEnd( array );} catch( Exception e ) {} } continue; + case Token.tCOLON: + consume( Token.tCOLON ); + Object bitfield = null; + try{ bitfield = callback.startBitfield( declarator );} catch( Exception e ) {} + Object expression = null; + try{ expression = callback.expressionBegin( bitfield );} catch( Exception e ) {} + constantExpression(expression); + try{ callback.expressionEnd( expression ); } catch( Exception e ) {} + try{ callback.endBitfield( bitfield );} catch( Exception e ) {} + default: break; } @@ -2337,7 +2351,9 @@ c, quick); switch (type) { // TO DO: we need more literals... case Token.tINTEGER: + case Token.tFLOATINGPT: case Token.tSTRING: + case Token.tLSTRING: case Token.t_false: case Token.t_true: try{ callback.expressionTerminal(expression, consume());} catch( Exception e ) {} diff --git a/core/org.eclipse.cdt.ui.tests/ChangeLog b/core/org.eclipse.cdt.ui.tests/ChangeLog index 577d13a236e..472f0f88619 100644 --- a/core/org.eclipse.cdt.ui.tests/ChangeLog +++ b/core/org.eclipse.cdt.ui.tests/ChangeLog @@ -1,3 +1,8 @@ +2003-04-25 John Camelon + Added DOMTests::testBug36852(). + Added DOMTests::testBug36764(). + Moved DOMFailedTests::testBug36702() to DOMTests(). + 2003-04-24 John Camelon Moved fixed tests from FailedTests to DOMTests. Added DOMTests::testBug36799(). diff --git a/core/org.eclipse.cdt.ui.tests/failures/org/eclipse/cdt/core/parser/failedTests/DOMFailedTest.java b/core/org.eclipse.cdt.ui.tests/failures/org/eclipse/cdt/core/parser/failedTests/DOMFailedTest.java index 01fb02c49f3..bac1a3431b2 100644 --- a/core/org.eclipse.cdt.ui.tests/failures/org/eclipse/cdt/core/parser/failedTests/DOMFailedTest.java +++ b/core/org.eclipse.cdt.ui.tests/failures/org/eclipse/cdt/core/parser/failedTests/DOMFailedTest.java @@ -64,26 +64,4 @@ public class DOMFailedTest extends BaseDOMTest { failTest("FUNCTION_MACRO( 1, a );\n int i;"); } - public void testBug36702() throws Exception - { - Writer code = new StringWriter(); - code.write( "void mad_decoder_init(struct mad_decoder *, void *,\n" ); - code.write( " enum mad_flow (*)(void *, struct mad_stream *),\n" ); - code.write( " enum mad_flow (*)(void *, struct mad_header const *),\n" ); - code.write( " enum mad_flow (*)(void *,\n" ); - code.write( " struct mad_stream const *,\n" ); - code.write( " struct mad_frame *),\n" ); - code.write( " enum mad_flow (*)(void *,\n" ); - code.write( " struct mad_header const *,\n" ); - code.write( " struct mad_pcm *),\n" ); - code.write( " enum mad_flow (*)(void *,\n" ); - code.write( " struct mad_stream *,\n" ); - code.write( " struct mad_frame *),\n" ); - code.write( " enum mad_flow (*)(void *, void *, unsigned int *)\n" ); - code.write( ");\n" ); - - failTest( code.toString() ); - - } - } diff --git a/core/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/DOMTests.java b/core/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/DOMTests.java index 5e71fbbb7e8..6ed3ad7b81f 100644 --- a/core/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/DOMTests.java +++ b/core/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/DOMTests.java @@ -1654,5 +1654,44 @@ public class DOMTests extends BaseDOMTest { assertEquals( tu.getDeclarations().size(), 1 ); } + public void testBug36852() throws Exception + { + Writer code = new StringWriter(); + code.write( "int CBT::senseToAllRect( double id_standardQuot = DOSE, double id_minToleranz =15.0,\n" ); + code.write( "double id_maxToleranz = 15.0, unsigned int iui_minY = 0, \n" ); + code.write( "unsigned int iui_maxY = HEIGHT );\n" ); + TranslationUnit tu = parse( code.toString() ); + } + + public void testBug36764() throws Exception + { + TranslationUnit tu = parse( "struct{ int x : 4; int y : 8; };" ); + assertEquals( tu.getDeclarations().size(), 1 ); + assertEquals( ((ClassSpecifier)((SimpleDeclaration)tu.getDeclarations().get(0)).getTypeSpecifier()).getDeclarations().size(), 2 ); + } + + public void testBug36702() throws Exception + { + Writer code = new StringWriter(); + code.write( "void mad_decoder_init(struct mad_decoder *, void *,\n" ); + code.write( " enum mad_flow (*)(void *, struct mad_stream *),\n" ); + code.write( " enum mad_flow (*)(void *, struct mad_header const *),\n" ); + code.write( " enum mad_flow (*)(void *,\n" ); + code.write( " struct mad_stream const *,\n" ); + code.write( " struct mad_frame *),\n" ); + code.write( " enum mad_flow (*)(void *,\n" ); + code.write( " struct mad_header const *,\n" ); + code.write( " struct mad_pcm *),\n" ); + code.write( " enum mad_flow (*)(void *,\n" ); + code.write( " struct mad_stream *,\n" ); + code.write( " struct mad_frame *),\n" ); + code.write( " enum mad_flow (*)(void *, void *, unsigned int *)\n" ); + code.write( ");\n" ); + + TranslationUnit tu = parse( code.toString() ); + + } + + }